mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
212 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
155eb109a8 | ||
|
|
2903813765 | ||
|
|
0ab50f7208 | ||
|
|
701e015bfd | ||
|
|
1fb941a41b | ||
|
|
92151c6328 | ||
|
|
afac887850 | ||
|
|
a111693b6b | ||
|
|
ce9e5f5575 | ||
|
|
d13842e7de | ||
|
|
059e5010e6 | ||
|
|
65292a94a6 | ||
|
|
f303984aad | ||
|
|
7d5c4da7cf | ||
|
|
63988a515c | ||
|
|
9725b60d46 | ||
|
|
50c93f3d30 | ||
|
|
f14ca0c3f2 | ||
|
|
0c165cba76 | ||
|
|
2de1133012 | ||
|
|
12dc054e49 | ||
|
|
ebba4eea8e | ||
|
|
aa2fa89e6c | ||
|
|
7b0eee497e | ||
|
|
04008d9c3f | ||
|
|
11b1588105 | ||
|
|
7c81482248 | ||
|
|
f3f29bd383 | ||
|
|
0d0d22f96c | ||
|
|
7df5aa2e26 | ||
|
|
7cc4c37afb | ||
|
|
abe29a788a | ||
|
|
c5655bbd2e | ||
|
|
47e0045015 | ||
|
|
8f09cc8583 | ||
|
|
d6a0ac320b | ||
|
|
616d38c13a | ||
|
|
9e12908556 | ||
|
|
405cda6ee9 | ||
|
|
1b0322e51c | ||
|
|
4a308dcd9e | ||
|
|
fec396950b | ||
|
|
981af0565e | ||
|
|
1d215ef5f3 | ||
|
|
2b7cfde64f | ||
|
|
c783c42101 | ||
|
|
bddcfedead | ||
|
|
34e7438271 | ||
|
|
485ff6bc46 | ||
|
|
4ab9ab4772 | ||
|
|
a5ff477fc8 | ||
|
|
254570d006 | ||
|
|
681f20d540 | ||
|
|
fd87f6e2c3 | ||
|
|
2c12c6dce5 | ||
|
|
5619527fd3 | ||
|
|
8b1c3c3fc4 | ||
|
|
ec852c7682 | ||
|
|
5433c9ed6c | ||
|
|
2a2d51624b | ||
|
|
5fa908602f | ||
|
|
9da74f9654 | ||
|
|
dddb077b13 | ||
|
|
6107287c9a | ||
|
|
7dccbef6e3 | ||
|
|
d920a62be2 | ||
|
|
73f32b9ef7 | ||
|
|
2e5257bcc1 | ||
|
|
65b0b461ab | ||
|
|
e34601f578 | ||
|
|
fa01a3077b | ||
|
|
54f805a62d | ||
|
|
a05b282fad | ||
|
|
66f6bbde6c | ||
|
|
4054d9a190 | ||
|
|
c1112f0063 | ||
|
|
b62e922f32 | ||
|
|
3c53bed709 | ||
|
|
a2b6d71558 | ||
|
|
fdfceb9f5b | ||
|
|
d273daecfe | ||
|
|
92b75a1345 | ||
|
|
640795a771 | ||
|
|
cad265ebcd | ||
|
|
387c33fb4d | ||
|
|
77585de397 | ||
|
|
a9b06e4b35 | ||
|
|
7976ac78f2 | ||
|
|
208f8073ad | ||
|
|
009fb966a6 | ||
|
|
09fd9f86b9 | ||
|
|
2ff4ae0b4c | ||
|
|
aa0a195e98 | ||
|
|
87092e6849 | ||
|
|
89ced4166a | ||
|
|
6080099434 | ||
|
|
f3735c9036 | ||
|
|
2242e9a5e1 | ||
|
|
a12364d486 | ||
|
|
b133c2e3e3 | ||
|
|
0127d30fa8 | ||
|
|
9b13b2f872 | ||
|
|
40d903c2bc | ||
|
|
06016220c0 | ||
|
|
bb751d32ca | ||
|
|
6dc37f6cc9 | ||
|
|
5ff42799b2 | ||
|
|
2326e627b5 | ||
|
|
c18fe8098f | ||
|
|
a9ed8470b4 | ||
|
|
332087da61 | ||
|
|
56c43d7a74 | ||
|
|
649f390662 | ||
|
|
0818bbdf51 | ||
|
|
edd1517f85 | ||
|
|
d0c2e8233c | ||
|
|
87837aa074 | ||
|
|
62ab6c56c0 | ||
|
|
a2985aa444 | ||
|
|
7274cee153 | ||
|
|
79c44fdbfa | ||
|
|
c32e986497 | ||
|
|
b953fcf1bd | ||
|
|
c0a4c245f0 | ||
|
|
acc0885e52 | ||
|
|
f49e8f9991 | ||
|
|
d2e5a3cd5b | ||
|
|
a1485a14f6 | ||
|
|
271e3b15d6 | ||
|
|
74cf89a82f | ||
|
|
8698082411 | ||
|
|
799de548f4 | ||
|
|
671dae3e22 | ||
|
|
7e142132bf | ||
|
|
0ccd58da01 | ||
|
|
4211c230cc | ||
|
|
269bdb3dbd | ||
|
|
b032b803ca | ||
|
|
26a638e11d | ||
|
|
099522ada3 | ||
|
|
4903dd62ea | ||
|
|
95161f7776 | ||
|
|
f0942c13a1 | ||
|
|
8eddeb77d0 | ||
|
|
cbed29820b | ||
|
|
3ec6bad5b3 | ||
|
|
fefc3dc32d | ||
|
|
203d40208c | ||
|
|
c45445c613 | ||
|
|
73c6766806 | ||
|
|
65dff25ed5 | ||
|
|
c2584c0fe6 | ||
|
|
bd951f96be | ||
|
|
1200372ced | ||
|
|
75a5ca153d | ||
|
|
5a9593d9bc | ||
|
|
edf46aaf2b | ||
|
|
e2ba795603 | ||
|
|
5e6b566d6a | ||
|
|
c973768495 | ||
|
|
6d8e2cc92d | ||
|
|
010dda6a77 | ||
|
|
345c7307ef | ||
|
|
f485c928b1 | ||
|
|
e895fe884e | ||
|
|
18fe47d0c7 | ||
|
|
a84ebc4aaa | ||
|
|
5c35c4ef5d | ||
|
|
f79674f66a | ||
|
|
e40373a1fa | ||
|
|
47807b7955 | ||
|
|
38cb693834 | ||
|
|
7bcd7609eb | ||
|
|
90eb164a43 | ||
|
|
78b2e2d2cc | ||
|
|
e60e7b5750 | ||
|
|
c1331a1dd4 | ||
|
|
339adab783 | ||
|
|
7bf38a3062 | ||
|
|
99076be6bb | ||
|
|
eb332acd7e | ||
|
|
c67f7a14a1 | ||
|
|
83f6db1bf8 | ||
|
|
e493149a0a | ||
|
|
38019f0913 | ||
|
|
bc6b751429 | ||
|
|
be68d57499 | ||
|
|
1fb5f89eaa | ||
|
|
6470a91265 | ||
|
|
d4235b2431 | ||
|
|
0ef028244a | ||
|
|
a8543bc813 | ||
|
|
cf3888d734 | ||
|
|
b8e978862e | ||
|
|
dfba2072f7 | ||
|
|
2bf576c2cd | ||
|
|
3abf47f175 | ||
|
|
2fc51c67a3 | ||
|
|
34753546f2 | ||
|
|
1711db4fef | ||
|
|
373b8d216a | ||
|
|
7f9487fd62 | ||
|
|
686deb8eb1 | ||
|
|
a392ac3012 | ||
|
|
fabc655919 | ||
|
|
7eada03909 | ||
|
|
ad4a763d47 | ||
|
|
1f9765c5e5 | ||
|
|
b3a464bf89 | ||
|
|
69b5584f11 | ||
|
|
00523f0b89 | ||
|
|
31f313caff |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.h linguist-language=C
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -72,3 +72,7 @@ cglm-test-ios*
|
|||||||
/cglm.pc
|
/cglm.pc
|
||||||
test-driver
|
test-driver
|
||||||
Default-568h@2x.png
|
Default-568h@2x.png
|
||||||
|
build/
|
||||||
|
conftest.dir/*
|
||||||
|
confdefs.h
|
||||||
|
*.xcuserdatad
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- ppc64le
|
||||||
|
- s390x
|
||||||
|
- arm64
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
||||||
|
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
|
||||||
|
}
|
||||||
137
CMakeLists.txt
Normal file
137
CMakeLists.txt
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
project(cglm VERSION 0.8.2 LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||||
|
set(DEFAULT_BUILD_TYPE "Release")
|
||||||
|
|
||||||
|
set(CGLM_BUILD)
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF)
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF)
|
||||||
|
|
||||||
|
if(NOT CGLM_STATIC AND CGLM_SHARED)
|
||||||
|
set(CGLM_BUILD SHARED)
|
||||||
|
else(CGLM_STATIC)
|
||||||
|
set(CGLM_BUILD STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CGLM_USE_C99)
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
|
||||||
|
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
||||||
|
|
||||||
|
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
|
||||||
|
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
||||||
|
foreach(flag_var
|
||||||
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||||
|
endforeach(flag_var)
|
||||||
|
else()
|
||||||
|
add_compile_options(-Wall -Werror -O3)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
|
||||||
|
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
|
# Set the possible values of build type for cmake-gui
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
include(CPack)
|
||||||
|
|
||||||
|
# Target Start
|
||||||
|
add_library(${PROJECT_NAME}
|
||||||
|
${CGLM_BUILD}
|
||||||
|
src/euler.c
|
||||||
|
src/affine.c
|
||||||
|
src/io.c
|
||||||
|
src/quat.c
|
||||||
|
src/cam.c
|
||||||
|
src/vec2.c
|
||||||
|
src/vec3.c
|
||||||
|
src/vec4.c
|
||||||
|
src/mat2.c
|
||||||
|
src/mat3.c
|
||||||
|
src/mat4.c
|
||||||
|
src/plane.c
|
||||||
|
src/frustum.c
|
||||||
|
src/box.c
|
||||||
|
src/project.c
|
||||||
|
src/sphere.c
|
||||||
|
src/ease.c
|
||||||
|
src/curve.c
|
||||||
|
src/bezier.c
|
||||||
|
src/ray.c
|
||||||
|
src/affine2d.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CGLM_SHARED)
|
||||||
|
add_definitions(-DCGLM_EXPORTS)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||||
|
|
||||||
|
target_include_directories(${PROJECT_NAME}
|
||||||
|
PUBLIC
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
# Target for header-only usage
|
||||||
|
add_library(${PROJECT_NAME}_headers INTERFACE)
|
||||||
|
target_include_directories(${PROJECT_NAME}_headers INTERFACE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
# Test Configuration
|
||||||
|
if(CGLM_USE_TEST)
|
||||||
|
include(CTest)
|
||||||
|
enable_testing()
|
||||||
|
add_subdirectory(test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(TARGETS ${PROJECT_NAME}
|
||||||
|
EXPORT ${PROJECT_NAME}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
|
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
PATTERN ".*" EXCLUDE)
|
||||||
|
|
||||||
|
# Config
|
||||||
|
export(TARGETS ${PROJECT_NAME}
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
|
)
|
||||||
|
|
||||||
|
install(EXPORT ${PROJECT_NAME}
|
||||||
|
FILE "${PROJECT_NAME}Config.cmake"
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
|
|
||||||
|
set(PACKAGE_NAME ${PROJECT_NAME})
|
||||||
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
|
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||||
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
|
||||||
|
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
13
CREDITS
13
CREDITS
@@ -65,3 +65,16 @@ https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolati
|
|||||||
12. vec2 cross product
|
12. vec2 cross product
|
||||||
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
13. Ray triangle intersect
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
|
||||||
|
Authors:
|
||||||
|
Thomas Möller (tompa@clarus.se)
|
||||||
|
Ben Trumbore (wbt@graphics.cornell.edu)
|
||||||
|
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||||
|
|
||||||
|
14. ARM NEON: Matrix Vector Multiplication
|
||||||
|
https://stackoverflow.com/a/57793352/2676533
|
||||||
|
|
||||||
|
16. ARM NEON Div
|
||||||
|
|
||||||
|
http://github.com/microsoft/DirectXMath
|
||||||
|
|||||||
27
Makefile.am
27
Makefile.am
@@ -12,7 +12,6 @@ AM_CFLAGS = -Wall \
|
|||||||
-O3 \
|
-O3 \
|
||||||
-Wstrict-aliasing=2 \
|
-Wstrict-aliasing=2 \
|
||||||
-fstrict-aliasing \
|
-fstrict-aliasing \
|
||||||
-pedantic \
|
|
||||||
-Werror=strict-prototypes
|
-Werror=strict-prototypes
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcglm.la
|
lib_LTLIBRARIES = libcglm.la
|
||||||
@@ -22,7 +21,10 @@ checkLDFLAGS = -L./.libs \
|
|||||||
-lm \
|
-lm \
|
||||||
-lcglm
|
-lcglm
|
||||||
checkCFLAGS = $(AM_CFLAGS) \
|
checkCFLAGS = $(AM_CFLAGS) \
|
||||||
-I./include
|
-std=gnu11 \
|
||||||
|
-O3 \
|
||||||
|
-DCGLM_DEFINE_PRINTS \
|
||||||
|
-I./include
|
||||||
|
|
||||||
check_PROGRAMS = test/tests
|
check_PROGRAMS = test/tests
|
||||||
TESTS = $(check_PROGRAMS)
|
TESTS = $(check_PROGRAMS)
|
||||||
@@ -63,8 +65,10 @@ cglm_HEADERS = include/cglm/version.h \
|
|||||||
include/cglm/ease.h \
|
include/cglm/ease.h \
|
||||||
include/cglm/curve.h \
|
include/cglm/curve.h \
|
||||||
include/cglm/bezier.h \
|
include/cglm/bezier.h \
|
||||||
include/cglm/applesimd.h
|
include/cglm/applesimd.h \
|
||||||
|
include/cglm/ray.h \
|
||||||
|
include/cglm/affine2d.h
|
||||||
|
|
||||||
cglm_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 \
|
||||||
@@ -84,7 +88,9 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
|||||||
include/cglm/call/sphere.h \
|
include/cglm/call/sphere.h \
|
||||||
include/cglm/call/ease.h \
|
include/cglm/call/ease.h \
|
||||||
include/cglm/call/curve.h \
|
include/cglm/call/curve.h \
|
||||||
include/cglm/call/bezier.h
|
include/cglm/call/bezier.h \
|
||||||
|
include/cglm/call/ray.h \
|
||||||
|
include/cglm/call/affine2d.h
|
||||||
|
|
||||||
cglm_simddir=$(includedir)/cglm/simd
|
cglm_simddir=$(includedir)/cglm/simd
|
||||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||||
@@ -95,6 +101,7 @@ cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
|||||||
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||||
include/cglm/simd/sse2/mat4.h \
|
include/cglm/simd/sse2/mat4.h \
|
||||||
include/cglm/simd/sse2/mat3.h \
|
include/cglm/simd/sse2/mat3.h \
|
||||||
|
include/cglm/simd/sse2/mat2.h \
|
||||||
include/cglm/simd/sse2/quat.h
|
include/cglm/simd/sse2/quat.h
|
||||||
|
|
||||||
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
||||||
@@ -107,6 +114,7 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
|
|||||||
cglm_structdir=$(includedir)/cglm/struct
|
cglm_structdir=$(includedir)/cglm/struct
|
||||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||||
include/cglm/struct/mat3.h \
|
include/cglm/struct/mat3.h \
|
||||||
|
include/cglm/struct/mat2.h \
|
||||||
include/cglm/struct/vec2.h \
|
include/cglm/struct/vec2.h \
|
||||||
include/cglm/struct/vec2-ext.h \
|
include/cglm/struct/vec2-ext.h \
|
||||||
include/cglm/struct/vec3.h \
|
include/cglm/struct/vec3.h \
|
||||||
@@ -124,8 +132,9 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
|||||||
include/cglm/struct/project.h \
|
include/cglm/struct/project.h \
|
||||||
include/cglm/struct/sphere.h \
|
include/cglm/struct/sphere.h \
|
||||||
include/cglm/struct/color.h \
|
include/cglm/struct/color.h \
|
||||||
include/cglm/struct/curve.h
|
include/cglm/struct/curve.h \
|
||||||
|
include/cglm/struct/affine2d.h
|
||||||
|
|
||||||
libcglm_la_SOURCES=\
|
libcglm_la_SOURCES=\
|
||||||
src/euler.c \
|
src/euler.c \
|
||||||
src/affine.c \
|
src/affine.c \
|
||||||
@@ -145,7 +154,9 @@ libcglm_la_SOURCES=\
|
|||||||
src/sphere.c \
|
src/sphere.c \
|
||||||
src/ease.c \
|
src/ease.c \
|
||||||
src/curve.c \
|
src/curve.c \
|
||||||
src/bezier.c
|
src/bezier.c \
|
||||||
|
src/ray.c \
|
||||||
|
src/affine2d.c
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
test/runner.c \
|
test/runner.c \
|
||||||
|
|||||||
44
Package.swift
Normal file
44
Package.swift
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// swift-tools-version:5.2
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "cglm",
|
||||||
|
products: [
|
||||||
|
.library(name: "cglm", type: .static, targets: ["cglmHeader"]),
|
||||||
|
.library(name: "cglmc", targets: ["cglmCompiled"]),
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "cglmCompiled",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./src/swift",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
.target(
|
||||||
|
name: "cglmHeader",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src/swift",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
],
|
||||||
|
cLanguageStandard: .c11
|
||||||
|
)
|
||||||
117
README.md
117
README.md
@@ -25,6 +25,7 @@ you have the latest version
|
|||||||
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
||||||
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
||||||
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
||||||
|
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
|
||||||
|
|
||||||
#### 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:
|
||||||
@@ -89,6 +90,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
- curves
|
- curves
|
||||||
- curve interpolation helpers (S*M*C, deCasteljau...)
|
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||||
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||||
|
- ray intersection helpers
|
||||||
- and others...
|
- and others...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
@@ -148,6 +150,119 @@ The types used are actually unions that allow access to the same data multiple w
|
|||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
|
### CMake (All platforms)
|
||||||
|
```bash
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||||
|
$ make
|
||||||
|
$ sudo make install # [Optional]
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Cmake options with Defaults:
|
||||||
|
|
||||||
|
```CMake
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF) # C11
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Use as header-only library with your CMake project
|
||||||
|
|
||||||
|
This requires no building or installation of cglm.
|
||||||
|
|
||||||
|
* Example:
|
||||||
|
|
||||||
|
``` cmake
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm_headers)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Use with your CMake project
|
||||||
|
* Example:
|
||||||
|
```cmake
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/)
|
||||||
|
|
||||||
|
# or you can use find_package to configure cglm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Meson (All platforms)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ meson build # [Optional] --default-library=static
|
||||||
|
$ cd build
|
||||||
|
$ ninja
|
||||||
|
$ sudo ninja install # [Optional]
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Meson options with Defaults:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
c_std=c11
|
||||||
|
buildtype=release
|
||||||
|
default_library=shared
|
||||||
|
enable_tests=false # to run tests: ninja test
|
||||||
|
```
|
||||||
|
#### Use with your Meson project
|
||||||
|
* Example:
|
||||||
|
```meson
|
||||||
|
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||||
|
project('name', 'c')
|
||||||
|
|
||||||
|
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||||
|
|
||||||
|
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Swift (Swift Package Manager)
|
||||||
|
|
||||||
|
Currently only default build options are supported. Add **cglm** dependency to your project:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
...
|
||||||
|
Package(
|
||||||
|
...
|
||||||
|
dependencies: [
|
||||||
|
...
|
||||||
|
.package(url: "https://github.com/recp/cglm", .branch("master")),
|
||||||
|
]
|
||||||
|
...
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now add **cgml** as a dependency to your target. Product choices are:
|
||||||
|
- **cglm** for inlined version of the library which can be linked only statically
|
||||||
|
- **cglmc** for a compiled version of the library with no linking limitation
|
||||||
|
|
||||||
|
```swift
|
||||||
|
...
|
||||||
|
.target(
|
||||||
|
...
|
||||||
|
dependencies: [
|
||||||
|
...
|
||||||
|
.product(name: "cglm", package: "cglm"),
|
||||||
|
]
|
||||||
|
...
|
||||||
|
)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
### Unix (Autotools)
|
### Unix (Autotools)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -291,7 +406,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
|||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
||||||
|
|
||||||
|
|
||||||
## Backers
|
## Backers
|
||||||
|
|||||||
15
cglm.podspec
15
cglm.podspec
@@ -2,10 +2,10 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.6.1"
|
s.version = "0.8.1"
|
||||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
s.documentation_url = "http://cglm.readthedocs.io"
|
s.documentation_url = "http://cglm.readthedocs.io"
|
||||||
@@ -25,4 +25,13 @@ cglm is math library for graphics programming for C. It is similar to original g
|
|||||||
|
|
||||||
# Linking
|
# Linking
|
||||||
s.library = "m"
|
s.library = "m"
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
s.pod_target_xcconfig = {
|
||||||
|
'CLANG_ENABLE_MODULES' => 'NO',
|
||||||
|
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
||||||
|
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
|
||||||
|
'GCC_C_LANGUAGE_STANDARD' => 'gnu11',
|
||||||
|
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GLM_TESTS_NO_COLORFUL_OUTPUT'
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.7.0], [info@recp.me])
|
AC_INIT([cglm], [0.8.2], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||||
|
|
||||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transform matrix (specialized functions)
|
3D Affine Transform Matrix (specialized functions)
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine-mat.h
|
Header: cglm/affine-mat.h
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transforms
|
3D Affine Transforms
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine.h
|
Header: cglm/affine.h
|
||||||
@@ -45,6 +45,8 @@ The implementation would be:
|
|||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||||
|
|
||||||
|
.. _TransformsOrder:
|
||||||
|
|
||||||
Transforms Order
|
Transforms Order
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
140
docs/source/affine2d.rst
Normal file
140
docs/source/affine2d.rst
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
2D Affine Transforms
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/affine2d.h
|
||||||
|
|
||||||
|
2D Transforms uses `2d` suffix for naming. If there is no 2D suffix it is 3D function.
|
||||||
|
|
||||||
|
Initialize Transform Matrices
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Functions with **_make** prefix expect you don't have a matrix and they create
|
||||||
|
a matrix for you. You don't need to pass identity matrix.
|
||||||
|
|
||||||
|
But other functions expect you have a matrix and you want to transform them. If
|
||||||
|
you didn't have any existing matrix you have to initialize matrix to identity
|
||||||
|
before sending to transfrom functions.
|
||||||
|
|
||||||
|
Transforms Order
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
See :ref:`TransformsOrder` to read similar section.
|
||||||
|
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_translate2d`
|
||||||
|
#. :c:func:`glm_translate2d_to`
|
||||||
|
#. :c:func:`glm_translate2d_x`
|
||||||
|
#. :c:func:`glm_translate2d_y`
|
||||||
|
#. :c:func:`glm_translate2d_make`
|
||||||
|
#. :c:func:`glm_scale2d_to`
|
||||||
|
#. :c:func:`glm_scale2d_make`
|
||||||
|
#. :c:func:`glm_scale2d`
|
||||||
|
#. :c:func:`glm_scale2d_uni`
|
||||||
|
#. :c:func:`glm_rotate2d_make`
|
||||||
|
#. :c:func:`glm_rotate2d`
|
||||||
|
#. :c:func:`glm_rotate2d_to`
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
| *[out]* **dest** translated matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_x(mat3 m, float x)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by x factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **x** x factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_y(mat3 m, float y)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by y factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **y** y factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW translate 2d transform matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
scale existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
| *[out]* **dest** scaled matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW 2d scale matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
scales existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
|
||||||
|
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **s** scale factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
|
||||||
|
creates NEW rotation matrix by angle around *Z* axis
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d(mat3 m, float angle)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
| *[out]* **dest** rotated matrix
|
||||||
@@ -28,6 +28,7 @@ Follow the :doc:`build` documentation for this
|
|||||||
|
|
||||||
affine
|
affine
|
||||||
affine-mat
|
affine-mat
|
||||||
|
affine2d
|
||||||
cam
|
cam
|
||||||
frustum
|
frustum
|
||||||
box
|
box
|
||||||
@@ -51,3 +52,5 @@ Follow the :doc:`build` documentation for this
|
|||||||
sphere
|
sphere
|
||||||
curve
|
curve
|
||||||
bezier
|
bezier
|
||||||
|
version
|
||||||
|
ray
|
||||||
|
|||||||
@@ -7,6 +7,97 @@ Build cglm
|
|||||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||||
|
|
||||||
|
CMake (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||||
|
$ make
|
||||||
|
$ sudo make install # [Optional]
|
||||||
|
|
||||||
|
**make** will build cglm to **build** folder.
|
||||||
|
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
|
||||||
|
|
||||||
|
**CMake Options:**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF) # C11
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||||
|
|
||||||
|
**Use as header-only library with your CMake project example**
|
||||||
|
This requires no building or installation of cglm.
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm_headers)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
**Use with your CMake project example**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/)
|
||||||
|
|
||||||
|
Meson (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ meson build # [Optional] --default-library=static
|
||||||
|
$ cd build
|
||||||
|
$ ninja
|
||||||
|
$ sudo ninja install # [Optional]
|
||||||
|
|
||||||
|
**Meson Options:**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
c_std=c11
|
||||||
|
buildtype=release
|
||||||
|
default_library=shared
|
||||||
|
enable_tests=false # to run tests: ninja test
|
||||||
|
|
||||||
|
|
||||||
|
**Use with your Meson project**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||||
|
project('name', 'c')
|
||||||
|
|
||||||
|
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||||
|
|
||||||
|
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||||
|
|
||||||
|
|
||||||
Unix (Autotools):
|
Unix (Autotools):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
#
|
#
|
||||||
# needs_sphinx = '1.0'
|
# needs_sphinx = '3.0'
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.7.0'
|
version = u'0.8.2'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.7.0'
|
release = u'0.8.2'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -197,3 +197,7 @@ epub_exclude_files = ['search.html']
|
|||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
todo_include_todos = True
|
todo_include_todos = True
|
||||||
|
|
||||||
|
# -- Options for the C domain ------------------------------------------------
|
||||||
|
|
||||||
|
c_id_attributes = ['__restrict']
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
Features
|
Features
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
|
* array api and struct api, you can use arrays or structs.
|
||||||
* general purpose matrix operations (mat4, mat3)
|
* general purpose matrix operations (mat4, mat3)
|
||||||
* chain matrix multiplication (square only)
|
* chain matrix multiplication (square only)
|
||||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||||
* affine transforms
|
* affine transformations
|
||||||
* matrix decomposition (extract rotation, scaling factor)
|
* matrix decomposition (extract rotation, scaling factor)
|
||||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||||
* camera (lookat)
|
* camera (lookat)
|
||||||
@@ -20,4 +21,6 @@ Features
|
|||||||
* easing functions
|
* easing functions
|
||||||
* curves
|
* curves
|
||||||
* curve interpolation helpers (SMC, deCasteljau...)
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
* and other...
|
* helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||||
|
* ray intersection helpers
|
||||||
|
* and others...
|
||||||
|
|||||||
@@ -28,6 +28,23 @@ Example to print mat4 matrix:
|
|||||||
(you probably will in some cases), you can change it temporary.
|
(you probably will in some cases), you can change it temporary.
|
||||||
cglm may provide precision parameter in the future
|
cglm may provide precision parameter in the future
|
||||||
|
|
||||||
|
Changes since **v0.7.3**:
|
||||||
|
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print.
|
||||||
|
* Now values are colorful ;)
|
||||||
|
* Some print improvements
|
||||||
|
* New options with default values:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
#define CGLM_PRINT_PRECISION 5
|
||||||
|
#define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
|
||||||
|
* Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
|
||||||
|
Check options page.
|
||||||
|
|
||||||
Table of contents (click to go):
|
Table of contents (click to go):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -156,16 +156,22 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4 (left)
|
||||||
| *[in]* **v** vec4 (right, column vector)
|
| *[in]* **v** vec4 (right, column vector)
|
||||||
|
| *[in]* **last** 4th item to make it vec4
|
||||||
| *[out]* **dest** vec4 (result, column vector)
|
| *[out]* **dest** vec4 (result, column vector)
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
|
||||||
|
|
||||||
multiply vector with mat4's mat3 part(rotation)
|
| multiply **vec3** with **mat4** and get **vec3** as result
|
||||||
|
|
|
||||||
|
| actually the result is **vec4**, after multiplication,
|
||||||
|
the last component is trimmed, if you need the result's last component
|
||||||
|
then don't use this function and consider to use **glm_mat4_mulv()**
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4(affine transform)
|
||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3
|
||||||
| *[out]* **dest** vec3 (result, column vector)
|
| *[in]* **last** 4th item to make it vec4
|
||||||
|
| *[out]* **dest** result vector (vec3)
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_trace(mat4 m)
|
.. c:function:: void glm_mat4_trace(mat4 m)
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ versor: 16 byte
|
|||||||
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
||||||
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
||||||
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
||||||
to define it in build system. If you use pre-compiled verisons then you
|
to define it in build system. If you use pre-compiled versions then you
|
||||||
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
||||||
|
|
||||||
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
||||||
@@ -50,3 +50,36 @@ You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT
|
|||||||
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
||||||
|
|
||||||
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||||
|
|
||||||
|
Print Options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. **CGLM_DEFINE_PRINTS**
|
||||||
|
2. **CGLM_NO_PRINTS_NOOP** (use CGLM_DEFINE_PRINTS)
|
||||||
|
|
||||||
|
Inline prints are only enabled in **DEBUG** mode or if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
**glmc_** versions will always print too.
|
||||||
|
|
||||||
|
Because **cglm** tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs when we do not need them.
|
||||||
|
|
||||||
|
**cglm** checks **DEBUG** or **_DEBUG** macros to test debug mode, if these are not working for you then you can use
|
||||||
|
**CGLM_DEFINE_PRINTS** to force enable, or create a PR to introduce new macro to test against debugging mode.
|
||||||
|
|
||||||
|
If DEBUG mode is not enabled then print functions will be emptied to eliminate print function calls.
|
||||||
|
You can disable this feature too by defining **CGLM_DEFINE_PRINTS** macro top of cglm header
|
||||||
|
or in project/build settings...
|
||||||
|
|
||||||
|
3. **CGLM_PRINT_PRECISION** 5
|
||||||
|
|
||||||
|
precision.
|
||||||
|
|
||||||
|
4. **CGLM_PRINT_MAX_TO_SHORT** 1e5
|
||||||
|
|
||||||
|
if a number is greater than this value then %g will be used, since this is shorten print you won't be able to see high precision.
|
||||||
|
|
||||||
|
5. **CGLM_PRINT_COLOR** "\033[36m"
|
||||||
|
6. **CGLM_PRINT_COLOR_RESET** "\033[0m"
|
||||||
|
|
||||||
|
You can disable colorful print output by defining **CGLM_PRINT_COLOR** and **CGLM_PRINT_COLOR_RESET** as empty macro.
|
||||||
|
Because some terminals may not support colors.
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ Functions documentation
|
|||||||
| *[in]* **q** quaternion
|
| *[in]* **q** quaternion
|
||||||
| *[in]* **pivot** pivot
|
| *[in]* **pivot** pivot
|
||||||
|
|
||||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
|
||||||
|
|
||||||
| rotate NEW transform matrix using quaternion at pivot point
|
| rotate NEW transform matrix using quaternion at pivot point
|
||||||
| this creates rotation matrix, it assumes you don't have a matrix
|
| this creates rotation matrix, it assumes you don't have a matrix
|
||||||
|
|||||||
31
docs/source/ray.rst
Normal file
31
docs/source/ray.rst
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
ray
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/ray.h
|
||||||
|
|
||||||
|
This is for collision-checks used by ray-tracers and the like.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_ray_triangle`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)
|
||||||
|
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **origin** origin of ray
|
||||||
|
| *[in]* **direction** direction of ray
|
||||||
|
| *[in]* **v0** first vertex of triangle
|
||||||
|
| *[in]* **v1** second vertex of triangle
|
||||||
|
| *[in]* **v2** third vertex of triangle
|
||||||
|
| *[in, out]* **d** float pointer to save distance to intersection
|
||||||
|
| *[out]* **intersection** whether there is intersection
|
||||||
@@ -80,6 +80,19 @@ So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete f
|
|||||||
|
|
||||||
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
||||||
|
|
||||||
|
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This is similar issue with alignment. For instance if you compiled **cglm** with
|
||||||
|
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
|
||||||
|
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
|
||||||
|
then you probably get **BAD ACCESS** or similar...
|
||||||
|
|
||||||
|
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
|
||||||
|
and your project aligns that as 16 byte boundary...
|
||||||
|
|
||||||
|
Check alignment, supported vector extension or simd in **cglm** and linked projects...
|
||||||
|
|
||||||
Other Issues?
|
Other Issues?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ Functions:
|
|||||||
#. :c:func:`glm_max`
|
#. :c:func:`glm_max`
|
||||||
#. :c:func:`glm_clamp`
|
#. :c:func:`glm_clamp`
|
||||||
#. :c:func:`glm_lerp`
|
#. :c:func:`glm_lerp`
|
||||||
|
#. :c:func:`glm_swapf`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -146,7 +147,7 @@ Functions documentation
|
|||||||
| *[in]* **b** b
|
| *[in]* **b** b
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
true if a and b equals
|
true if a and b are equal
|
||||||
|
|
||||||
.. c:function:: float glm_percent(float from, float to, float current)
|
.. c:function:: float glm_percent(float from, float to, float current)
|
||||||
|
|
||||||
@@ -158,7 +159,7 @@ Functions documentation
|
|||||||
| *[in]* **current** value between from and to values
|
| *[in]* **current** value between from and to values
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
clamped normalized percent (0-100 in 0-1)
|
percentage of current value
|
||||||
|
|
||||||
.. c:function:: float glm_percentc(float from, float to, float current)
|
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||||
|
|
||||||
@@ -171,3 +172,11 @@ Functions documentation
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
clamped normalized percent (0-100 in 0-1)
|
clamped normalized percent (0-100 in 0-1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_swapf(float *a, float *b)
|
||||||
|
|
||||||
|
swap two float values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** float 1
|
||||||
|
| *[in]* **b** float 2
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ Functions:
|
|||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. c:function:: void glm_vec2(vec4 v4, vec2 dest)
|
.. c:function:: void glm_vec2(float * v, vec2 dest)
|
||||||
|
|
||||||
init vec2 using vec3
|
init vec2 using vec3 or vec4
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v3** vector3
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
| *[in]* **axis** axis vector (will be normalized)
|
| *[in]* **axis** axis vector (will be normalized)
|
||||||
| *[out]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
@@ -435,8 +435,8 @@ Functions documentation
|
|||||||
squared distance between two vectors
|
squared distance between two vectors
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **row1** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| squared distance (distance * distance)
|
| squared distance (distance * distance)
|
||||||
@@ -446,8 +446,8 @@ Functions documentation
|
|||||||
distance between two vectors
|
distance between two vectors
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **row1** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| distance
|
| distance
|
||||||
@@ -475,7 +475,7 @@ Functions documentation
|
|||||||
possible orthogonal/perpendicular vector
|
possible orthogonal/perpendicular vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
||||||
|
|||||||
15
docs/source/version.rst
Normal file
15
docs/source/version.rst
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
version
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/version.h
|
||||||
|
|
||||||
|
**cglm** uses semantic versioning (http://semver.org) which is MAJOR.MINOR.PATCH
|
||||||
|
|
||||||
|
| **CGLM_VERSION_MAJOR** is major number of the version.
|
||||||
|
| **CGLM_VERSION_MINOR** is minor number of the version.
|
||||||
|
| **CGLM_VERSION_PATCH** is patch number of the version.
|
||||||
|
|
||||||
|
every release increases these numbers. You can check existing version by
|
||||||
|
including `cglm/version.h`
|
||||||
@@ -26,6 +26,10 @@
|
|||||||
# include "simd/avx/affine.h"
|
# include "simd/avx/affine.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGLM_NEON_FP
|
||||||
|
# include "simd/neon/affine.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
||||||
*
|
*
|
||||||
@@ -49,6 +53,8 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
glm_mul_avx(m1, m2, dest);
|
glm_mul_avx(m1, m2, dest);
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mul_sse2(m1, m2, dest);
|
glm_mul_sse2(m1, m2, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mul_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||||
@@ -103,6 +109,8 @@ void
|
|||||||
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mul_rot_sse2(m1, m2, dest);
|
glm_mul_rot_sse2(m1, m2, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mul_rot_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||||
|
|||||||
@@ -40,10 +40,6 @@
|
|||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "affine-mat.h"
|
#include "affine-mat.h"
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by v vector
|
* @brief translate existing transform matrix by v vector
|
||||||
* and stores result in same matrix
|
* and stores result in same matrix
|
||||||
@@ -54,26 +50,22 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate(mat4 m, vec3 v) {
|
glm_translate(mat4 m, vec3 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
|
glmm_128 m0, m1, m2, m3;
|
||||||
|
|
||||||
|
m0 = glmm_load(m[0]);
|
||||||
|
m1 = glmm_load(m[1]);
|
||||||
|
m2 = glmm_load(m[2]);
|
||||||
|
m3 = glmm_load(m[3]);
|
||||||
|
|
||||||
glmm_store(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
glmm_fmadd(m0, glmm_set1(v[0]),
|
||||||
_mm_set1_ps(v[0])),
|
glmm_fmadd(m1, glmm_set1(v[1]),
|
||||||
_mm_mul_ps(glmm_load(m[1]),
|
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
|
||||||
_mm_set1_ps(v[1]))),
|
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
|
||||||
_mm_set1_ps(v[2])),
|
|
||||||
glmm_load(m[3]))))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1, v2, v3;
|
glm_vec4_muladds(m[0], v[0], m[3]);
|
||||||
|
glm_vec4_muladds(m[1], v[1], m[3]);
|
||||||
glm_vec4_scale(m[0], v[0], v1);
|
glm_vec4_muladds(m[2], v[2], m[3]);
|
||||||
glm_vec4_scale(m[1], v[1], v2);
|
|
||||||
glm_vec4_scale(m[2], v[2], v3);
|
|
||||||
|
|
||||||
glm_vec4_add(v1, m[3], m[3]);
|
|
||||||
glm_vec4_add(v2, m[3], m[3]);
|
|
||||||
glm_vec4_add(v3, m[3], m[3]);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,12 +95,8 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_x(mat4 m, float x) {
|
glm_translate_x(mat4 m, float x) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[0]), glmm_set1(x), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
|
||||||
_mm_set1_ps(x)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[0], x, v1);
|
glm_vec4_scale(m[0], x, v1);
|
||||||
@@ -125,12 +113,8 @@ glm_translate_x(mat4 m, float x) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_y(mat4 m, float y) {
|
glm_translate_y(mat4 m, float y) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[1]), glmm_set1(y), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[1]),
|
|
||||||
_mm_set1_ps(y)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[1], y, v1);
|
glm_vec4_scale(m[1], y, v1);
|
||||||
@@ -147,12 +131,8 @@ glm_translate_y(mat4 m, float y) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_z(mat4 m, float z) {
|
glm_translate_z(mat4 m, float z) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[2]), glmm_set1(z), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
|
||||||
_mm_set1_ps(z)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[2], z, v1);
|
glm_vec4_scale(m[2], z, v1);
|
||||||
@@ -459,7 +439,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
|||||||
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
||||||
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
||||||
|
|
||||||
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
/* Note from Apple Open Source (assume that the matrix is orthonormal):
|
||||||
check for a coordinate system flip. If the determinant
|
check for a coordinate system flip. If the determinant
|
||||||
is -1, then negate the matrix and the scaling factors. */
|
is -1, then negate the matrix and the scaling factors. */
|
||||||
glm_vec3_cross(m[0], m[1], v);
|
glm_vec3_cross(m[0], m[1], v);
|
||||||
|
|||||||
268
include/cglm/affine2d.h
Normal file
268
include/cglm/affine2d.h
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_translate2d_x(mat3 m, float x)
|
||||||
|
CGLM_INLINE void glm_translate2d_y(mat3 m, float y)
|
||||||
|
CGLM_INLINE void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
CGLM_INLINE void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_affine2d_h
|
||||||
|
#define cglm_affine2d_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d(mat3 m, vec2 v) {
|
||||||
|
m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* source matrix will remain same
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
* @param[out] dest translated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
glm_mat3_copy(m, dest);
|
||||||
|
glm_translate2d(dest, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by x factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] x x factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_x(mat3 m, float x) {
|
||||||
|
m[2][0] = m[0][0] * x + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * x + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * x + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by y factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] y y factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_y(mat3 m, float y) {
|
||||||
|
m[2][0] = m[1][0] * y + m[2][0];
|
||||||
|
m[2][1] = m[1][1] * y + m[2][1];
|
||||||
|
m[2][2] = m[1][2] * y + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW translate 2d transform matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[2][0] = v[0];
|
||||||
|
m[2][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
* @param[out] dest scaled matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
dest[0][0] = m[0][0] * v[0];
|
||||||
|
dest[0][1] = m[0][1] * v[0];
|
||||||
|
dest[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
dest[1][0] = m[1][0] * v[1];
|
||||||
|
dest[1][1] = m[1][1] * v[1];
|
||||||
|
dest[1][2] = m[1][2] * v[1];
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW 2d scale matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[0][0] = v[0];
|
||||||
|
m[1][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scales existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d(mat3 m, vec2 v) {
|
||||||
|
m[0][0] = m[0][0] * v[0];
|
||||||
|
m[0][1] = m[0][1] * v[0];
|
||||||
|
m[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * v[1];
|
||||||
|
m[1][1] = m[1][1] * v[1];
|
||||||
|
m[1][2] = m[1][2] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] s scale factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_uni(mat3 m, float s) {
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[0][2] = m[0][2] * s;
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
m[1][2] = m[1][2] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW rotation matrix by angle around Z axis
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_make(mat3 m, float angle) {
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = c;
|
||||||
|
m[0][1] = s;
|
||||||
|
m[0][2] = 0;
|
||||||
|
|
||||||
|
m[1][0] = -s;
|
||||||
|
m[1][1] = c;
|
||||||
|
m[1][2] = 0;
|
||||||
|
|
||||||
|
m[2][0] = 0.0f;
|
||||||
|
m[2][1] = 0.0f;
|
||||||
|
m[2][2] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||||
|
* and store result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d(mat3 m, float angle) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = m00 * c + m10 * s;
|
||||||
|
m[0][1] = m01 * c + m11 * s;
|
||||||
|
m[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
m[1][0] = m00 * -s + m10 * c;
|
||||||
|
m[1][1] = m01 * -s + m11 * c;
|
||||||
|
m[1][2] = m02 * -s + m12 * c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_to(mat3 m, float angle, mat3 dest) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
dest[0][0] = m00 * c + m10 * s;
|
||||||
|
dest[0][1] = m01 * c + m11 * s;
|
||||||
|
dest[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
dest[1][0] = m00 * -s + m10 * c;
|
||||||
|
dest[1][1] = m01 * -s + m11 * c;
|
||||||
|
dest[1][2] = m02 * -s + m12 * c;
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_affine2d_h */
|
||||||
@@ -228,6 +228,8 @@ glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
|
|||||||
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
* Solid Box - Solid Sphere test.
|
* Solid Box - Solid Sphere test.
|
||||||
*
|
*
|
||||||
|
* Sphere Representation in cglm: [center.x, center.y, center.z, radii]
|
||||||
|
*
|
||||||
* @param[in] box solid bounding box
|
* @param[in] box solid bounding box
|
||||||
* @param[in] s solid sphere
|
* @param[in] s solid sphere
|
||||||
*/
|
*/
|
||||||
@@ -237,13 +239,13 @@ glm_aabb_sphere(vec3 box[2], vec4 s) {
|
|||||||
float dmin;
|
float dmin;
|
||||||
int a, b, c;
|
int a, b, c;
|
||||||
|
|
||||||
a = s[0] >= box[0][0];
|
a = (s[0] < box[0][0]) + (s[0] > box[1][0]);
|
||||||
b = s[1] >= box[0][1];
|
b = (s[1] < box[0][1]) + (s[1] > box[1][1]);
|
||||||
c = s[2] >= box[0][2];
|
c = (s[2] < box[0][2]) + (s[2] > box[1][2]);
|
||||||
|
|
||||||
dmin = glm_pow2(s[0] - box[a][0])
|
dmin = glm_pow2((s[0] - box[!(a - 1)][0]) * (a != 0))
|
||||||
+ glm_pow2(s[1] - box[b][1])
|
+ glm_pow2((s[1] - box[!(b - 1)][1]) * (b != 0))
|
||||||
+ glm_pow2(s[2] - box[c][2]);
|
+ glm_pow2((s[2] - box[!(c - 1)][2]) * (c != 0));
|
||||||
|
|
||||||
return dmin <= glm_pow2(s[3]);
|
return dmin <= glm_pow2(s[3]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ extern "C" {
|
|||||||
#include "call/ease.h"
|
#include "call/ease.h"
|
||||||
#include "call/curve.h"
|
#include "call/curve.h"
|
||||||
#include "call/bezier.h"
|
#include "call/bezier.h"
|
||||||
|
#include "call/ray.h"
|
||||||
|
#include "call/affine2d.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
67
include/cglm/call/affine2d.h
Normal file
67
include/cglm/call/affine2d.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_affine2d_h
|
||||||
|
#define cglmc_affine2d_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_x(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_y(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_uni(mat3 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_make(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_to(mat3 m, float angle, mat3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_affine2d_h */
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#ifndef cglmc_io_h
|
#ifndef cglmc_io_h
|
||||||
#define cglmc_io_h
|
#define cglmc_io_h
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
27
include/cglm/call/ray.h
Normal file
27
include/cglm/call/ray.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ray_h
|
||||||
|
#define cglmc_ray_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ray_h */
|
||||||
@@ -30,5 +30,7 @@
|
|||||||
#include "ease.h"
|
#include "ease.h"
|
||||||
#include "curve.h"
|
#include "curve.h"
|
||||||
#include "bezier.h"
|
#include "bezier.h"
|
||||||
|
#include "ray.h"
|
||||||
|
#include "affine2d.h"
|
||||||
|
|
||||||
#endif /* cglm_h */
|
#endif /* cglm_h */
|
||||||
|
|||||||
@@ -8,7 +8,13 @@
|
|||||||
#ifndef cglm_common_h
|
#ifndef cglm_common_h
|
||||||
#define cglm_common_h
|
#define cglm_common_h
|
||||||
|
|
||||||
#define _USE_MATH_DEFINES /* for windows */
|
#ifndef _USE_MATH_DEFINES
|
||||||
|
# define _USE_MATH_DEFINES /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
# define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@@ -17,7 +23,9 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_DLL
|
# ifdef CGLM_STATIC
|
||||||
|
# define CGLM_EXPORT
|
||||||
|
# elif defined(CGLM_EXPORTS)
|
||||||
# define CGLM_EXPORT __declspec(dllexport)
|
# define CGLM_EXPORT __declspec(dllexport)
|
||||||
# else
|
# else
|
||||||
# define CGLM_EXPORT __declspec(dllimport)
|
# define CGLM_EXPORT __declspec(dllimport)
|
||||||
@@ -34,4 +42,12 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
#ifndef CGLM_USE_DEFAULT_EPSILON
|
||||||
|
# ifndef GLM_FLT_EPSILON
|
||||||
|
# define GLM_FLT_EPSILON 1e-6
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* cglm_common_h */
|
#endif /* cglm_common_h */
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ typedef enum glm_euler_seq {
|
|||||||
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
||||||
} glm_euler_seq;
|
} glm_euler_seq;
|
||||||
|
|
||||||
typedef glm_euler_seq glm_euler_sq;
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
glm_euler_seq
|
glm_euler_seq
|
||||||
glm_euler_order(int ord[3]) {
|
glm_euler_order(int ord[3]) {
|
||||||
|
|||||||
@@ -15,69 +15,130 @@
|
|||||||
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
cglm tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs.
|
||||||
|
|
||||||
|
if you need to force enable then define CGLM_DEFINE_PRINTS macro not DEBUG one
|
||||||
|
|
||||||
|
Print functions are enabled if:
|
||||||
|
|
||||||
|
- DEBUG or _DEBUG macro is defined (mostly defined automatically in debugging)
|
||||||
|
- CGLM_DEFINE_PRINTS macro is defined including release/production
|
||||||
|
which makes enabled printing always
|
||||||
|
- glmc_ calls for io are always prints
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* DEPRECATED: CGLM_NO_PRINTS_NOOP (use CGLM_DEFINE_PRINTS) */
|
||||||
|
|
||||||
#ifndef cglm_io_h
|
#ifndef cglm_io_h
|
||||||
#define cglm_io_h
|
#define cglm_io_h
|
||||||
|
#if defined(DEBUG) || defined(_DEBUG) \
|
||||||
|
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \
|
||||||
|
|| defined(CGLM_NO_PRINTS_NOOP)
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_PRECISION
|
||||||
|
# define CGLM_PRINT_PRECISION 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_MAX_TO_SHORT
|
||||||
|
# define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR
|
||||||
|
# define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR_RESET
|
||||||
|
# define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_print(mat4 matrix,
|
glm_mat4_print(mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
#define n 4
|
#define n 4
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = cw[3] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat3_print(mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
#define n 3
|
#define n 3
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
@@ -87,27 +148,39 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_mat2_print(mat2 matrix,
|
glm_mat2_print(mat2 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 2
|
#define m 2
|
||||||
#define n 2
|
#define n 2
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
@@ -121,16 +194,16 @@ glm_vec4_print(vec4 vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -143,16 +216,16 @@ glm_vec3_print(vec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -165,16 +238,12 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++)
|
||||||
fprintf(ostream, "%d", vec[i]);
|
fprintf(ostream, " % d", vec[i]);
|
||||||
|
|
||||||
if (i != m - 1)
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
fprintf(ostream, "\t");
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -187,16 +256,16 @@ glm_vec2_print(vec2 vec,
|
|||||||
|
|
||||||
#define m 2
|
#define m 2
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -209,16 +278,17 @@ glm_versor_print(versor vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Versor (float%d):\n\t|", m);
|
fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
|
||||||
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -232,24 +302,43 @@ glm_aabb_print(vec3 bbox[2],
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float");
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
fprintf(ostream, "\t|");
|
fprintf(ostream, " (");
|
||||||
|
|
||||||
for (j = 0; j < m; j++) {
|
for (j = 0; j < m; j++) {
|
||||||
fprintf(ostream, "%0.4f", bbox[i][j]);
|
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
||||||
if (j != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", bbox[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
fprintf(ostream, " )\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* NOOP: Remove print from DEBUG */
|
||||||
|
#define glm_mat4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_ivec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_versor_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif /* cglm_io_h */
|
#endif /* cglm_io_h */
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat2_copy(mat2 mat, mat2 dest) {
|
glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
glm_vec4_copy(mat[0], dest[0]);
|
glm_vec4_ucopy(mat[0], dest[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -216,7 +216,16 @@ glm_mat2_trace(mat2 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat2_scale(mat2 m, float s) {
|
glm_mat2_scale(mat2 m, float s) {
|
||||||
glm_vec4_scale(m[0], s, m[0]);
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), vdupq_n_f32(s)));
|
||||||
|
#else
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -228,9 +228,11 @@ glm_mat3_transpose(mat3 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
||||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
vec3 res;
|
||||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
||||||
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||||
|
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||||
|
glm_vec3_copy(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -358,6 +358,8 @@ void
|
|||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mulv_sse2(m, v, dest);
|
glm_mat4_mulv_sse2(m, v, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_mulv_neon(m, v, dest);
|
||||||
#else
|
#else
|
||||||
vec4 res;
|
vec4 res;
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
||||||
@@ -476,6 +478,8 @@ void
|
|||||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, dest);
|
glm_mat4_transp_sse2(m, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, dest);
|
||||||
#else
|
#else
|
||||||
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
||||||
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
||||||
@@ -498,6 +502,8 @@ void
|
|||||||
glm_mat4_transpose(mat4 m) {
|
glm_mat4_transpose(mat4 m) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, m);
|
glm_mat4_transp_sse2(m, m);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, m);
|
||||||
#else
|
#else
|
||||||
mat4 d;
|
mat4 d;
|
||||||
glm_mat4_transpose_to(m, d);
|
glm_mat4_transpose_to(m, d);
|
||||||
@@ -533,15 +539,12 @@ glm_mat4_scale_p(mat4 m, float s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_scale(mat4 m, float s) {
|
glm_mat4_scale(mat4 m, float s) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#ifdef __AVX__
|
||||||
|
glm_mat4_scale_avx(m, s);
|
||||||
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_scale_sse2(m, s);
|
glm_mat4_scale_sse2(m, s);
|
||||||
#elif defined(CGLM_NEON_FP)
|
#elif defined(CGLM_NEON_FP)
|
||||||
float32x4_t v0;
|
glm_mat4_scale_neon(m, s);
|
||||||
v0 = vdupq_n_f32(s);
|
|
||||||
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
|
||||||
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
|
||||||
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
|
||||||
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
|
||||||
#else
|
#else
|
||||||
glm_mat4_scale_p(m, s);
|
glm_mat4_scale_p(m, s);
|
||||||
#endif
|
#endif
|
||||||
@@ -559,6 +562,8 @@ float
|
|||||||
glm_mat4_det(mat4 mat) {
|
glm_mat4_det(mat4 mat) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
return glm_mat4_det_sse2(mat);
|
return glm_mat4_det_sse2(mat);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
return glm_mat4_det_neon(mat);
|
||||||
#else
|
#else
|
||||||
/* [square] det(A) = det(At) */
|
/* [square] det(A) = det(At) */
|
||||||
float t[6];
|
float t[6];
|
||||||
@@ -592,6 +597,8 @@ void
|
|||||||
glm_mat4_inv(mat4 mat, mat4 dest) {
|
glm_mat4_inv(mat4 mat, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_inv_sse2(mat, dest);
|
glm_mat4_inv_sse2(mat, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_inv_neon(mat, dest);
|
||||||
#else
|
#else
|
||||||
float t[6];
|
float t[6];
|
||||||
float det;
|
float det;
|
||||||
|
|||||||
@@ -63,10 +63,6 @@
|
|||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_mat4_identity(mat4 mat);
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
|
|||||||
77
include/cglm/ray.h
Normal file
77
include/cglm/ray.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE bool glm_line_triangle_intersect(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ray_h
|
||||||
|
#define cglm_ray_h
|
||||||
|
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
*
|
||||||
|
* @param[in] origin origin of ray
|
||||||
|
* @param[in] direction direction of ray
|
||||||
|
* @param[in] v0 first vertex of triangle
|
||||||
|
* @param[in] v1 second vertex of triangle
|
||||||
|
* @param[in] v2 third vertex of triangle
|
||||||
|
* @param[in, out] d distance to intersection
|
||||||
|
* @return whether there is intersection
|
||||||
|
*/
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d) {
|
||||||
|
vec3 edge1, edge2, p, t, q;
|
||||||
|
float det, inv_det, u, v, dist;
|
||||||
|
const float epsilon = 0.000001f;
|
||||||
|
|
||||||
|
glm_vec3_sub(v1, v0, edge1);
|
||||||
|
glm_vec3_sub(v2, v0, edge2);
|
||||||
|
glm_vec3_cross(direction, edge2, p);
|
||||||
|
|
||||||
|
det = glm_vec3_dot(edge1, p);
|
||||||
|
if (det > -epsilon && det < epsilon)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
inv_det = 1.0f / det;
|
||||||
|
|
||||||
|
glm_vec3_sub(origin, v0, t);
|
||||||
|
|
||||||
|
u = inv_det * glm_vec3_dot(t, p);
|
||||||
|
if (u < 0.0f || u > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
glm_vec3_cross(t, edge1, q);
|
||||||
|
|
||||||
|
v = inv_det * glm_vec3_dot(direction, q);
|
||||||
|
if (v < 0.0f || u + v > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dist = inv_det * glm_vec3_dot(edge2, q);
|
||||||
|
|
||||||
|
if (d)
|
||||||
|
*d = dist;
|
||||||
|
|
||||||
|
return dist > epsilon;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -10,19 +10,42 @@
|
|||||||
#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)))
|
||||||
|
|
||||||
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) {
|
||||||
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
|
return vaddq_f32(v, vcombine_f32(vget_high_f32(v), vget_low_f32(v)));
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
float
|
float
|
||||||
glmm_hadd(float32x4_t v) {
|
glmm_hadd(float32x4_t v) {
|
||||||
#if defined(__aarch64__)
|
#if CGLM_ARM64
|
||||||
return vaddvq_f32(v);
|
return vaddvq_f32(v);
|
||||||
#else
|
#else
|
||||||
v = vaddq_f32(v, vrev64q_f32(v));
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
@@ -79,5 +102,58 @@ glmm_norm_inf(float32x4_t a) {
|
|||||||
return glmm_hmax(glmm_abs(a));
|
return glmm_hmax(glmm_abs(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_div(float32x4_t a, float32x4_t b) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vdivq_f32(a, b);
|
||||||
|
#else
|
||||||
|
/* 2 iterations of Newton-Raphson refinement of reciprocal */
|
||||||
|
float32x4_t r0, r1;
|
||||||
|
r0 = vrecpeq_f32(b);
|
||||||
|
r1 = vrecpsq_f32(r0, b);
|
||||||
|
r0 = vmulq_f32(r1, r0);
|
||||||
|
r1 = vrecpsq_f32(r0, b);
|
||||||
|
r0 = vmulq_f32(r1, r0);
|
||||||
|
return vmulq_f32(a, r0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmaq_f32(c, a, b); /* why vfmaq_f32 is slower than vmlaq_f32 ??? */
|
||||||
|
#else
|
||||||
|
return vmlaq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
return vsubq_f32(vdupq_n_f32(0.0f), glmm_fmadd(a, b, c));
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_simd_arm_h */
|
#endif /* cglm_simd_arm_h */
|
||||||
|
|||||||
@@ -14,6 +14,16 @@
|
|||||||
|
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_avx(mat4 m, float s) {
|
||||||
|
__m256 y0;
|
||||||
|
y0 = _mm256_set1_ps(s);
|
||||||
|
|
||||||
|
glmm_store256(m[0], _mm256_mul_ps(y0, glmm_load256(m[0])));
|
||||||
|
glmm_store256(m[2], _mm256_mul_ps(y0, glmm_load256(m[2])));
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
|
|||||||
80
include/cglm/simd/neon/affine.h
Normal file
80
include/cglm/simd/neon/affine.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* 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 l0, l1, l2, l3, r0, r1, r2, r3, v0, v1, v2, v3;
|
||||||
|
|
||||||
|
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 = vmulq_f32(glmm_splat_x(r0), l0);
|
||||||
|
v1 = vmulq_f32(glmm_splat_x(r1), l0);
|
||||||
|
v2 = vmulq_f32(glmm_splat_x(r2), l0);
|
||||||
|
v3 = vmulq_f32(glmm_splat_x(r3), l0);
|
||||||
|
|
||||||
|
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
|
||||||
|
v3 = glmm_fmadd(glmm_splat_y(r3), l1, v3);
|
||||||
|
|
||||||
|
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
|
||||||
|
v3 = glmm_fmadd(glmm_splat_z(r3), l2, v3);
|
||||||
|
|
||||||
|
v3 = glmm_fmadd(glmm_splat_w(r3), l3, 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 l0, l1, l2, r0, r1, r2, v0, v1, v2;
|
||||||
|
|
||||||
|
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]);
|
||||||
|
|
||||||
|
v0 = vmulq_f32(glmm_splat_x(r0), l0);
|
||||||
|
v1 = vmulq_f32(glmm_splat_x(r1), l0);
|
||||||
|
v2 = vmulq_f32(glmm_splat_x(r2), l0);
|
||||||
|
|
||||||
|
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
|
||||||
|
|
||||||
|
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], glmm_load(m1[3]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_affine_neon_h */
|
||||||
@@ -12,45 +12,301 @@
|
|||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
#include "../intrin.h"
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_neon(mat4 m, float s) {
|
||||||
|
float32x4_t v0;
|
||||||
|
|
||||||
|
v0 = vdupq_n_f32(s);
|
||||||
|
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||||
|
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||||
|
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||||
|
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_transp_neon(mat4 m, mat4 dest) {
|
||||||
|
float32x4x4_t vmat;
|
||||||
|
|
||||||
|
vmat = vld4q_f32(m[0]);
|
||||||
|
|
||||||
|
vst1q_f32(dest[0], vmat.val[0]);
|
||||||
|
vst1q_f32(dest[1], vmat.val[1]);
|
||||||
|
vst1q_f32(dest[2], vmat.val[2]);
|
||||||
|
vst1q_f32(dest[3], vmat.val[3]);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
|
|
||||||
|
|
||||||
l0 = vld1q_f32(m2[0]);
|
glmm_128 l0, l1, l2, l3, r0, r1, r2, r3, v0, v1, v2, v3;
|
||||||
l1 = vld1q_f32(m2[1]);
|
|
||||||
l2 = vld1q_f32(m2[2]);
|
|
||||||
l3 = vld1q_f32(m2[3]);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[0]);
|
l0 = glmm_load(m1[0]); r0 = glmm_load(m2[0]);
|
||||||
d0 = vmulq_lane_f32(r, vget_low_f32(l0), 0);
|
l1 = glmm_load(m1[1]); r1 = glmm_load(m2[1]);
|
||||||
d1 = vmulq_lane_f32(r, vget_low_f32(l1), 0);
|
l2 = glmm_load(m1[2]); r2 = glmm_load(m2[2]);
|
||||||
d2 = vmulq_lane_f32(r, vget_low_f32(l2), 0);
|
l3 = glmm_load(m1[3]); r3 = glmm_load(m2[3]);
|
||||||
d3 = vmulq_lane_f32(r, vget_low_f32(l3), 0);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[1]);
|
v0 = vmulq_f32(glmm_splat_x(r0), l0);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_low_f32(l0), 1);
|
v1 = vmulq_f32(glmm_splat_x(r1), l0);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_low_f32(l1), 1);
|
v2 = vmulq_f32(glmm_splat_x(r2), l0);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_low_f32(l2), 1);
|
v3 = vmulq_f32(glmm_splat_x(r3), l0);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_low_f32(l3), 1);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[2]);
|
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 0);
|
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 0);
|
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 0);
|
v3 = glmm_fmadd(glmm_splat_y(r3), l1, v3);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 0);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[3]);
|
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 1);
|
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 1);
|
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 1);
|
v3 = glmm_fmadd(glmm_splat_z(r3), l2, v3);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 1);
|
|
||||||
|
|
||||||
vst1q_f32(dest[0], d0);
|
v0 = glmm_fmadd(glmm_splat_w(r0), l3, v0);
|
||||||
vst1q_f32(dest[1], d1);
|
v1 = glmm_fmadd(glmm_splat_w(r1), l3, v1);
|
||||||
vst1q_f32(dest[2], d2);
|
v2 = glmm_fmadd(glmm_splat_w(r2), l3, v2);
|
||||||
vst1q_f32(dest[3], d3);
|
v3 = glmm_fmadd(glmm_splat_w(r3), l3, v3);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], v3);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
|
||||||
|
float32x4_t l0, l1, l2, l3;
|
||||||
|
float32x2_t vlo, vhi;
|
||||||
|
|
||||||
|
l0 = vld1q_f32(m[0]);
|
||||||
|
l1 = vld1q_f32(m[1]);
|
||||||
|
l2 = vld1q_f32(m[2]);
|
||||||
|
l3 = vld1q_f32(m[3]);
|
||||||
|
|
||||||
|
vlo = vld1_f32(&v[0]);
|
||||||
|
vhi = vld1_f32(&v[2]);
|
||||||
|
|
||||||
|
l0 = vmulq_lane_f32(l0, vlo, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l1, vlo, 1);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l2, vhi, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l3, vhi, 1);
|
||||||
|
|
||||||
|
vst1q_f32(dest, l0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_det_neon(mat4 mat) {
|
||||||
|
float32x4_t r0, r1, r2, r3, x0, x1, x2;
|
||||||
|
float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34;
|
||||||
|
float32x4x2_t a1;
|
||||||
|
float32x4_t x3 = { 0.f, -0.f, 0.f, -0.f };
|
||||||
|
|
||||||
|
/* 127 <- 0, [square] det(A) = det(At) */
|
||||||
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
|
r1 = vrev64q_f32(glmm_load(mat[1])); /* g h e f */
|
||||||
|
r2 = vrev64q_f32(glmm_load(mat[2])); /* l k i j */
|
||||||
|
r3 = vrev64q_f32(glmm_load(mat[3])); /* o p m n */
|
||||||
|
|
||||||
|
gh = vget_high_f32(r1);
|
||||||
|
ef = vget_low_f32(r1);
|
||||||
|
kl = vget_high_f32(r2);
|
||||||
|
ij = vget_low_f32(r2);
|
||||||
|
op = vget_high_f32(r3);
|
||||||
|
mn = vget_low_f32(r3);
|
||||||
|
mm = vdup_lane_f32(mn, 1);
|
||||||
|
nn = vdup_lane_f32(mn, 0);
|
||||||
|
ii = vdup_lane_f32(ij, 1);
|
||||||
|
jj = vdup_lane_f32(ij, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
t[1] = j * p - n * l;
|
||||||
|
t[2] = j * o - n * k;
|
||||||
|
t[3] = i * p - m * l;
|
||||||
|
t[4] = i * o - m * k;
|
||||||
|
*/
|
||||||
|
x0 = glmm_fnmadd(vcombine_f32(kl, kl), vcombine_f32(nn, mm),
|
||||||
|
vmulq_f32(vcombine_f32(op, op), vcombine_f32(jj, ii)));
|
||||||
|
|
||||||
|
t12 = vget_low_f32(x0);
|
||||||
|
t34 = vget_high_f32(x0);
|
||||||
|
|
||||||
|
/* 1 3 1 3 2 4 2 4 */
|
||||||
|
a1 = vuzpq_f32(x0, x0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
t[0] = k * p - o * l;
|
||||||
|
t[0] = k * p - o * l;
|
||||||
|
t[5] = i * n - m * j;
|
||||||
|
t[5] = i * n - m * j;
|
||||||
|
*/
|
||||||
|
x1 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(kl, 0), jj),
|
||||||
|
vcombine_f32(vdup_lane_f32(op, 1), mm),
|
||||||
|
vmulq_f32(vcombine_f32(vdup_lane_f32(op, 0), nn),
|
||||||
|
vcombine_f32(vdup_lane_f32(kl, 1), ii)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
|
- b * (e * t[0] - g * t[3] + h * t[4])
|
||||||
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
|
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||||
|
*/
|
||||||
|
x2 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(gh, 1), vdup_lane_f32(ef, 0)),
|
||||||
|
vcombine_f32(vget_low_f32(a1.val[0]), t34),
|
||||||
|
vmulq_f32(vcombine_f32(ef, vdup_lane_f32(ef, 1)),
|
||||||
|
vcombine_f32(vget_low_f32(x1), t12)));
|
||||||
|
|
||||||
|
x2 = glmm_fmadd(vcombine_f32(vdup_lane_f32(gh, 0), gh),
|
||||||
|
vcombine_f32(vget_low_f32(a1.val[1]), vget_high_f32(x1)), x2);
|
||||||
|
|
||||||
|
x2 = glmm_xor(x2, x3);
|
||||||
|
|
||||||
|
return glmm_hadd(vmulq_f32(x2, r0));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||||
|
float32x4_t r0, r1, r2, r3,
|
||||||
|
v0, v1, v2, v3,
|
||||||
|
t0, t1, t2, t3, t4, t5,
|
||||||
|
x0, x1, x2, x3, x4, x5, x6, x7, x8;
|
||||||
|
float32x4x2_t a1;
|
||||||
|
float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh;
|
||||||
|
float32x4_t x9 = { -0.f, 0.f, -0.f, 0.f };
|
||||||
|
|
||||||
|
x8 = vrev64q_f32(x9);
|
||||||
|
|
||||||
|
/* 127 <- 0 */
|
||||||
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
|
/* l p k o, j n i m */
|
||||||
|
a1 = vzipq_f32(r3, r2);
|
||||||
|
|
||||||
|
jn = vget_high_f32(a1.val[0]);
|
||||||
|
im = vget_low_f32(a1.val[0]);
|
||||||
|
lp = vget_high_f32(a1.val[1]);
|
||||||
|
ko = vget_low_f32(a1.val[1]);
|
||||||
|
hg = vget_high_f32(r1);
|
||||||
|
|
||||||
|
x1 = vcombine_f32(vdup_lane_f32(lp, 0), lp); /* l p p p */
|
||||||
|
x2 = vcombine_f32(vdup_lane_f32(ko, 0), ko); /* k o o o */
|
||||||
|
x0 = vcombine_f32(vdup_lane_f32(lp, 1), vdup_lane_f32(hg, 1)); /* h h l l */
|
||||||
|
x3 = vcombine_f32(vdup_lane_f32(ko, 1), vdup_lane_f32(hg, 0)); /* g g k k */
|
||||||
|
|
||||||
|
/* t1[0] = k * p - o * l;
|
||||||
|
t1[0] = k * p - o * l;
|
||||||
|
t2[0] = g * p - o * h;
|
||||||
|
t3[0] = g * l - k * h; */
|
||||||
|
t0 = glmm_fnmadd(x2, x0, vmulq_f32(x3, x1));
|
||||||
|
|
||||||
|
fe = vget_low_f32(r1);
|
||||||
|
x4 = vcombine_f32(vdup_lane_f32(jn, 0), jn); /* j n n n */
|
||||||
|
x5 = vcombine_f32(vdup_lane_f32(jn, 1), vdup_lane_f32(fe, 1)); /* f f j j */
|
||||||
|
|
||||||
|
/* t1[1] = j * p - n * l;
|
||||||
|
t1[1] = j * p - n * l;
|
||||||
|
t2[1] = f * p - n * h;
|
||||||
|
t3[1] = f * l - j * h; */
|
||||||
|
t1 = glmm_fnmadd(x4, x0, vmulq_f32(x5, x1));
|
||||||
|
|
||||||
|
/* t1[2] = j * o - n * k
|
||||||
|
t1[2] = j * o - n * k;
|
||||||
|
t2[2] = f * o - n * g;
|
||||||
|
t3[2] = f * k - j * g; */
|
||||||
|
t2 = glmm_fnmadd(x4, x3, vmulq_f32(x5, x2));
|
||||||
|
|
||||||
|
x6 = vcombine_f32(vdup_lane_f32(im, 1), vdup_lane_f32(fe, 0)); /* e e i i */
|
||||||
|
x7 = vcombine_f32(vdup_lane_f32(im, 0), im); /* i m m m */
|
||||||
|
|
||||||
|
/* t1[3] = i * p - m * l;
|
||||||
|
t1[3] = i * p - m * l;
|
||||||
|
t2[3] = e * p - m * h;
|
||||||
|
t3[3] = e * l - i * h; */
|
||||||
|
t3 = glmm_fnmadd(x7, x0, vmulq_f32(x6, x1));
|
||||||
|
|
||||||
|
/* t1[4] = i * o - m * k;
|
||||||
|
t1[4] = i * o - m * k;
|
||||||
|
t2[4] = e * o - m * g;
|
||||||
|
t3[4] = e * k - i * g; */
|
||||||
|
t4 = glmm_fnmadd(x7, x3, vmulq_f32(x6, x2));
|
||||||
|
|
||||||
|
/* t1[5] = i * n - m * j;
|
||||||
|
t1[5] = i * n - m * j;
|
||||||
|
t2[5] = e * n - m * f;
|
||||||
|
t3[5] = e * j - i * f; */
|
||||||
|
t5 = glmm_fnmadd(x7, x5, vmulq_f32(x6, x4));
|
||||||
|
|
||||||
|
/* h d f b, g c e a */
|
||||||
|
a1 = vtrnq_f32(r0, r1);
|
||||||
|
|
||||||
|
x4 = vrev64q_f32(a1.val[0]); /* c g a e */
|
||||||
|
x5 = vrev64q_f32(a1.val[1]); /* d h b f */
|
||||||
|
|
||||||
|
ae = vget_low_f32(x4);
|
||||||
|
cg = vget_high_f32(x4);
|
||||||
|
bf = vget_low_f32(x5);
|
||||||
|
dh = vget_high_f32(x5);
|
||||||
|
|
||||||
|
x0 = vcombine_f32(ae, vdup_lane_f32(ae, 1)); /* a a a e */
|
||||||
|
x1 = vcombine_f32(bf, vdup_lane_f32(bf, 1)); /* b b b f */
|
||||||
|
x2 = vcombine_f32(cg, vdup_lane_f32(cg, 1)); /* c c c g */
|
||||||
|
x3 = vcombine_f32(dh, vdup_lane_f32(dh, 1)); /* d d d h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
||||||
|
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
|
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
||||||
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
|
v0 = glmm_xor(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, vmulq_f32(x1, t0))), x8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
|
v2 = glmm_xor(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, vmulq_f32(x0, t1))), x8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
||||||
|
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
|
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
||||||
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
|
v1 = glmm_xor(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, vmulq_f32(x0, t0))), x9);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
||||||
|
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
|
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||||
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
|
v3 = glmm_xor(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, vmulq_f32(x0, t2))), x9);
|
||||||
|
|
||||||
|
/* determinant */
|
||||||
|
x0 = vcombine_f32(vget_low_f32(vzipq_f32(v0, v1).val[0]),
|
||||||
|
vget_low_f32(vzipq_f32(v2, v3).val[0]));
|
||||||
|
|
||||||
|
/*
|
||||||
|
x0 = glmm_div(glmm_set1(1.0f), glmm_vhadd(vmulq_f32(x0, r0)));
|
||||||
|
|
||||||
|
glmm_store(dest[0], vmulq_f32(v0, x0));
|
||||||
|
glmm_store(dest[1], vmulq_f32(v1, x0));
|
||||||
|
glmm_store(dest[2], vmulq_f32(v2, x0));
|
||||||
|
glmm_store(dest[3], vmulq_f32(v3, x0));
|
||||||
|
*/
|
||||||
|
|
||||||
|
x0 = glmm_vhadd(vmulq_f32(x0, r0));
|
||||||
|
|
||||||
|
glmm_store(dest[0], glmm_div(v0, x0));
|
||||||
|
glmm_store(dest[1], glmm_div(v1, x0));
|
||||||
|
glmm_store(dest[2], glmm_div(v2, x0));
|
||||||
|
glmm_store(dest[3], glmm_div(v3, x0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -22,31 +22,31 @@ glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
l1 = glmm_load(m1[1]);
|
l1 = glmm_load(m1[1]);
|
||||||
l2 = glmm_load(m1[2]);
|
l2 = glmm_load(m1[2]);
|
||||||
l3 = glmm_load(m1[3]);
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
r = glmm_load(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
glmm_store(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
glmm_store(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
glmm_store(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[3]);
|
r = glmm_load(m2[3]);
|
||||||
glmm_store(dest[3],
|
glmm_store(dest[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
glmm_fmadd(glmm_splat(r, 2), l2,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
_mm_mul_ps(glmm_splat(r, 3), l3)))));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -62,21 +62,22 @@ glm_mul_rot_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
|
|
||||||
r = glmm_load(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
glmm_store(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
glmm_store(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
glmm_store(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_splat(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_splat(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_splat(r, 2), l2))));
|
||||||
|
|
||||||
glmm_store(dest[3], l3);
|
glmm_store(dest[3], l3);
|
||||||
}
|
}
|
||||||
@@ -94,9 +95,9 @@ glm_inv_tr_sse2(mat4 mat) {
|
|||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
|
x0 = glmm_fmadd(r0, glmm_shuff1(r3, 0, 0, 0, 0),
|
||||||
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
|
glmm_fmadd(r1, glmm_shuff1(r3, 1, 1, 1, 1),
|
||||||
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
|
_mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2))));
|
||||||
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0, x1);
|
x0 = _mm_add_ps(x0, x1);
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
|||||||
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 = _mm_mul_ps(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0));
|
x0 = glmm_fmadd(_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));
|
_mm_mul_ps(_mm_movehl_ps(x1, x1),
|
||||||
x1 = _mm_add_ps(x0, x1);
|
glmm_shuff1(x2, 3, 3, 1, 1)));
|
||||||
|
|
||||||
glmm_store(dest[0], x1);
|
glmm_store(dest[0], x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
|
|||||||
@@ -30,24 +30,17 @@ glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
|||||||
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
||||||
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
|
x0 = glmm_fmadd(glmm_shuff1(l0, 0, 2, 1, 0), glmm_shuff1(r0, 3, 0, 0, 0),
|
||||||
glmm_shuff1(r0, 3, 0, 0, 0)),
|
glmm_fmadd(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0),
|
||||||
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0))));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
|
||||||
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
|
||||||
|
|
||||||
_mm_storeu_ps(dest[0], x0);
|
_mm_storeu_ps(dest[0], x0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
|
x0 = glmm_fmadd(glmm_shuff1(l0, 1, 0, 2, 1), _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3)),
|
||||||
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
glmm_fmadd(glmm_shuff1(x1, 1, 0, 2, 1), glmm_shuff1(r1, 3, 3, 0, 0),
|
||||||
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
|
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
||||||
glmm_shuff1(r1, 3, 3, 0, 0)));
|
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1)))));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
|
||||||
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
|
||||||
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
|
||||||
|
|
||||||
_mm_storeu_ps(&dest[1][1], x0);
|
_mm_storeu_ps(&dest[1][1], x0);
|
||||||
|
|
||||||
dest[2][2] = m1[0][2] * m2[2][0]
|
dest[2][2] = m1[0][2] * m2[2][0]
|
||||||
|
|||||||
@@ -55,47 +55,37 @@ glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
l1 = glmm_load(m1[1]);
|
l1 = glmm_load(m1[1]);
|
||||||
l2 = glmm_load(m1[2]);
|
l2 = glmm_load(m1[2]);
|
||||||
l3 = glmm_load(m1[3]);
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
|
#define XX(C) \
|
||||||
|
\
|
||||||
|
r = glmm_load(m2[C]); \
|
||||||
|
glmm_store(dest[C], \
|
||||||
|
glmm_fmadd(glmm_splat(r, 0), l0, \
|
||||||
|
glmm_fmadd(glmm_splat(r, 1), l1, \
|
||||||
|
glmm_fmadd(glmm_splat(r, 2), l2, \
|
||||||
|
_mm_mul_ps(glmm_splat(r, 3), l3)))));
|
||||||
|
|
||||||
r = glmm_load(m2[0]);
|
XX(0);
|
||||||
glmm_store(dest[0],
|
XX(1);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
XX(2);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
XX(3);
|
||||||
_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))));
|
|
||||||
|
|
||||||
r = glmm_load(m2[3]);
|
#undef XX
|
||||||
glmm_store(dest[3],
|
|
||||||
_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))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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, x2;
|
__m128 x0, x1;
|
||||||
|
|
||||||
x0 = glmm_load(v);
|
x0 = glmm_load(v);
|
||||||
x1 = _mm_add_ps(_mm_mul_ps(glmm_load(m[0]), glmm_shuff1x(x0, 0)),
|
x1 = glmm_fmadd(glmm_load(m[0]), glmm_splat(x0, 0),
|
||||||
_mm_mul_ps(glmm_load(m[1]), glmm_shuff1x(x0, 1)));
|
glmm_fmadd(glmm_load(m[1]), glmm_splat(x0, 1),
|
||||||
|
glmm_fmadd(glmm_load(m[2]), glmm_splat(x0, 2),
|
||||||
x2 = _mm_add_ps(_mm_mul_ps(glmm_load(m[2]), glmm_shuff1x(x0, 2)),
|
_mm_mul_ps(glmm_load(m[3]),
|
||||||
_mm_mul_ps(glmm_load(m[3]), glmm_shuff1x(x0, 3)));
|
glmm_splat(x0, 3)))));
|
||||||
|
|
||||||
glmm_store(dest, _mm_add_ps(x1, x2));
|
glmm_store(dest, x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -115,20 +105,18 @@ 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 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
x0 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 1, 1), glmm_shuff1(r2, 2, 3, 2, 3),
|
||||||
glmm_shuff1(r3, 2, 3, 2, 3)),
|
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 1, 1),
|
glmm_shuff1(r3, 2, 3, 2, 3)));
|
||||||
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 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
x1 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 2, 2), glmm_shuff1(r2, 1, 1, 3, 3),
|
||||||
glmm_shuff1(r3, 1, 1, 3, 3)),
|
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
||||||
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 2, 2),
|
glmm_shuff1(r3, 1, 1, 3, 3)));
|
||||||
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])
|
||||||
@@ -136,21 +124,16 @@ 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 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
x2 = glmm_fnmadd(glmm_shuff1(r1, 1, 1, 2, 2), glmm_shuff1(x0, 3, 2, 2, 0),
|
||||||
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r1, 1, 1, 2, 2),
|
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))));
|
||||||
glmm_shuff1(x0, 3, 2, 2, 0)));
|
x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3),
|
||||||
|
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)),
|
||||||
x2 = _mm_add_ps(x2,
|
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));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(r0, x2);
|
return glmm_hadd(_mm_mul_ps(x2, r0));
|
||||||
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
|
||||||
@@ -159,8 +142,11 @@ 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;
|
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
||||||
|
|
||||||
|
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
||||||
|
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = glmm_load(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
@@ -177,8 +163,8 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
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 */
|
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 */
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
@@ -187,14 +173,14 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
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 */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
@@ -202,20 +188,20 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
|
||||||
|
|
||||||
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
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 */
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
@@ -226,50 +212,35 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
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_add_ps(_mm_mul_ps(x3, t2),
|
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
|
||||||
_mm_mul_ps(x2, t1)));
|
/*
|
||||||
v0 = _mm_xor_ps(v0, _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_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), 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_add_ps(_mm_mul_ps(x3, t4),
|
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
|
||||||
_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_add_ps(_mm_mul_ps(x2, t5),
|
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
|
||||||
_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_mul_ps(x0, r0);
|
x0 = _mm_rcp_ps(glmm_vhadd(_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));
|
||||||
@@ -283,8 +254,11 @@ 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;
|
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
||||||
|
|
||||||
|
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
||||||
|
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = glmm_load(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
@@ -301,8 +275,8 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
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 */
|
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 */
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
@@ -311,14 +285,14 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
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 */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
@@ -326,20 +300,20 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
|
||||||
|
|
||||||
/* 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 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
|
||||||
|
|
||||||
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
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 */
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
@@ -350,50 +324,35 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
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_add_ps(_mm_mul_ps(x3, t2),
|
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
|
||||||
_mm_mul_ps(x2, t1)));
|
/*
|
||||||
v0 = _mm_xor_ps(v0, _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_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), 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_add_ps(_mm_mul_ps(x3, t4),
|
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
|
||||||
_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_add_ps(_mm_mul_ps(x2, t5),
|
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
|
||||||
_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_mul_ps(x0, r0);
|
x0 = _mm_div_ps(_mm_set1_ps(1.0f), glmm_vhadd(_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));
|
||||||
|
|||||||
@@ -27,15 +27,15 @@ glm_quat_mul_sse2(versor p, versor q, versor dest) {
|
|||||||
xp = glmm_load(p); /* 3 2 1 0 */
|
xp = glmm_load(p); /* 3 2 1 0 */
|
||||||
xq = glmm_load(q);
|
xq = glmm_load(q);
|
||||||
|
|
||||||
r = _mm_mul_ps(glmm_shuff1x(xp, 3), xq);
|
r = _mm_mul_ps(glmm_splat(xp, 3), xq);
|
||||||
|
|
||||||
x0 = _mm_xor_ps(glmm_shuff1x(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
x0 = _mm_xor_ps(glmm_splat(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 0, 1, 2, 3)));
|
r = _mm_add_ps(r, _mm_mul_ps(x0, 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));
|
x0 = _mm_xor_ps(glmm_splat(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
|
||||||
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
|
||||||
|
|
||||||
x0 = _mm_xor_ps(glmm_shuff1x(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
|
x0 = _mm_xor_ps(glmm_splat(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
|
||||||
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 2, 3, 0, 1)));
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 2, 3, 0, 1)));
|
||||||
|
|
||||||
glmm_store(dest, r);
|
glmm_store(dest, r);
|
||||||
|
|||||||
@@ -18,6 +18,9 @@
|
|||||||
# 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), \
|
||||||
@@ -27,7 +30,16 @@
|
|||||||
_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)
|
||||||
@@ -48,6 +60,15 @@ 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) {
|
||||||
@@ -80,7 +101,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_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
return _mm_min_ss(x1, x2);
|
return _mm_min_ss(x1, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +117,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_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
return _mm_max_ss(x1, x2);
|
return _mm_max_ss(x1, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +196,7 @@ glmm_load3(float v[3]) {
|
|||||||
__m128i xy;
|
__m128i xy;
|
||||||
__m128 z;
|
__m128 z;
|
||||||
|
|
||||||
xy = _mm_loadl_epi64((const __m128i *)v);
|
xy = _mm_loadl_epi64(CGLM_CASTPTR_ASSUME_ALIGNED(v, const __m128i));
|
||||||
z = _mm_load_ss(&v[2]);
|
z = _mm_load_ss(&v[2]);
|
||||||
|
|
||||||
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
||||||
@@ -184,9 +205,103 @@ glmm_load3(float v[3]) {
|
|||||||
static inline
|
static inline
|
||||||
void
|
void
|
||||||
glmm_store3(float v[3], __m128 vx) {
|
glmm_store3(float v[3], __m128 vx) {
|
||||||
_mm_storel_pi((__m64 *)&v[0], vx);
|
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
|
||||||
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_div(__m128 a, __m128 b) {
|
||||||
|
return _mm_div_ps(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable FMA macro for MSVC? */
|
||||||
|
#if defined(_MSC_VER) && !defined(__FMA__) && defined(__AVX2__)
|
||||||
|
# define __FMA__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fmadd(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_add_ps(c, _mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fnmadd(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fnmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_sub_ps(c, _mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fmsub(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_sub_ps(_mm_mul_ps(a, b), c);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fnmsub(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fnmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c), _mm_set1_ps(-0.0f));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__AVX__)
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fmadd(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_add_ps(c, _mm256_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fnmadd(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fnmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_sub_ps(c, _mm256_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fmsub(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_sub_ps(_mm256_mul_ps(a, b), c);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fnmsub(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c),
|
||||||
|
_mm256_set1_ps(-0.0f));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_simd_x86_h */
|
#endif /* cglm_simd_x86_h */
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ extern "C" {
|
|||||||
#include "struct/project.h"
|
#include "struct/project.h"
|
||||||
#include "struct/sphere.h"
|
#include "struct/sphere.h"
|
||||||
#include "struct/curve.h"
|
#include "struct/curve.h"
|
||||||
|
#include "struct/affine2d.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,10 +39,6 @@
|
|||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_mat4_mul(mat4s m1, mat4s m2);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by v vector
|
* @brief translate existing transform matrix by v vector
|
||||||
* and stores result in same matrix
|
* and stores result in same matrix
|
||||||
|
|||||||
177
include/cglm/struct/affine2d.h
Normal file
177
include/cglm/struct/affine2d.h
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE mat3s glms_translate2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE mat3s glms_translate2d_x(mat3s m, float x)
|
||||||
|
CGLM_INLINE mat3s glms_translate2d_y(mat3s m, float y)
|
||||||
|
CGLM_INLINE mat3s glms_translate2d_make(vec2s v)
|
||||||
|
CGLM_INLINE mat3s glms_scale2d_make(vec2s v)
|
||||||
|
CGLM_INLINE mat3s glms_scale2d(mat3s m, vec2s v)
|
||||||
|
CGLM_INLINE mat3s glms_scale2d_uni(mat3s m, float s)
|
||||||
|
CGLM_INLINE mat3s glms_rotate2d_make(float angle)
|
||||||
|
CGLM_INLINE mat3s glms_rotate2d(mat3s m, float angle)
|
||||||
|
CGLM_INLINE mat3s glms_rotate2d_to(mat3s m, float angle)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglms_affine2ds_h
|
||||||
|
#define cglms_affine2ds_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../types-struct.h"
|
||||||
|
#include "../affine2d.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_translate2d(mat3s m, vec2s v) {
|
||||||
|
glm_translate2d(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by x factor
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] x x factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_translate2d_x(mat3s m, float x) {
|
||||||
|
glm_translate2d_x(m.raw, x);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by y factor
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] y y factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_translate2d_y(mat3s m, float y) {
|
||||||
|
glm_translate2d_y(m.raw, y);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW translate 2d transform matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_translate2d_make(vec2s v) {
|
||||||
|
mat3s m;
|
||||||
|
glm_translate2d_make(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW 2d scale matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_scale2d_make(vec2s v) {
|
||||||
|
mat3s m;
|
||||||
|
glm_scale2d_make(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scales existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y, z]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_scale2d(mat3s m, vec2s v) {
|
||||||
|
mat3s r;
|
||||||
|
glm_scale2d_to(m.raw, v.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief applies uniform scale to existing 2d transform matrix v = [s, s, s]
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] s scale factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_scale2d_uni(mat3s m, float s) {
|
||||||
|
glm_scale2d_uni(m.raw, s);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW 2d rotation matrix by angle and axis
|
||||||
|
*
|
||||||
|
* axis will be normalized so you don't need to normalize it
|
||||||
|
*
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_rotate2d_make(float angle) {
|
||||||
|
mat3s m;
|
||||||
|
glm_rotate2d_make(m.raw, angle);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around given axis by angle
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_rotate2d(mat3s m, float angle) {
|
||||||
|
glm_rotate2d(m.raw, angle);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around given axis by angle
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat3s
|
||||||
|
glms_rotate2d_to(mat3s m, float angle) {
|
||||||
|
glm_rotate2d(m.raw, angle);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglms_affine2ds_h */
|
||||||
@@ -36,8 +36,8 @@
|
|||||||
#include "../types-struct.h"
|
#include "../types-struct.h"
|
||||||
#include "../mat2.h"
|
#include "../mat2.h"
|
||||||
|
|
||||||
#define GLMS_MAT2_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 1.0f}
|
#define GLMS_MAT2_IDENTITY_INIT {GLM_MAT2_IDENTITY_INIT}
|
||||||
#define GLMS_MAT2_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f}
|
#define GLMS_MAT2_ZERO_INIT {GLM_MAT2_ZERO_INIT}
|
||||||
|
|
||||||
/* for C only */
|
/* for C only */
|
||||||
#define GLMS_MAT2_IDENTITY ((mat3s)GLMS_MAT2_IDENTITY_INIT)
|
#define GLMS_MAT2_IDENTITY ((mat3s)GLMS_MAT2_IDENTITY_INIT)
|
||||||
|
|||||||
@@ -42,9 +42,9 @@ glms_sphere_radii(vec4s s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec4s
|
vec4s
|
||||||
glms_sphere_transform(vec4s s, mat4 m) {
|
glms_sphere_transform(vec4s s, mat4s m) {
|
||||||
vec4s r;
|
vec4s r;
|
||||||
glm_sphere_transform(s.raw, m, r.raw);
|
glm_sphere_transform(s.raw, m.raw, r.raw);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
/*!
|
/*!
|
||||||
* @brief init vec2 using vec2
|
* @brief init vec2 using vec2
|
||||||
*
|
*
|
||||||
* @param[in] v4 vector3
|
* @param[in] v3 vector3
|
||||||
* @returns destination
|
* @returns destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -455,18 +455,18 @@ glms_vec2_normalize(vec2s v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief rotate vec2 around axis by angle using Rodrigues' rotation formula
|
* @brief rotate vec2 by angle using Rodrigues' rotation formula
|
||||||
*
|
*
|
||||||
* @param[in] v vector
|
* @param[in] v vector
|
||||||
* @param[in] axis axis vector (must be unit vector)
|
|
||||||
* @param[in] angle angle by radians
|
* @param[in] angle angle by radians
|
||||||
* @returns rotated vector
|
* @returns rotated vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec2s
|
vec2s
|
||||||
glms_vec2_rotate(vec2s v, float angle, vec2s axis) {
|
glms_vec2_rotate(vec2s v, float angle) {
|
||||||
glm_vec2_rotate(v.raw, angle, axis.raw);
|
vec2s r;
|
||||||
return v;
|
glm_vec2_rotate(v.raw, angle, r.raw);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -32,6 +32,16 @@
|
|||||||
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
|
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define CGLM_ASSUME_ALIGNED(expr, alignment) \
|
||||||
|
__builtin_assume_aligned((expr), (alignment))
|
||||||
|
#else
|
||||||
|
# define CGLM_ASSUME_ALIGNED(expr, alignment) (expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
|
||||||
|
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
|
||||||
|
|
||||||
typedef float vec2[2];
|
typedef float vec2[2];
|
||||||
typedef float vec3[3];
|
typedef float vec3[3];
|
||||||
typedef int ivec3[3];
|
typedef int ivec3[3];
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ glm_smoothinterpc(float from, float to, float t) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_eq(float a, float b) {
|
glm_eq(float a, float b) {
|
||||||
return fabsf(a - b) <= FLT_EPSILON;
|
return fabsf(a - b) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -322,7 +322,22 @@ glm_percent(float from, float to, float current) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_percentc(float from, float to, float current) {
|
glm_percentc(float from, float to, float current) {
|
||||||
return glm_clamp(glm_percent(from, to, current), 0.0f, 1.0f);
|
return glm_clamp_zo(glm_percent(from, to, current));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two float values
|
||||||
|
*
|
||||||
|
* @param[in] a float value 1 (pointer)
|
||||||
|
* @param[in] b float value 2 (pointer)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_swapf(float * __restrict a, float * __restrict b) {
|
||||||
|
float t;
|
||||||
|
t = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_util_h */
|
#endif /* cglm_util_h */
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ glm_vec2_eq(vec2 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec2_eq_eps(vec2 v, float val) {
|
glm_vec2_eq_eps(vec2 v, float val) {
|
||||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[1] - val) <= FLT_EPSILON;
|
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -73,7 +73,7 @@ glm_vec2_eq_eps(vec2 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec2_eq_all(vec2 v) {
|
glm_vec2_eq_all(vec2 v) {
|
||||||
return v[0] == v[1];
|
return glm_vec2_eq_eps(v, v[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -97,8 +97,8 @@ glm_vec2_eqv(vec2 a, vec2 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec2_eqv_eps(vec2 a, vec2 b) {
|
glm_vec2_eqv_eps(vec2 a, vec2 b) {
|
||||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON;
|
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -81,9 +81,9 @@ glm_vec3_eq(vec3 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec3_eq_eps(vec3 v, float val) {
|
glm_vec3_eq_eps(vec3 v, float val) {
|
||||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[2] - val) <= FLT_EPSILON;
|
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -94,7 +94,7 @@ glm_vec3_eq_eps(vec3 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec3_eq_all(vec3 v) {
|
glm_vec3_eq_all(vec3 v) {
|
||||||
return v[0] == v[1] && v[0] == v[2];
|
return glm_vec3_eq_eps(v, v[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -120,9 +120,9 @@ glm_vec3_eqv(vec3 a, vec3 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec3_eqv_eps(vec3 a, vec3 b) {
|
glm_vec3_eqv_eps(vec3 a, vec3 b) {
|
||||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[2] - b[2]) <= FLT_EPSILON;
|
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -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]), 0x1.fffffep-1f);
|
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
|
||||||
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
|
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
|
||||||
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
|
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -92,10 +92,10 @@ glm_vec4_eq(vec4 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eq_eps(vec4 v, float val) {
|
glm_vec4_eq_eps(vec4 v, float val) {
|
||||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[2] - val) <= FLT_EPSILON
|
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(v[3] - val) <= FLT_EPSILON;
|
&& fabsf(v[3] - val) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -106,9 +106,7 @@ glm_vec4_eq_eps(vec4 v, float val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eq_all(vec4 v) {
|
glm_vec4_eq_all(vec4 v) {
|
||||||
return v[0] == v[1]
|
return glm_vec4_eq_eps(v, v[0]);
|
||||||
&& v[0] == v[2]
|
|
||||||
&& v[0] == v[3];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -135,10 +133,10 @@ glm_vec4_eqv(vec4 a, vec4 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eqv_eps(vec4 a, vec4 b) {
|
glm_vec4_eqv_eps(vec4 a, vec4 b) {
|
||||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[2] - b[2]) <= FLT_EPSILON
|
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON
|
||||||
&& fabsf(a[3] - b[3]) <= FLT_EPSILON;
|
&& fabsf(a[3] - b[3]) <= GLM_FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -226,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_shuff1x(x1, 2);
|
x2 = glmm_splat(x1, 2);
|
||||||
|
|
||||||
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_shuff1x(x1, 1));
|
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_splat(x1, 1));
|
||||||
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_shuff1x(x1, 0));
|
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_splat(x1, 0));
|
||||||
|
|
||||||
glmm_store(dest, _mm_or_ps(x3, x4));
|
glmm_store(dest, _mm_or_ps(x3, x4));
|
||||||
#else
|
#else
|
||||||
@@ -270,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]), 0x1.fffffep-1f);
|
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
|
||||||
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
|
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
|
||||||
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
|
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
|
||||||
dest[3] = fminf(v[3] - floorf(v[3]), 0x1.fffffep-1f);
|
dest[3] = fminf(v[3] - floorf(v[3]), 0.999999940395355224609375f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -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( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(dest, _mm_div_ps(glmm_load(a), glmm_load(b)));
|
glmm_store(dest, glmm_div(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,14 +568,8 @@ 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( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_load(b), 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];
|
||||||
@@ -596,14 +590,8 @@ 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( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_set1(s), 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),
|
|
||||||
vsubq_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;
|
||||||
@@ -680,7 +668,7 @@ glm_vec4_negate_to(vec4 v, vec4 dest) {
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f)));
|
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f)));
|
||||||
#elif defined(CGLM_NEON_FP)
|
#elif defined(CGLM_NEON_FP)
|
||||||
vst1q_f32(dest, veorq_s32(vld1q_f32(v), vdupq_n_f32(-0.0f)));
|
vst1q_f32(dest, vnegq_f32(vld1q_f32(v)));
|
||||||
#else
|
#else
|
||||||
dest[0] = -v[0];
|
dest[0] = -v[0];
|
||||||
dest[1] = -v[1];
|
dest[1] = -v[1];
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#define cglm_version_h
|
#define cglm_version_h
|
||||||
|
|
||||||
#define CGLM_VERSION_MAJOR 0
|
#define CGLM_VERSION_MAJOR 0
|
||||||
#define CGLM_VERSION_MINOR 7
|
#define CGLM_VERSION_MINOR 8
|
||||||
#define CGLM_VERSION_PATCH 0
|
#define CGLM_VERSION_PATCH 2
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
14
include/module.modulemap
Normal file
14
include/module.modulemap
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module cglm {
|
||||||
|
header "cglm/cglm.h"
|
||||||
|
header "cglm/struct.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
}
|
||||||
|
|
||||||
|
module cglmc {
|
||||||
|
header "cglm/cglm.h"
|
||||||
|
header "cglm/struct.h"
|
||||||
|
header "cglm/call.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
}
|
||||||
108
meson.build
Normal file
108
meson.build
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
project('cglm', 'c',
|
||||||
|
version : '0.8.2',
|
||||||
|
license : 'mit',
|
||||||
|
default_options : [
|
||||||
|
'c_std=c11',
|
||||||
|
'werror=true',
|
||||||
|
'warning_level=2',
|
||||||
|
'buildtype=release'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
cc = meson.get_compiler('c')
|
||||||
|
|
||||||
|
cglm_install = get_option('install')
|
||||||
|
cglm_deps = cc.find_library('m', required : false)
|
||||||
|
|
||||||
|
cglm_args = []
|
||||||
|
build_args = []
|
||||||
|
|
||||||
|
if get_option('default_library') == 'static'
|
||||||
|
cglm_args = '-DCGLM_STATIC'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if host_machine.system() == 'windows'
|
||||||
|
build_args = '-DCGLM_EXPORTS'
|
||||||
|
endif
|
||||||
|
|
||||||
|
cglm_inc = include_directories('include')
|
||||||
|
|
||||||
|
cglm_src = files(
|
||||||
|
'src/affine.c',
|
||||||
|
'src/affine2d.c',
|
||||||
|
'src/bezier.c',
|
||||||
|
'src/box.c',
|
||||||
|
'src/cam.c',
|
||||||
|
'src/curve.c',
|
||||||
|
'src/ease.c',
|
||||||
|
'src/euler.c',
|
||||||
|
'src/frustum.c',
|
||||||
|
'src/io.c',
|
||||||
|
'src/mat2.c',
|
||||||
|
'src/mat3.c',
|
||||||
|
'src/mat4.c',
|
||||||
|
'src/plane.c',
|
||||||
|
'src/project.c',
|
||||||
|
'src/quat.c',
|
||||||
|
'src/ray.c',
|
||||||
|
'src/sphere.c',
|
||||||
|
'src/vec2.c',
|
||||||
|
'src/vec3.c',
|
||||||
|
'src/vec4.c'
|
||||||
|
)
|
||||||
|
|
||||||
|
cglm_lib = library('cglm',
|
||||||
|
cglm_src,
|
||||||
|
install : cglm_install,
|
||||||
|
dependencies : cglm_deps,
|
||||||
|
c_args : [ build_args, cglm_args ]
|
||||||
|
)
|
||||||
|
|
||||||
|
cglm_dep = declare_dependency(
|
||||||
|
link_with : cglm_lib,
|
||||||
|
dependencies : cglm_deps,
|
||||||
|
compile_args : cglm_args,
|
||||||
|
include_directories : cglm_inc,
|
||||||
|
version : meson.project_version()
|
||||||
|
)
|
||||||
|
|
||||||
|
if meson.version().version_compare('>= 0.54.0')
|
||||||
|
meson.override_dependency('cglm', cglm_dep)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if cglm_install
|
||||||
|
install_subdir('include/cglm', install_dir : get_option('includedir'))
|
||||||
|
|
||||||
|
pkg = import('pkgconfig')
|
||||||
|
pkg.generate(
|
||||||
|
name : 'cglm',
|
||||||
|
libraries : cglm_lib,
|
||||||
|
extra_cflags : cglm_args,
|
||||||
|
version : meson.project_version(),
|
||||||
|
url : 'https://github.com/recp/cglm',
|
||||||
|
description : 'OpenGL Mathematics (glm) for C'
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get_option('build_tests') == true
|
||||||
|
|
||||||
|
test_src = files(
|
||||||
|
'test/runner.c',
|
||||||
|
'test/src/test_euler.c',
|
||||||
|
'test/src/test_bezier.c',
|
||||||
|
'test/src/test_cam.c',
|
||||||
|
'test/src/test_struct.c',
|
||||||
|
'test/src/test_clamp.c',
|
||||||
|
'test/src/test_common.c',
|
||||||
|
'test/src/tests.c'
|
||||||
|
)
|
||||||
|
|
||||||
|
test_exe = executable('tests',
|
||||||
|
test_src,
|
||||||
|
dependencies : cglm_dep,
|
||||||
|
c_args : '-DGLM_TESTS_NO_COLORFUL_OUTPUT'
|
||||||
|
)
|
||||||
|
|
||||||
|
test('cglm.tests', test_exe)
|
||||||
|
|
||||||
|
endif
|
||||||
2
meson_options.txt
Normal file
2
meson_options.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
option('build_tests', type : 'boolean', value : false, description : 'Build tests')
|
||||||
|
option('install', type : 'boolean', value : true, description : 'Include the library, headers, and pkg-config file in the install target')
|
||||||
81
src/affine2d.c
Normal file
81
src/affine2d.c
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_translate2d_make(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
glm_translate2d_to(m, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d(mat3 m, vec2 v) {
|
||||||
|
glm_translate2d(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_x(mat3 m, float to) {
|
||||||
|
glm_translate2d_x(m, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_y(mat3 m, float to) {
|
||||||
|
glm_translate2d_y(m, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
glm_scale2d_to(m, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_scale2d_make(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d(mat3 m, vec2 v) {
|
||||||
|
glm_scale2d(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_uni(mat3 m, float s) {
|
||||||
|
glm_scale2d_uni(m, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_make(mat3 m, float angle) {
|
||||||
|
glm_rotate2d_make(m, angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d(mat3 m, float angle) {
|
||||||
|
glm_rotate2d(m, angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_to(mat3 m, float angle, mat3 dest) {
|
||||||
|
glm_rotate2d_to(m, angle, dest);
|
||||||
|
}
|
||||||
10
src/config.h
10
src/config.h
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c), Recep Aslantas.
|
* Copyright (c), Recep Aslantas.
|
||||||
*
|
*
|
||||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm__config__h_
|
#ifndef cglm__config__h_
|
||||||
#define cglm__config__h_
|
#define cglm__config__h_
|
||||||
|
|||||||
2
src/io.c
2
src/io.c
@@ -5,6 +5,8 @@
|
|||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define CGLM_LIB_SRC
|
||||||
|
|
||||||
#include "../include/cglm/cglm.h"
|
#include "../include/cglm/cglm.h"
|
||||||
#include "../include/cglm/call.h"
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
|||||||
13
src/ray.c
Normal file
13
src/ray.c
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d) {
|
||||||
|
return glm_ray_triangle(origin, direction, v0, v1, v2, d);
|
||||||
|
}
|
||||||
1
src/swift/empty.c
Normal file
1
src/swift/empty.c
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// This empty file is needed to trick swiftpm to build the header-only version of cglm as swiftpm itself does not support C targets that have no source code files
|
||||||
44
test/CMakeLists.txt
Normal file
44
test/CMakeLists.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
# List all files containing tests. (Change as needed)
|
||||||
|
set(TESTFILES
|
||||||
|
runner.c
|
||||||
|
src/test_euler.c
|
||||||
|
src/test_bezier.c
|
||||||
|
src/test_cam.c
|
||||||
|
src/test_struct.c
|
||||||
|
src/test_clamp.c
|
||||||
|
src/test_common.c
|
||||||
|
src/tests.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(TEST_MAIN tests)
|
||||||
|
set(TEST_RUNNER_PARAMS "")
|
||||||
|
|
||||||
|
add_executable(${TEST_MAIN} ${TESTFILES})
|
||||||
|
target_compile_definitions(${TEST_MAIN} PRIVATE CGLM_DEFINE_PRINTS=1)
|
||||||
|
|
||||||
|
if(NOT MSVC)
|
||||||
|
target_link_libraries(${TEST_MAIN} PRIVATE m)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(${TEST_MAIN} PRIVATE cglm)
|
||||||
|
target_include_directories(${TEST_MAIN} PRIVATE
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/include
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(${TEST_MAIN} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
||||||
|
|
||||||
|
if(LDFLAGS)
|
||||||
|
target_compile_options(${TEST_MAIN} PRIVATE ${LDFLAGS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME cglm.${TEST_MAIN}
|
||||||
|
COMMAND ${TEST_MAIN} ${TEST_RUNNER_PARAMS})
|
||||||
|
|
||||||
|
add_custom_target(check
|
||||||
|
make
|
||||||
|
COMMAND ${CMAKE_CTEST_COMMAND} -V
|
||||||
|
DEPENDS cglm)
|
||||||
@@ -8,6 +8,18 @@
|
|||||||
#ifndef tests_common_h
|
#ifndef tests_common_h
|
||||||
#define tests_common_h
|
#define tests_common_h
|
||||||
|
|
||||||
|
#ifndef _USE_MATH_DEFINES
|
||||||
|
# define _USE_MATH_DEFINES /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
# define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE /* for drand48() */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -30,6 +42,8 @@ typedef struct test_entry_t {
|
|||||||
int show_output;
|
int show_output;
|
||||||
} test_entry_t;
|
} test_entry_t;
|
||||||
|
|
||||||
|
#ifndef GLM_TESTS_NO_COLORFUL_OUTPUT
|
||||||
|
|
||||||
#define RESET "\033[0m"
|
#define RESET "\033[0m"
|
||||||
#define BLACK "\033[30m" /* Black */
|
#define BLACK "\033[30m" /* Black */
|
||||||
#define RED "\033[31m" /* Red */
|
#define RED "\033[31m" /* Red */
|
||||||
@@ -48,6 +62,28 @@ typedef struct test_entry_t {
|
|||||||
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
|
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
|
||||||
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
|
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define RESET
|
||||||
|
#define BLACK
|
||||||
|
#define RED
|
||||||
|
#define GREEN
|
||||||
|
#define YELLOW
|
||||||
|
#define BLUE
|
||||||
|
#define MAGENTA
|
||||||
|
#define CYAN
|
||||||
|
#define WHITE
|
||||||
|
#define BOLDBLACK
|
||||||
|
#define BOLDRED
|
||||||
|
#define BOLDGREEN
|
||||||
|
#define BOLDYELLOW
|
||||||
|
#define BOLDBLUE
|
||||||
|
#define BOLDMAGENTA
|
||||||
|
#define BOLDCYAN
|
||||||
|
#define BOLDWHITE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
|
#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
|
||||||
#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
|
#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
|
||||||
#define TEST_LIST static test_entry_t tests[] =
|
#define TEST_LIST static test_entry_t tests[] =
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ main(int argc, const char * argv[]) {
|
|||||||
test_status_t st;
|
test_status_t st;
|
||||||
int32_t i, count, passed, failed, maxlen;
|
int32_t i, count, passed, failed, maxlen;
|
||||||
double start, end, elapsed, total;
|
double start, end, elapsed, total;
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
passed = failed = maxlen = 0;
|
passed = failed = maxlen = 0;
|
||||||
total = 0.0;
|
total = 0.0;
|
||||||
|
|||||||
310
test/src/test_affine2d.h
Normal file
310
test/src/test_affine2d.h
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate2d) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d)(m1, (vec2){13.0f, 11.0f});
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d)(m1, (vec2){1.0f, -1.0f});
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 16.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate2d_to) {
|
||||||
|
mat3 m1, m2;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_to)(m1, (vec2){13.0f, 11.0f}, m2);
|
||||||
|
glm_mat3_mulv(m2, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_to)(m1, (vec2){1.0f, -1.0f}, m2);
|
||||||
|
glm_mat3_mulv(m2, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 16.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate2d_x) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_x)(m1, 13.0f);
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_x)(m1, -1.0f);
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate2d_y) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_y)(m1, 11.0f);
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_y)(m1, -1.0f);
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate2d_make) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_make)(m1, (vec2){13.0f, 11.0f});
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(translate2d_make)(m1, (vec2){-1.0f, -5.0f});
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 9.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale2d_to) {
|
||||||
|
mat3 m1, m2;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d_to)(m1, (vec2){13.0f, 11.0f}, m2);
|
||||||
|
glm_mat3_mulv(m2, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 33.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d_to)(m1, (vec2){-1.0f, -5.0f}, m2);
|
||||||
|
glm_mat3_mulv(m2, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -165.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale2d_make) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
GLM(scale2d_make)(m1, (vec2){13.0f, 11.0f});
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 33.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
GLM(scale2d_make)(m1, (vec3){-1.0f, -5.0f});
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -165.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale2d) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d)(m1, (vec2){13.0f, 11.0f});
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 33.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d)(m1, (vec2){-1.0f, -5.0f});
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -165.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale2d_uni) {
|
||||||
|
mat3 m1;
|
||||||
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d_uni)(m1, 13.0f);
|
||||||
|
glm_mat3_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 26.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 39.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
glm_mat3_identity(m1);
|
||||||
|
GLM(scale2d_uni)(m1, -5.0f);
|
||||||
|
glm_mat3_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -130.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -195.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate2d_make) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate2d_make)(m1, GLM_PI_2f);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d_make)(m1, -GLM_PI_2f);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d_make)(m1, GLM_PIf);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate2d) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate2d)(m1, GLM_PI_2f);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d)(m1, GLM_PI_2f);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d)(m1, GLM_PI_2f);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate2d_to) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT, m2;
|
||||||
|
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate2d_to)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d_to)(m1, GLM_PI_2f, m2);
|
||||||
|
glm_mat3_mulv(m2, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate2d_to)(m2, GLM_PI_2f, m1);
|
||||||
|
glm_mat3_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -35,9 +35,9 @@ TEST_IMPL(camera_decomp) {
|
|||||||
farVal = 100.0f;
|
farVal = 100.0f;
|
||||||
|
|
||||||
glm_perspective(fovy, aspect, nearVal, farVal, proj);
|
glm_perspective(fovy, aspect, nearVal, farVal, proj);
|
||||||
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < FLT_EPSILON)
|
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
|
||||||
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < FLT_EPSILON)
|
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
|
||||||
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < FLT_EPSILON)
|
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
|
||||||
|
|
||||||
glm_persp_sizes(proj, fovy, sizes);
|
glm_persp_sizes(proj, fovy, sizes);
|
||||||
|
|
||||||
|
|||||||
68
test/src/test_camera.h
Normal file
68
test/src/test_camera.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, frustum) {
|
||||||
|
mat4 proj;
|
||||||
|
vec4 vp = {0.0f, 0.0f, 800.0f, 600.0f};
|
||||||
|
float left, right, top, bottom, znear, zfar;
|
||||||
|
|
||||||
|
znear = 0.1f;
|
||||||
|
zfar = 100.0f;
|
||||||
|
left = -100.0f;
|
||||||
|
right = 100.0f;
|
||||||
|
bottom = -100.0f;
|
||||||
|
top = 100.0f;
|
||||||
|
|
||||||
|
GLM(frustum)(left, right, bottom, top, znear, zfar, proj);
|
||||||
|
|
||||||
|
ASSERT(test_eq(proj[0][1], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[0][2], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[0][3], 0.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(proj[1][0], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[1][2], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[1][3], 0.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(proj[2][3], -1.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(proj[3][0], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[3][1], 0.0f))
|
||||||
|
ASSERT(test_eq(proj[3][3], 0.0f))
|
||||||
|
|
||||||
|
vec4 v1 = {1.0f, 20.0f, znear};
|
||||||
|
vec4 v2 = {1.0f, 20.0f, zfar};
|
||||||
|
vec4 v3, v4;
|
||||||
|
|
||||||
|
/* perspective test */
|
||||||
|
GLM(mat4_mulv)(proj, v1, v3);
|
||||||
|
GLM(project)(v3, proj, vp, v3);
|
||||||
|
|
||||||
|
ASSERT(v3[0] > v1[0])
|
||||||
|
ASSERT(v3[1] > v1[1])
|
||||||
|
|
||||||
|
GLM(mat4_mulv)(proj, v2, v4);
|
||||||
|
GLM(project)(v4, proj, vp, v4);
|
||||||
|
|
||||||
|
ASSERT(v4[0] < v3[0])
|
||||||
|
ASSERT(v4[1] < v3[1])
|
||||||
|
|
||||||
|
/* not infinity */
|
||||||
|
ASSERT(!GLM(vec4_isinf)(proj[0]))
|
||||||
|
ASSERT(!GLM(vec4_isinf)(proj[1]))
|
||||||
|
ASSERT(!GLM(vec4_isinf)(proj[2]))
|
||||||
|
ASSERT(!GLM(vec4_isinf)(proj[3]))
|
||||||
|
|
||||||
|
/* not NaN */
|
||||||
|
ASSERT(!GLM(vec4_isnan)(proj[0]))
|
||||||
|
ASSERT(!GLM(vec4_isnan)(proj[1]))
|
||||||
|
ASSERT(!GLM(vec4_isnan)(proj[2]))
|
||||||
|
ASSERT(!GLM(vec4_isnan)(proj[3]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -106,7 +106,7 @@ test_rand_quat(versor q);
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
test_eq(float a, float b) {
|
test_eq(float a, float b) {
|
||||||
return fabsf(a - b) <= 1e-6;
|
return fabsf(a - b) <= GLM_FLT_EPSILON * 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
|
|||||||
34
test/src/test_ray.h
Normal file
34
test/src/test_ray.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, ray_triangle) {
|
||||||
|
/* Check whether a simple hit is recognized with the right distance */
|
||||||
|
vec3 origin = { 0.0f, 0.0f, 0.0f};
|
||||||
|
vec3 direction = { 1.0f, 0.0f, 0.0f};
|
||||||
|
vec3 opposite = {-1.0f, 0.0f, 0.0f};
|
||||||
|
vec3 v0 = { 5.0f, -1.0f, 1.0f};
|
||||||
|
vec3 v1 = { 5.0f, -1.0f, -1.0f};
|
||||||
|
vec3 v2 = { 5.0f, 1.0f, 0.0f};
|
||||||
|
float d;
|
||||||
|
bool hit;
|
||||||
|
|
||||||
|
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, &d);
|
||||||
|
ASSERT(hit);
|
||||||
|
ASSERT(fabsf(d - 5.0f) <= 0.0000009);
|
||||||
|
|
||||||
|
/* Check whether a simple miss works */
|
||||||
|
hit = GLM(ray_triangle)(origin, opposite, v0, v1, v2, &d);
|
||||||
|
ASSERT(!hit);
|
||||||
|
|
||||||
|
/* Check that we can disregard distance and pass NULL pointer instead */
|
||||||
|
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, NULL);
|
||||||
|
ASSERT(hit);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c), Recep Aslantas.
|
* Copyright (c), Recep Aslantas.
|
||||||
*
|
*
|
||||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,10 @@
|
|||||||
#include "test_project.h"
|
#include "test_project.h"
|
||||||
#include "test_plane.h"
|
#include "test_plane.h"
|
||||||
#include "test_affine.h"
|
#include "test_affine.h"
|
||||||
|
#include "test_affine2d.h"
|
||||||
#include "test_affine_mat.h"
|
#include "test_affine_mat.h"
|
||||||
|
#include "test_ray.h"
|
||||||
|
#include "test_camera.h"
|
||||||
|
|
||||||
#undef GLM
|
#undef GLM
|
||||||
#undef GLM_PREFIX
|
#undef GLM_PREFIX
|
||||||
@@ -43,7 +46,10 @@
|
|||||||
#include "test_project.h"
|
#include "test_project.h"
|
||||||
#include "test_plane.h"
|
#include "test_plane.h"
|
||||||
#include "test_affine.h"
|
#include "test_affine.h"
|
||||||
|
#include "test_affine2d.h"
|
||||||
#include "test_affine_mat.h"
|
#include "test_affine_mat.h"
|
||||||
|
#include "test_ray.h"
|
||||||
|
#include "test_camera.h"
|
||||||
|
|
||||||
#undef GLM
|
#undef GLM
|
||||||
#undef GLM_PREFIX
|
#undef GLM_PREFIX
|
||||||
|
|||||||
75
test/tests.h
75
test/tests.h
@@ -70,6 +70,33 @@ TEST_DECLARE(glmc_uniscaled)
|
|||||||
TEST_DECLARE(glmc_decompose_rs)
|
TEST_DECLARE(glmc_decompose_rs)
|
||||||
TEST_DECLARE(glmc_decompose)
|
TEST_DECLARE(glmc_decompose)
|
||||||
|
|
||||||
|
/* affine 2d */
|
||||||
|
TEST_DECLARE(glm_translate2d)
|
||||||
|
TEST_DECLARE(glm_translate2d_to)
|
||||||
|
TEST_DECLARE(glm_translate2d_x)
|
||||||
|
TEST_DECLARE(glm_translate2d_y)
|
||||||
|
TEST_DECLARE(glm_translate2d_make)
|
||||||
|
TEST_DECLARE(glm_scale2d_to)
|
||||||
|
TEST_DECLARE(glm_scale2d_make)
|
||||||
|
TEST_DECLARE(glm_scale2d)
|
||||||
|
TEST_DECLARE(glm_scale2d_uni)
|
||||||
|
TEST_DECLARE(glm_rotate2d_make)
|
||||||
|
TEST_DECLARE(glm_rotate2d)
|
||||||
|
TEST_DECLARE(glm_rotate2d_to)
|
||||||
|
|
||||||
|
TEST_DECLARE(glmc_translate2d)
|
||||||
|
TEST_DECLARE(glmc_translate2d_to)
|
||||||
|
TEST_DECLARE(glmc_translate2d_x)
|
||||||
|
TEST_DECLARE(glmc_translate2d_y)
|
||||||
|
TEST_DECLARE(glmc_translate2d_make)
|
||||||
|
TEST_DECLARE(glmc_scale2d_to)
|
||||||
|
TEST_DECLARE(glmc_scale2d_make)
|
||||||
|
TEST_DECLARE(glmc_scale2d)
|
||||||
|
TEST_DECLARE(glmc_scale2d_uni)
|
||||||
|
TEST_DECLARE(glmc_rotate2d_make)
|
||||||
|
TEST_DECLARE(glmc_rotate2d)
|
||||||
|
TEST_DECLARE(glmc_rotate2d_to)
|
||||||
|
|
||||||
/* mat4 */
|
/* mat4 */
|
||||||
TEST_DECLARE(glm_mat4_ucopy)
|
TEST_DECLARE(glm_mat4_ucopy)
|
||||||
TEST_DECLARE(glm_mat4_copy)
|
TEST_DECLARE(glm_mat4_copy)
|
||||||
@@ -199,6 +226,10 @@ TEST_DECLARE(glmc_mat2_rmc)
|
|||||||
TEST_DECLARE(camera_lookat)
|
TEST_DECLARE(camera_lookat)
|
||||||
TEST_DECLARE(camera_decomp)
|
TEST_DECLARE(camera_decomp)
|
||||||
|
|
||||||
|
TEST_DECLARE(glm_frustum)
|
||||||
|
|
||||||
|
TEST_DECLARE(glmc_frustum)
|
||||||
|
|
||||||
/* project */
|
/* project */
|
||||||
TEST_DECLARE(glm_unprojecti)
|
TEST_DECLARE(glm_unprojecti)
|
||||||
TEST_DECLARE(glm_unproject)
|
TEST_DECLARE(glm_unproject)
|
||||||
@@ -218,6 +249,10 @@ TEST_DECLARE(clamp)
|
|||||||
/* euler */
|
/* euler */
|
||||||
TEST_DECLARE(euler)
|
TEST_DECLARE(euler)
|
||||||
|
|
||||||
|
/* ray */
|
||||||
|
TEST_DECLARE(glm_ray_triangle)
|
||||||
|
TEST_DECLARE(glmc_ray_triangle)
|
||||||
|
|
||||||
/* quat */
|
/* quat */
|
||||||
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY_INIT)
|
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||||
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY)
|
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY)
|
||||||
@@ -756,7 +791,34 @@ TEST_LIST {
|
|||||||
TEST_ENTRY(glmc_uniscaled)
|
TEST_ENTRY(glmc_uniscaled)
|
||||||
TEST_ENTRY(glmc_decompose_rs)
|
TEST_ENTRY(glmc_decompose_rs)
|
||||||
TEST_ENTRY(glmc_decompose)
|
TEST_ENTRY(glmc_decompose)
|
||||||
|
|
||||||
|
/* affine 2d */
|
||||||
|
TEST_ENTRY(glm_translate2d)
|
||||||
|
TEST_ENTRY(glm_translate2d_to)
|
||||||
|
TEST_ENTRY(glm_translate2d_x)
|
||||||
|
TEST_ENTRY(glm_translate2d_y)
|
||||||
|
TEST_ENTRY(glm_translate2d_make)
|
||||||
|
TEST_ENTRY(glm_scale2d_to)
|
||||||
|
TEST_ENTRY(glm_scale2d_make)
|
||||||
|
TEST_ENTRY(glm_scale2d)
|
||||||
|
TEST_ENTRY(glm_scale2d_uni)
|
||||||
|
TEST_ENTRY(glm_rotate2d_make)
|
||||||
|
TEST_ENTRY(glm_rotate2d)
|
||||||
|
TEST_ENTRY(glm_rotate2d_to)
|
||||||
|
|
||||||
|
TEST_ENTRY(glmc_translate2d)
|
||||||
|
TEST_ENTRY(glmc_translate2d_to)
|
||||||
|
TEST_ENTRY(glmc_translate2d_x)
|
||||||
|
TEST_ENTRY(glmc_translate2d_y)
|
||||||
|
TEST_ENTRY(glmc_translate2d_make)
|
||||||
|
TEST_ENTRY(glmc_scale2d_to)
|
||||||
|
TEST_ENTRY(glmc_scale2d_make)
|
||||||
|
TEST_ENTRY(glmc_scale2d)
|
||||||
|
TEST_ENTRY(glmc_scale2d_uni)
|
||||||
|
TEST_ENTRY(glmc_rotate2d_make)
|
||||||
|
TEST_ENTRY(glmc_rotate2d)
|
||||||
|
TEST_ENTRY(glmc_rotate2d_to)
|
||||||
|
|
||||||
/* mat4 */
|
/* mat4 */
|
||||||
TEST_ENTRY(glm_mat4_ucopy)
|
TEST_ENTRY(glm_mat4_ucopy)
|
||||||
TEST_ENTRY(glm_mat4_copy)
|
TEST_ENTRY(glm_mat4_copy)
|
||||||
@@ -886,6 +948,10 @@ TEST_LIST {
|
|||||||
TEST_ENTRY(camera_lookat)
|
TEST_ENTRY(camera_lookat)
|
||||||
TEST_ENTRY(camera_decomp)
|
TEST_ENTRY(camera_decomp)
|
||||||
|
|
||||||
|
TEST_ENTRY(glm_frustum)
|
||||||
|
|
||||||
|
TEST_ENTRY(glmc_frustum)
|
||||||
|
|
||||||
/* project */
|
/* project */
|
||||||
TEST_ENTRY(glm_unprojecti)
|
TEST_ENTRY(glm_unprojecti)
|
||||||
TEST_ENTRY(glm_unproject)
|
TEST_ENTRY(glm_unproject)
|
||||||
@@ -905,6 +971,10 @@ TEST_LIST {
|
|||||||
/* euler */
|
/* euler */
|
||||||
TEST_ENTRY(euler)
|
TEST_ENTRY(euler)
|
||||||
|
|
||||||
|
/* ray */
|
||||||
|
TEST_ENTRY(glm_ray_triangle)
|
||||||
|
TEST_ENTRY(glmc_ray_triangle)
|
||||||
|
|
||||||
/* quat */
|
/* quat */
|
||||||
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY_INIT)
|
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||||
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY)
|
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY)
|
||||||
@@ -984,6 +1054,7 @@ TEST_LIST {
|
|||||||
/* bezier */
|
/* bezier */
|
||||||
TEST_ENTRY(bezier)
|
TEST_ENTRY(bezier)
|
||||||
|
|
||||||
|
/* vec2 */
|
||||||
/* Macros */
|
/* Macros */
|
||||||
|
|
||||||
TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT)
|
TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT)
|
||||||
@@ -1062,7 +1133,6 @@ TEST_LIST {
|
|||||||
TEST_ENTRY(glmc_vec2_lerp)
|
TEST_ENTRY(glmc_vec2_lerp)
|
||||||
|
|
||||||
/* vec3 */
|
/* vec3 */
|
||||||
|
|
||||||
/* Macros */
|
/* Macros */
|
||||||
|
|
||||||
TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT)
|
TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT)
|
||||||
@@ -1228,7 +1298,8 @@ TEST_LIST {
|
|||||||
TEST_ENTRY(glmc_vec3_sqrt)
|
TEST_ENTRY(glmc_vec3_sqrt)
|
||||||
|
|
||||||
/* vec4 */
|
/* vec4 */
|
||||||
|
/* Macros */
|
||||||
|
|
||||||
TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT)
|
TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT)
|
||||||
TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT)
|
TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT)
|
||||||
TEST_ENTRY(MACRO_GLM_VEC4_ONE)
|
TEST_ENTRY(MACRO_GLM_VEC4_ONE)
|
||||||
|
|||||||
@@ -31,7 +31,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\test\include\common.h" />
|
<ClInclude Include="..\test\include\common.h" />
|
||||||
<ClInclude Include="..\test\src\test_affine.h" />
|
<ClInclude Include="..\test\src\test_affine.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_affine2d.h" />
|
||||||
<ClInclude Include="..\test\src\test_affine_mat.h" />
|
<ClInclude Include="..\test\src\test_affine_mat.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_camera.h" />
|
||||||
<ClInclude Include="..\test\src\test_common.h" />
|
<ClInclude Include="..\test\src\test_common.h" />
|
||||||
<ClInclude Include="..\test\src\test_mat2.h" />
|
<ClInclude Include="..\test\src\test_mat2.h" />
|
||||||
<ClInclude Include="..\test\src\test_mat3.h" />
|
<ClInclude Include="..\test\src\test_mat3.h" />
|
||||||
@@ -42,6 +44,7 @@
|
|||||||
<ClInclude Include="..\test\src\test_vec2.h" />
|
<ClInclude Include="..\test\src\test_vec2.h" />
|
||||||
<ClInclude Include="..\test\src\test_vec3.h" />
|
<ClInclude Include="..\test\src\test_vec3.h" />
|
||||||
<ClInclude Include="..\test\src\test_vec4.h" />
|
<ClInclude Include="..\test\src\test_vec4.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_ray.h" />
|
||||||
<ClInclude Include="..\test\tests.h" />
|
<ClInclude Include="..\test\tests.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -144,6 +147,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@@ -161,6 +165,7 @@
|
|||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
|||||||
@@ -79,5 +79,14 @@
|
|||||||
<ClInclude Include="..\test\src\test_vec2.h">
|
<ClInclude Include="..\test\src\test_vec2.h">
|
||||||
<Filter>src</Filter>
|
<Filter>src</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\src\test_ray.h">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\src\test_affine2d.h">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\src\test_camera.h">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\src\affine.c" />
|
<ClCompile Include="..\src\affine.c" />
|
||||||
|
<ClCompile Include="..\src\affine2d.c" />
|
||||||
<ClCompile Include="..\src\bezier.c" />
|
<ClCompile Include="..\src\bezier.c" />
|
||||||
<ClCompile Include="..\src\box.c" />
|
<ClCompile Include="..\src\box.c" />
|
||||||
<ClCompile Include="..\src\cam.c" />
|
<ClCompile Include="..\src\cam.c" />
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
<ClCompile Include="..\src\plane.c" />
|
<ClCompile Include="..\src\plane.c" />
|
||||||
<ClCompile Include="..\src\project.c" />
|
<ClCompile Include="..\src\project.c" />
|
||||||
<ClCompile Include="..\src\quat.c" />
|
<ClCompile Include="..\src\quat.c" />
|
||||||
|
<ClCompile Include="..\src\ray.c" />
|
||||||
<ClCompile Include="..\src\sphere.c" />
|
<ClCompile Include="..\src\sphere.c" />
|
||||||
<ClCompile Include="..\src\vec2.c" />
|
<ClCompile Include="..\src\vec2.c" />
|
||||||
<ClCompile Include="..\src\vec3.c" />
|
<ClCompile Include="..\src\vec3.c" />
|
||||||
@@ -42,11 +44,13 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
||||||
<ClInclude Include="..\include\cglm\affine.h" />
|
<ClInclude Include="..\include\cglm\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\affine2d.h" />
|
||||||
<ClInclude Include="..\include\cglm\applesimd.h" />
|
<ClInclude Include="..\include\cglm\applesimd.h" />
|
||||||
<ClInclude Include="..\include\cglm\bezier.h" />
|
<ClInclude Include="..\include\cglm\bezier.h" />
|
||||||
<ClInclude Include="..\include\cglm\box.h" />
|
<ClInclude Include="..\include\cglm\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\call.h" />
|
<ClInclude Include="..\include\cglm\call.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\affine.h" />
|
<ClInclude Include="..\include\cglm\call\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\affine2d.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\bezier.h" />
|
<ClInclude Include="..\include\cglm\call\bezier.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\box.h" />
|
<ClInclude Include="..\include\cglm\call\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\cam.h" />
|
<ClInclude Include="..\include\cglm\call\cam.h" />
|
||||||
@@ -61,6 +65,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\call\plane.h" />
|
<ClInclude Include="..\include\cglm\call\plane.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\project.h" />
|
<ClInclude Include="..\include\cglm\call\project.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\quat.h" />
|
<ClInclude Include="..\include\cglm\call\quat.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\ray.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\sphere.h" />
|
<ClInclude Include="..\include\cglm\call\sphere.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\vec2.h" />
|
<ClInclude Include="..\include\cglm\call\vec2.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\vec3.h" />
|
<ClInclude Include="..\include\cglm\call\vec3.h" />
|
||||||
@@ -80,12 +85,14 @@
|
|||||||
<ClInclude Include="..\include\cglm\plane.h" />
|
<ClInclude Include="..\include\cglm\plane.h" />
|
||||||
<ClInclude Include="..\include\cglm\project.h" />
|
<ClInclude Include="..\include\cglm\project.h" />
|
||||||
<ClInclude Include="..\include\cglm\quat.h" />
|
<ClInclude Include="..\include\cglm\quat.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\ray.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\arm.h" />
|
<ClInclude Include="..\include\cglm\simd\arm.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
|
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
|
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\intrin.h" />
|
<ClInclude Include="..\include\cglm\simd\intrin.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\neon\mat4.h" />
|
<ClInclude Include="..\include\cglm\simd\neon\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\affine.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\simd\sse2\mat2.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
|
||||||
@@ -93,6 +100,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\sphere.h" />
|
<ClInclude Include="..\include\cglm\sphere.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct.h" />
|
<ClInclude Include="..\include\cglm\struct.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\affine.h" />
|
<ClInclude Include="..\include\cglm\struct\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\struct\affine2d.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\box.h" />
|
<ClInclude Include="..\include\cglm\struct\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\cam.h" />
|
<ClInclude Include="..\include\cglm\struct\cam.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\color.h" />
|
<ClInclude Include="..\include\cglm\struct\color.h" />
|
||||||
@@ -201,7 +209,7 @@
|
|||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<DebugInformationFormat>None</DebugInformationFormat>
|
<DebugInformationFormat>None</DebugInformationFormat>
|
||||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
<PrecompiledHeaderFile />
|
<PrecompiledHeaderFile />
|
||||||
@@ -217,7 +225,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
@@ -238,11 +246,12 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<DebugInformationFormat>None</DebugInformationFormat>
|
<DebugInformationFormat>None</DebugInformationFormat>
|
||||||
<PrecompiledHeaderFile />
|
<PrecompiledHeaderFile />
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<EnablePREfast>true</EnablePREfast>
|
<EnablePREfast>true</EnablePREfast>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
@@ -257,11 +266,12 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<DebugInformationFormat>None</DebugInformationFormat>
|
<DebugInformationFormat>None</DebugInformationFormat>
|
||||||
<PrecompiledHeaderFile />
|
<PrecompiledHeaderFile />
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<EnablePREfast>true</EnablePREfast>
|
<EnablePREfast>true</EnablePREfast>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
|||||||
@@ -92,6 +92,12 @@
|
|||||||
<ClCompile Include="..\src\vec2.c">
|
<ClCompile Include="..\src\vec2.c">
|
||||||
<Filter>src</Filter>
|
<Filter>src</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\ray.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\affine2d.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\config.h">
|
<ClInclude Include="..\src\config.h">
|
||||||
@@ -124,6 +130,9 @@
|
|||||||
<ClInclude Include="..\include\cglm\call\vec4.h">
|
<ClInclude Include="..\include\cglm\call\vec4.h">
|
||||||
<Filter>include\cglm\call</Filter>
|
<Filter>include\cglm\call</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\ray.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\include\cglm\simd\avx\affine.h">
|
<ClInclude Include="..\include\cglm\simd\avx\affine.h">
|
||||||
<Filter>include\cglm\simd\avx</Filter>
|
<Filter>include\cglm\simd\avx</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -241,6 +250,9 @@
|
|||||||
<ClInclude Include="..\include\cglm\ease.h">
|
<ClInclude Include="..\include\cglm\ease.h">
|
||||||
<Filter>include\cglm</Filter>
|
<Filter>include\cglm</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\ray.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\include\cglm\simd\arm.h">
|
<ClInclude Include="..\include\cglm\simd\arm.h">
|
||||||
<Filter>include\cglm\simd</Filter>
|
<Filter>include\cglm\simd</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -346,5 +358,17 @@
|
|||||||
<ClInclude Include="..\include\cglm\struct\vec2-ext.h">
|
<ClInclude Include="..\include\cglm\struct\vec2-ext.h">
|
||||||
<Filter>include\cglm\struct</Filter>
|
<Filter>include\cglm\struct</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\simd\sse2\mat2.h">
|
||||||
|
<Filter>include\cglm\simd\sse2</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\affine2d.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\affine2d.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\struct\affine2d.h">
|
||||||
|
<Filter>include\cglm\struct</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user