mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
71 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -72,3 +72,6 @@ cglm-test-ios*
|
||||
/cglm.pc
|
||||
test-driver
|
||||
Default-568h@2x.png
|
||||
build/
|
||||
conftest.dir/*
|
||||
confdefs.h
|
||||
|
||||
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"
|
||||
}
|
||||
200
CMakeLists.txt
Normal file
200
CMakeLists.txt
Normal file
@@ -0,0 +1,200 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
project(cglm LANGUAGES C)
|
||||
|
||||
set(CGLM_VERSION_MAJOR 0)
|
||||
set(CGLM_VERSION_MINOR 7)
|
||||
set(CGLM_VERSION_PATCH 3)
|
||||
set(CGLM_VERSION ${CGLM_VERSION_MAJOR}.${CGLM_VERSION_MINOR}.${CGLM_VERSION_PATCH})
|
||||
|
||||
set(C_STANDARD 11)
|
||||
set(C_STANDARD_REQUIRED YES)
|
||||
|
||||
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(C_STANDARD 99)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL -DCGLM_EXPORTS -DCGLM_DLL)
|
||||
add_compile_options("/W3" "/Ox" "/Gy" "/Oi" "/TC" "/analyze")
|
||||
else()
|
||||
add_compile_options("-Wall" "-Werror" "-std=gnu11" "-O3")
|
||||
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||
# Currently, nothing special to be seen here.
|
||||
else()
|
||||
add_compile_options("-Werror=strict-prototypes")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(HEADERS
|
||||
include/cglm/version.h
|
||||
include/cglm/common.h
|
||||
include/cglm/types.h
|
||||
include/cglm/types-struct.h
|
||||
include/cglm/cglm.h
|
||||
include/cglm/call.h
|
||||
include/cglm/struct.h
|
||||
include/cglm/cam.h
|
||||
include/cglm/io.h
|
||||
include/cglm/mat4.h
|
||||
include/cglm/mat3.h
|
||||
include/cglm/mat2.h
|
||||
include/cglm/affine.h
|
||||
include/cglm/vec2.h
|
||||
include/cglm/vec2-ext.h
|
||||
include/cglm/vec3.h
|
||||
include/cglm/vec3-ext.h
|
||||
include/cglm/vec4.h
|
||||
include/cglm/vec4-ext.h
|
||||
include/cglm/euler.h
|
||||
include/cglm/util.h
|
||||
include/cglm/quat.h
|
||||
include/cglm/affine-mat.h
|
||||
include/cglm/plane.h
|
||||
include/cglm/frustum.h
|
||||
include/cglm/box.h
|
||||
include/cglm/color.h
|
||||
include/cglm/project.h
|
||||
include/cglm/sphere.h
|
||||
include/cglm/ease.h
|
||||
include/cglm/curve.h
|
||||
include/cglm/bezier.h
|
||||
include/cglm/applesimd.h
|
||||
include/cglm/ray.h
|
||||
)
|
||||
|
||||
set(HEADERS_CALL
|
||||
include/cglm/call/mat4.h
|
||||
include/cglm/call/mat3.h
|
||||
include/cglm/call/mat2.h
|
||||
include/cglm/call/vec2.h
|
||||
include/cglm/call/vec3.h
|
||||
include/cglm/call/vec4.h
|
||||
include/cglm/call/affine.h
|
||||
include/cglm/call/io.h
|
||||
include/cglm/call/cam.h
|
||||
include/cglm/call/quat.h
|
||||
include/cglm/call/euler.h
|
||||
include/cglm/call/plane.h
|
||||
include/cglm/call/frustum.h
|
||||
include/cglm/call/box.h
|
||||
include/cglm/call/project.h
|
||||
include/cglm/call/sphere.h
|
||||
include/cglm/call/ease.h
|
||||
include/cglm/call/curve.h
|
||||
include/cglm/call/bezier.h
|
||||
include/cglm/call/ray.h
|
||||
)
|
||||
|
||||
set(HEADERS_SIMD
|
||||
include/cglm/simd/intrin.h
|
||||
include/cglm/simd/x86.h
|
||||
include/cglm/simd/arm.h
|
||||
)
|
||||
|
||||
set(HEADERS_SIMD_SSE2
|
||||
include/cglm/simd/sse2/affine.h
|
||||
include/cglm/simd/sse2/mat4.h
|
||||
include/cglm/simd/sse2/mat3.h
|
||||
include/cglm/simd/sse2/mat2.h
|
||||
include/cglm/simd/sse2/quat.h
|
||||
)
|
||||
|
||||
set(HEADERS_SIMD_AVX
|
||||
include/cglm/simd/avx/mat4.h
|
||||
include/cglm/simd/avx/affine.h
|
||||
)
|
||||
|
||||
set(HEADERS_SIMD_NEON
|
||||
include/cglm/simd/neon/mat4.h
|
||||
)
|
||||
|
||||
set(HEADERS_STRUCT
|
||||
include/cglm/struct/mat4.h
|
||||
include/cglm/struct/mat3.h
|
||||
include/cglm/struct/mat2.h
|
||||
include/cglm/struct/vec2.h
|
||||
include/cglm/struct/vec2-ext.h
|
||||
include/cglm/struct/vec3.h
|
||||
include/cglm/struct/vec3-ext.h
|
||||
include/cglm/struct/vec4.h
|
||||
include/cglm/struct/vec4-ext.h
|
||||
include/cglm/struct/affine.h
|
||||
include/cglm/struct/io.h
|
||||
include/cglm/struct/cam.h
|
||||
include/cglm/struct/quat.h
|
||||
include/cglm/struct/euler.h
|
||||
include/cglm/struct/plane.h
|
||||
include/cglm/struct/frustum.h
|
||||
include/cglm/struct/box.h
|
||||
include/cglm/struct/project.h
|
||||
include/cglm/struct/sphere.h
|
||||
include/cglm/struct/color.h
|
||||
include/cglm/struct/curve.h
|
||||
)
|
||||
|
||||
add_library(cglm
|
||||
${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
|
||||
)
|
||||
|
||||
set_target_properties(cglm PROPERTIES VERSION ${CGLM_VERSION}
|
||||
SOVERSION ${CGLM_VERSION_MAJOR})
|
||||
|
||||
target_include_directories(cglm PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS cglm
|
||||
EXPORT cglm
|
||||
ARCHIVE DESTINATION lib/ COMPONENT development
|
||||
LIBRARY DESTINATION lib/ COMPONENT runtime NAMELINK_SKIP
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_NAME_DIR} COMPONENT runtime
|
||||
)
|
||||
|
||||
if(CGLM_SHARED)
|
||||
install(
|
||||
TARGETS cglm
|
||||
EXPORT cglm
|
||||
LIBRARY DESTINATION include/ COMPONENT development NAMELINK_ONLY
|
||||
)
|
||||
endif()
|
||||
|
||||
INSTALL(DIRECTORY include/ DESTINATION include)
|
||||
|
||||
# Test Configuration
|
||||
if(CGLM_USE_TEST)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif()
|
||||
6
CREDITS
6
CREDITS
@@ -65,3 +65,9 @@ https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolati
|
||||
12. vec2 cross product
|
||||
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||
|
||||
13. Ray triangle intersect
|
||||
Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
|
||||
Authors:
|
||||
Thomas Möller (tompa@clarus.se)
|
||||
Ben Trumbore (wbt@graphics.cornell.edu)
|
||||
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||
11
Makefile.am
11
Makefile.am
@@ -63,7 +63,8 @@ cglm_HEADERS = include/cglm/version.h \
|
||||
include/cglm/ease.h \
|
||||
include/cglm/curve.h \
|
||||
include/cglm/bezier.h \
|
||||
include/cglm/applesimd.h
|
||||
include/cglm/applesimd.h \
|
||||
include/cglm/ray.h
|
||||
|
||||
cglm_calldir=$(includedir)/cglm/call
|
||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
@@ -84,7 +85,8 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/sphere.h \
|
||||
include/cglm/call/ease.h \
|
||||
include/cglm/call/curve.h \
|
||||
include/cglm/call/bezier.h
|
||||
include/cglm/call/bezier.h \
|
||||
include/cglm/call/ray.h
|
||||
|
||||
cglm_simddir=$(includedir)/cglm/simd
|
||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||
@@ -95,6 +97,7 @@ cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
||||
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||
include/cglm/simd/sse2/mat4.h \
|
||||
include/cglm/simd/sse2/mat3.h \
|
||||
include/cglm/simd/sse2/mat2.h \
|
||||
include/cglm/simd/sse2/quat.h
|
||||
|
||||
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
||||
@@ -107,6 +110,7 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
|
||||
cglm_structdir=$(includedir)/cglm/struct
|
||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/mat3.h \
|
||||
include/cglm/struct/mat2.h \
|
||||
include/cglm/struct/vec2.h \
|
||||
include/cglm/struct/vec2-ext.h \
|
||||
include/cglm/struct/vec3.h \
|
||||
@@ -145,7 +149,8 @@ libcglm_la_SOURCES=\
|
||||
src/sphere.c \
|
||||
src/ease.c \
|
||||
src/curve.c \
|
||||
src/bezier.c
|
||||
src/bezier.c \
|
||||
src/ray.c
|
||||
|
||||
test_tests_SOURCES=\
|
||||
test/runner.c \
|
||||
|
||||
35
README.md
35
README.md
@@ -89,6 +89,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
||||
- curves
|
||||
- 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
|
||||
- ray intersection helpers
|
||||
- and others...
|
||||
|
||||
<hr />
|
||||
@@ -148,6 +149,38 @@ The types used are actually unions that allow access to the same data multiple w
|
||||
|
||||
## 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 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/)
|
||||
```
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
```bash
|
||||
@@ -291,7 +324,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
||||
## Contributors
|
||||
|
||||
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
|
||||
|
||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.6.1"
|
||||
s.version = "0.7.2"
|
||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
||||
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.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.7.0], [info@recp.me])
|
||||
AC_INIT([cglm], [0.7.3], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||
|
||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||
|
||||
@@ -51,3 +51,5 @@ Follow the :doc:`build` documentation for this
|
||||
sphere
|
||||
curve
|
||||
bezier
|
||||
version
|
||||
ray
|
||||
|
||||
@@ -7,6 +7,46 @@ 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.
|
||||
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 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/)
|
||||
|
||||
Unix (Autotools):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@@ -198,7 +198,7 @@ Functions documentation
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** direction vector
|
||||
| *[in]* **dir** direction vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
@@ -212,7 +212,7 @@ Functions documentation
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** direction vector
|
||||
| *[in]* **dir** direction vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.7.0'
|
||||
version = u'0.7.3'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.7.0'
|
||||
release = u'0.7.3'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
Features
|
||||
================================================================================
|
||||
|
||||
* array api and struct api, you can use arrays or structs.
|
||||
* general purpose matrix operations (mat4, mat3)
|
||||
* chain matrix multiplication (square only)
|
||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||
* affine transforms
|
||||
* affine transformations
|
||||
* matrix decomposition (extract rotation, scaling factor)
|
||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||
* camera (lookat)
|
||||
@@ -20,4 +21,6 @@ Features
|
||||
* easing functions
|
||||
* curves
|
||||
* 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.
|
||||
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):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@@ -50,3 +50,24 @@ 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.
|
||||
|
||||
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||
|
||||
Print Options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
1. **CGLM_DEFINE_PRINTS**
|
||||
2. **CGLM_NO_PRINTS_NOOP**
|
||||
|
||||
Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined.
|
||||
If DEBUG is not enabled then print function bodies will be emptied to eliminate print function calls.
|
||||
You can disable this feature too by defining **CGLM_NO_PRINTS_NOOP** macro top of cglm headers.
|
||||
|
||||
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"
|
||||
|
||||
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
|
||||
@@ -23,6 +23,7 @@ Functions:
|
||||
#. :c:func:`glm_max`
|
||||
#. :c:func:`glm_clamp`
|
||||
#. :c:func:`glm_lerp`
|
||||
#. :c:func:`glm_swapf`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -146,7 +147,7 @@ Functions documentation
|
||||
| *[in]* **b** b
|
||||
|
||||
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)
|
||||
|
||||
@@ -158,7 +159,7 @@ Functions documentation
|
||||
| *[in]* **current** value between from and to values
|
||||
|
||||
Returns:
|
||||
clamped normalized percent (0-100 in 0-1)
|
||||
percentage of current value
|
||||
|
||||
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||
|
||||
@@ -171,3 +172,11 @@ Functions documentation
|
||||
|
||||
Returns:
|
||||
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
|
||||
|
||||
@@ -392,7 +392,7 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[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)
|
||||
|
||||
@@ -435,8 +435,8 @@ Functions documentation
|
||||
squared distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
Returns:
|
||||
| squared distance (distance * distance)
|
||||
@@ -446,8 +446,8 @@ Functions documentation
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
Returns:
|
||||
| distance
|
||||
@@ -475,7 +475,7 @@ Functions documentation
|
||||
possible orthogonal/perpendicular vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** orthogonal/perpendicular vector
|
||||
|
||||
.. 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`
|
||||
@@ -40,10 +40,6 @@
|
||||
#include "mat4.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
|
||||
* and stores result in same matrix
|
||||
|
||||
@@ -31,6 +31,7 @@ extern "C" {
|
||||
#include "call/ease.h"
|
||||
#include "call/curve.h"
|
||||
#include "call/bezier.h"
|
||||
#include "call/ray.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#ifndef cglmc_io_h
|
||||
#define cglmc_io_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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,6 @@
|
||||
#include "ease.h"
|
||||
#include "curve.h"
|
||||
#include "bezier.h"
|
||||
#include "ray.h"
|
||||
|
||||
#endif /* cglm_h */
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
#ifndef cglm_common_h
|
||||
#define cglm_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
#define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -55,8 +55,6 @@ typedef enum glm_euler_seq {
|
||||
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
||||
} glm_euler_seq;
|
||||
|
||||
typedef glm_euler_seq glm_euler_sq;
|
||||
|
||||
CGLM_INLINE
|
||||
glm_euler_seq
|
||||
glm_euler_order(int ord[3]) {
|
||||
|
||||
@@ -17,67 +17,99 @@
|
||||
|
||||
#ifndef cglm_io_h
|
||||
#define cglm_io_h
|
||||
#if defined(DEBUG) || defined(_DEBUG) \
|
||||
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC)
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_print(mat4 matrix,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
int j;
|
||||
char buff[16];
|
||||
int i, j, cw[4], cwi;
|
||||
|
||||
#define m 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++) {
|
||||
fprintf(ostream, "\t|");
|
||||
for (j = 0; j < n; j++) {
|
||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||
|
||||
if (j != n - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, " |");
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||
|
||||
#undef m
|
||||
#undef n
|
||||
}
|
||||
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_print(mat3 matrix,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
int j;
|
||||
char buff[16];
|
||||
int i, j, cw[4], cwi;
|
||||
|
||||
#define m 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++) {
|
||||
fprintf(ostream, "\t|");
|
||||
for (j = 0; j < n; j++) {
|
||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||
|
||||
if (j != n - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, " |");
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||
|
||||
#undef m
|
||||
#undef n
|
||||
@@ -87,27 +119,39 @@ CGLM_INLINE
|
||||
void
|
||||
glm_mat2_print(mat2 matrix,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
int j;
|
||||
char buff[16];
|
||||
int i, j, cw[4], cwi;
|
||||
|
||||
#define m 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++) {
|
||||
fprintf(ostream, "\t|");
|
||||
for (j = 0; j < n; j++) {
|
||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||
|
||||
if (j != n - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, " |");
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||
|
||||
#undef m
|
||||
#undef n
|
||||
@@ -121,16 +165,16 @@ glm_vec4_print(vec4 vec,
|
||||
|
||||
#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++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
@@ -143,16 +187,16 @@ glm_vec3_print(vec3 vec,
|
||||
|
||||
#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++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
@@ -165,16 +209,12 @@ glm_ivec3_print(ivec3 vec,
|
||||
|
||||
#define m 3
|
||||
|
||||
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
||||
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "%d", vec[i]);
|
||||
for (i = 0; i < m; i++)
|
||||
fprintf(ostream, " % d", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
@@ -187,16 +227,16 @@ glm_vec2_print(vec2 vec,
|
||||
|
||||
#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++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
@@ -209,16 +249,17 @@ glm_versor_print(versor vec,
|
||||
|
||||
#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++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
@@ -232,24 +273,42 @@ glm_aabb_print(vec3 bbox[2],
|
||||
|
||||
#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++) {
|
||||
fprintf(ostream, "\t|");
|
||||
fprintf(ostream, " (");
|
||||
|
||||
for (j = 0; j < m; j++) {
|
||||
fprintf(ostream, "%0.4f", bbox[i][j]);
|
||||
|
||||
if (j != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
||||
else
|
||||
fprintf(ostream, " % g", bbox[i][j]);
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
fprintf(ostream, " )\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
#elif !defined(CGLM_NO_PRINTS_NOOP)
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* NOOP: Remove print from DEBUG */
|
||||
CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *o) { }
|
||||
CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *o) { }
|
||||
CGLM_INLINE void glm_mat2_print(mat2 matrix, FILE *o) { }
|
||||
CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *o) { }
|
||||
CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *o) { }
|
||||
CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *o) { }
|
||||
CGLM_INLINE void glm_vec2_print(vec2 vec, FILE *o) { }
|
||||
CGLM_INLINE void glm_versor_print(versor vec, FILE *o) { }
|
||||
CGLM_INLINE void glm_aabb_print(vec3 bbox[2], const char *t, FILE *o) { }
|
||||
#endif
|
||||
#endif /* cglm_io_h */
|
||||
|
||||
@@ -63,10 +63,6 @@
|
||||
# include "simd/sse2/quat.h"
|
||||
#endif
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_identity(mat4 mat);
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
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
|
||||
@@ -39,10 +39,6 @@
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_mat4_mul(mat4s m1, mat4s m2);
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
|
||||
@@ -42,9 +42,9 @@ glms_sphere_radii(vec4s s) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec4s
|
||||
glms_sphere_transform(vec4s s, mat4 m) {
|
||||
glms_sphere_transform(vec4s s, mat4s m) {
|
||||
vec4s r;
|
||||
glm_sphere_transform(s.raw, m, r.raw);
|
||||
glm_sphere_transform(s.raw, m.raw, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
/*!
|
||||
* @brief init vec2 using vec2
|
||||
*
|
||||
* @param[in] v4 vector3
|
||||
* @param[in] v3 vector3
|
||||
* @returns destination
|
||||
*/
|
||||
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] axis axis vector (must be unit vector)
|
||||
* @param[in] angle angle by radians
|
||||
* @returns rotated vector
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
glms_vec2_rotate(vec2s v, float angle, vec2s axis) {
|
||||
glm_vec2_rotate(v.raw, angle, axis.raw);
|
||||
return v;
|
||||
glms_vec2_rotate(vec2s v, float angle) {
|
||||
vec2s r;
|
||||
glm_vec2_rotate(v.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -322,7 +322,22 @@ glm_percent(float from, float to, float current) {
|
||||
CGLM_INLINE
|
||||
float
|
||||
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 */
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CGLM_VERSION_MAJOR 0
|
||||
#define CGLM_VERSION_MINOR 7
|
||||
#define CGLM_VERSION_PATCH 0
|
||||
#define CGLM_VERSION_PATCH 3
|
||||
|
||||
#endif /* cglm_version_h */
|
||||
|
||||
2
src/io.c
2
src/io.c
@@ -5,6 +5,8 @@
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#define CGLM_LIB_SRC
|
||||
|
||||
#include "../include/cglm/cglm.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);
|
||||
}
|
||||
39
test/CMakeLists.txt
Normal file
39
test/CMakeLists.txt
Normal file
@@ -0,0 +1,39 @@
|
||||
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_link_libraries(${TEST_MAIN} PRIVATE cglm m)
|
||||
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,9 @@
|
||||
#ifndef tests_common_h
|
||||
#define tests_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
#define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
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
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "test_plane.h"
|
||||
#include "test_affine.h"
|
||||
#include "test_affine_mat.h"
|
||||
#include "test_ray.h"
|
||||
|
||||
#undef GLM
|
||||
#undef GLM_PREFIX
|
||||
@@ -44,6 +45,7 @@
|
||||
#include "test_plane.h"
|
||||
#include "test_affine.h"
|
||||
#include "test_affine_mat.h"
|
||||
#include "test_ray.h"
|
||||
|
||||
#undef GLM
|
||||
#undef GLM_PREFIX
|
||||
|
||||
@@ -218,6 +218,10 @@ TEST_DECLARE(clamp)
|
||||
/* euler */
|
||||
TEST_DECLARE(euler)
|
||||
|
||||
/* ray */
|
||||
TEST_DECLARE(glm_ray_triangle)
|
||||
TEST_DECLARE(glmc_ray_triangle)
|
||||
|
||||
/* quat */
|
||||
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY)
|
||||
@@ -905,6 +909,10 @@ TEST_LIST {
|
||||
/* euler */
|
||||
TEST_ENTRY(euler)
|
||||
|
||||
/* ray */
|
||||
TEST_ENTRY(glm_ray_triangle)
|
||||
TEST_ENTRY(glmc_ray_triangle)
|
||||
|
||||
/* quat */
|
||||
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY_INIT)
|
||||
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY)
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<ClInclude Include="..\test\src\test_vec2.h" />
|
||||
<ClInclude Include="..\test\src\test_vec3.h" />
|
||||
<ClInclude Include="..\test\src\test_vec4.h" />
|
||||
<ClInclude Include="..\test\src\test_ray.h" />
|
||||
<ClInclude Include="..\test\tests.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -79,5 +79,8 @@
|
||||
<ClInclude Include="..\test\src\test_vec2.h">
|
||||
<Filter>src</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\test\src\test_ray.h">
|
||||
<Filter>src</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -34,6 +34,7 @@
|
||||
<ClCompile Include="..\src\plane.c" />
|
||||
<ClCompile Include="..\src\project.c" />
|
||||
<ClCompile Include="..\src\quat.c" />
|
||||
<ClCompile Include="..\src\ray.c" />
|
||||
<ClCompile Include="..\src\sphere.c" />
|
||||
<ClCompile Include="..\src\vec2.c" />
|
||||
<ClCompile Include="..\src\vec3.c" />
|
||||
@@ -61,6 +62,7 @@
|
||||
<ClInclude Include="..\include\cglm\call\plane.h" />
|
||||
<ClInclude Include="..\include\cglm\call\project.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\vec2.h" />
|
||||
<ClInclude Include="..\include\cglm\call\vec3.h" />
|
||||
@@ -80,12 +82,14 @@
|
||||
<ClInclude Include="..\include\cglm\plane.h" />
|
||||
<ClInclude Include="..\include\cglm\project.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\avx\affine.h" />
|
||||
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
|
||||
<ClInclude Include="..\include\cglm\simd\intrin.h" />
|
||||
<ClInclude Include="..\include\cglm\simd\neon\mat4.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\mat4.h" />
|
||||
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
|
||||
|
||||
@@ -92,6 +92,9 @@
|
||||
<ClCompile Include="..\src\vec2.c">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\ray.c">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\config.h">
|
||||
@@ -124,6 +127,9 @@
|
||||
<ClInclude Include="..\include\cglm\call\vec4.h">
|
||||
<Filter>include\cglm\call</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\cglm\call\ray.h">
|
||||
<Filter>include\cglm\call</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\cglm\simd\avx\affine.h">
|
||||
<Filter>include\cglm\simd\avx</Filter>
|
||||
</ClInclude>
|
||||
@@ -241,6 +247,9 @@
|
||||
<ClInclude Include="..\include\cglm\ease.h">
|
||||
<Filter>include\cglm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\cglm\ray.h">
|
||||
<Filter>include\cglm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\cglm\simd\arm.h">
|
||||
<Filter>include\cglm\simd</Filter>
|
||||
</ClInclude>
|
||||
@@ -346,5 +355,8 @@
|
||||
<ClInclude Include="..\include\cglm\struct\vec2-ext.h">
|
||||
<Filter>include\cglm\struct</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\cglm\simd\sse2\mat2.h">
|
||||
<Filter>include\cglm\simd\sse2</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user