Compare commits

...

36 Commits

Author SHA1 Message Date
Recep Aslantas
79c44fdbfa drop pedantic from C Flags and allow extensions
this will also suppress warnings on test target
2020-05-29 13:01:36 +03:00
Recep Aslantas
c32e986497 mat2: suppress warnings for initializing mat2 sruct 2020-05-29 12:51:45 +03:00
Recep Aslantas
b953fcf1bd ci, travis: add multiple cpu arch 2020-05-29 00:47:18 +03:00
Recep Aslantas
c0a4c245f0 tests: add test for frustum 2020-05-28 14:19:35 +03:00
Recep Aslantas
acc0885e52 tests: add option to disable colors in test output
* because some terminals may not support colors, in that case, colors can be disabled by defining `GLM_TESTS_NO_COLORFUL_OUTPUT`
2020-05-28 11:47:13 +03:00
Recep Aslantas
f49e8f9991 neon: fix vec4_muladds (critical) 2020-05-26 23:03:32 +03:00
Recep Aslantas
d2e5a3cd5b use epsilon to compare vec2/vec3/vec4_eq_all 2020-05-26 23:02:58 +03:00
Recep Aslantas
a1485a14f6 option to override FLT_EPSILON with GLM_FLT_EPSILON 2020-05-26 23:00:00 +03:00
Recep Aslantas
271e3b15d6 Merge branch 'cmake' 2020-05-25 17:07:46 +03:00
Recep Aslantas
74cf89a82f build, cmake: update cmake to export Config to use find_package() 2020-05-25 17:06:48 +03:00
Recep Aslantas
8698082411 Merge pull request #143 from recp/cmake
Improve CMakeLists.txt
2020-05-22 00:01:42 +03:00
Recep Aslantas
799de548f4 Update CMakeLists.txt 2020-05-18 16:04:15 +03:00
Recep Aslantas
671dae3e22 now working on v0.7.6 2020-05-18 15:55:04 +03:00
Recep Aslantas
7e142132bf win: suppress warning; C4005: '_CRT_SECURE_NO_WARNINGS': macro redefinition 2020-05-17 19:24:48 +03:00
Recep Aslantas
0ccd58da01 docs: add clarification/troubleshooting for a crash type 2020-05-16 22:37:16 +03:00
Recep Aslantas
4211c230cc now working on v0.7.5 2020-05-16 22:11:54 +03:00
Recep Aslantas
269bdb3dbd fix arm neon build 2020-05-11 20:19:05 +03:00
Recep Aslantas
b032b803ca build, cmake: use PROJECT_VERSION_** to set so version instead of custom variables 2020-05-10 23:54:55 +03:00
Recep Aslantas
26a638e11d io: make print functions macro to supress unused parameter warrnings 2020-05-03 14:10:24 +03:00
Recep Aslantas
099522ada3 fix LICENSE alignments 2020-05-02 22:32:57 +03:00
Recep Aslantas
4903dd62ea now working on v0.7.4 2020-05-02 22:32:53 +03:00
Recep Aslantas
95161f7776 Merge pull request #140 from recp/print-io
Print Improvements
2020-05-01 01:12:16 +03:00
Recep Aslantas
f0942c13a1 remove redundant typedef. 2020-05-01 01:07:18 +03:00
Recep Aslantas
8eddeb77d0 win: fix print function for _DEBUG and supress warnings 2020-05-01 01:03:20 +03:00
Recep Aslantas
cbed29820b ios: update docs for prints 2020-04-30 23:49:38 +03:00
Recep Aslantas
3ec6bad5b3 io: open library-called print functions 2020-04-30 23:40:21 +03:00
Recep Aslantas
fefc3dc32d io: print has been maden optional to DEBUG or to CGLM_DEFINE_PRINTS 2020-04-30 23:38:27 +03:00
Recep Aslantas
203d40208c io: new way to print items
* 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
2020-04-30 23:37:51 +03:00
Recep Aslantas
c45445c613 suppress documentation warnings 2020-04-30 10:15:55 +03:00
Recep Aslantas
73c6766806 Update .gitignore 2020-04-30 10:14:12 +03:00
Recep Aslantas
65dff25ed5 build: add version info to cmake 2020-04-28 00:33:29 +03:00
Recep Aslantas
c2584c0fe6 now working on v0.7.3 2020-04-28 00:20:04 +03:00
Recep Aslantas
bd951f96be Update cglm.podspec 2020-04-28 00:18:15 +03:00
Recep Aslantas
1200372ced vscode settings 2020-04-28 00:04:24 +03:00
Recep Aslantas
75a5ca153d Merge branch 'master' of https://github.com/recp/cglm 2020-04-27 22:46:22 +03:00
Recep Aslantas
5a9593d9bc update docs 2020-04-27 22:30:52 +03:00
35 changed files with 476 additions and 274 deletions

2
.gitignore vendored
View File

@@ -73,3 +73,5 @@ cglm-test-ios*
test-driver test-driver
Default-568h@2x.png Default-568h@2x.png
build/ build/
conftest.dir/*
confdefs.h

View File

@@ -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
View File

@@ -0,0 +1,4 @@
{
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
}

View File

@@ -1,8 +1,9 @@
cmake_minimum_required(VERSION 3.8.2) cmake_minimum_required(VERSION 3.8.2)
project(cglm LANGUAGES C) project(cglm VERSION 0.7.6 LANGUAGES C)
set(C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(C_STANDARD_REQUIRED YES) set(CMAKE_C_STANDARD_REQUIRED YES)
set(DEFAULT_BUILD_TYPE "Release")
set(CGLM_BUILD) set(CGLM_BUILD)
option(CGLM_SHARED "Shared build" ON) option(CGLM_SHARED "Shared build" ON)
@@ -22,124 +23,26 @@ endif()
if(MSVC) if(MSVC)
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL -DCGLM_EXPORTS -DCGLM_DLL) add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL -DCGLM_EXPORTS -DCGLM_DLL)
add_compile_options("/W3" "/Ox" "/Gy" "/Oi" "/TC" "/analyze") add_compile_options(/W3 /Ox /Gy /Oi /TC)
else() else()
add_compile_options("-Wall" "-Werror" "-std=gnu11" "-O3") add_compile_options(-Wall -Werror -O3)
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
# Currently, nothing special to be seen here.
else()
add_compile_options("-Werror=strict-prototypes")
endif()
endif() endif()
set(HEADERS if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
include/cglm/version.h message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
include/cglm/common.h set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
include/cglm/types.h # Set the possible values of build type for cmake-gui
include/cglm/types-struct.h set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
include/cglm/cglm.h endif()
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(GNUInstallDirs)
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 set(CPACK_PROJECT_NAME ${PROJECT_NAME})
include/cglm/simd/intrin.h set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include/cglm/simd/x86.h include(CPack)
include/cglm/simd/arm.h
)
set(HEADERS_SIMD_SSE2 # Target Start
include/cglm/simd/sse2/affine.h add_library(${PROJECT_NAME}
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} ${CGLM_BUILD}
src/euler.c src/euler.c
src/affine.c src/affine.c
@@ -163,30 +66,42 @@ add_library(cglm
src/ray.c src/ray.c
) )
target_include_directories(cglm PUBLIC set_target_properties(${PROJECT_NAME} PROPERTIES
${CMAKE_CURRENT_SOURCE_DIR}/include 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
) )
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 # Test Configuration
if(CGLM_USE_TEST) if(CGLM_USE_TEST)
include(CTest)
enable_testing() enable_testing()
add_subdirectory(test) add_subdirectory(test)
endif() 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}
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake)

View File

@@ -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

View File

@@ -179,6 +179,8 @@ target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm) cglm)
add_subdirectory(external/cglm/) add_subdirectory(external/cglm/)
# or you can use find_package to configure cglm
``` ```
### Unix (Autotools) ### Unix (Autotools)

View File

@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
# Description # Description
s.name = "cglm" s.name = "cglm"
s.version = "0.6.1" s.version = "0.7.2"
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C" s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
s.description = <<-DESC s.description = <<-DESC
cglm is math library for graphics programming for C. 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. 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.

View File

@@ -7,7 +7,7 @@
#***************************************************************************** #*****************************************************************************
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([cglm], [0.7.2], [info@recp.me]) AC_INIT([cglm], [0.7.6], [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.

View File

@@ -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. 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 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): Unix (Autotools):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -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.2' version = u'0.7.6'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = u'0.7.2' release = u'0.7.6'
# 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.

View File

@@ -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...

View File

@@ -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):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -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. - 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**
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"

View File

@@ -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?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -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

View File

@@ -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>
@@ -34,4 +40,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 */

View File

@@ -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]) {

View File

@@ -17,67 +17,99 @@
#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)
#include "common.h" #include "common.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.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 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 +119,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 +165,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 +187,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 +209,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 +227,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 +249,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 +273,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
} }
#elif !defined(CGLM_NO_PRINTS_NOOP)
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
/* NOOP: Remove print from DEBUG */
#define glm_mat4_print(...)
#define glm_mat3_print(...)
#define glm_mat2_print(...)
#define glm_vec4_print(...)
#define glm_vec3_print(...)
#define glm_ivec3_print(...)
#define glm_vec2_print(...)
#define glm_versor_print(...)
#define glm_aabb_print(...)
#endif
#endif /* cglm_io_h */ #endif /* cglm_io_h */

View File

@@ -29,7 +29,7 @@
* @param[in] v1 second vertex of triangle * @param[in] v1 second vertex of triangle
* @param[in] v2 third vertex of triangle * @param[in] v2 third vertex of triangle
* @param[in, out] d distance to intersection * @param[in, out] d distance to intersection
* @param[out] intersection whether there is intersection * @return whether there is intersection
*/ */
CGLM_INLINE CGLM_INLINE
@@ -46,34 +46,30 @@ glm_ray_triangle(vec3 origin,
glm_vec3_sub(v1, v0, edge1); glm_vec3_sub(v1, v0, edge1);
glm_vec3_sub(v2, v0, edge2); glm_vec3_sub(v2, v0, edge2);
glm_vec3_cross(direction, edge2, p); glm_vec3_cross(direction, edge2, p);
det = glm_vec3_dot(edge1, p); det = glm_vec3_dot(edge1, p);
if (det > -epsilon && det < epsilon) if (det > -epsilon && det < epsilon)
return 0; return false;
inv_det = 1.0f / det; inv_det = 1.0f / det;
glm_vec3_sub(origin, v0, t); glm_vec3_sub(origin, v0, t);
u = inv_det * glm_vec3_dot(t, p); u = inv_det * glm_vec3_dot(t, p);
if (u < 0.0f || u > 1.0f) if (u < 0.0f || u > 1.0f)
return 0; return false;
glm_vec3_cross(t, edge1, q); glm_vec3_cross(t, edge1, q);
v = inv_det * glm_vec3_dot(direction, q); v = inv_det * glm_vec3_dot(direction, q);
if (v < 0.0f || u + v > 1.0f) if (v < 0.0f || u + v > 1.0f)
return 0; return false;
dist = inv_det * glm_vec3_dot(edge2, q); dist = inv_det * glm_vec3_dot(edge2, q);
if (d) if (d)
*d = dist; *d = dist;
return dist > epsilon; return dist > epsilon;
} }

View File

@@ -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)

View File

@@ -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;
} }
/*! /*!

View File

@@ -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;
} }
/*! /*!

View File

@@ -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;
} }
/*! /*!

View File

@@ -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;
} }
/*! /*!

View File

@@ -602,7 +602,7 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) {
_mm_set1_ps(s)))); _mm_set1_ps(s))));
#elif defined(CGLM_NEON_FP) #elif defined(CGLM_NEON_FP)
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest), vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
vsubq_f32(vld1q_f32(a), vmulq_f32(vld1q_f32(a),
vdupq_n_f32(s)))); vdupq_n_f32(s))));
#else #else
dest[0] += a[0] * s; dest[0] += a[0] * s;
@@ -680,7 +680,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];

View File

@@ -10,6 +10,6 @@
#define CGLM_VERSION_MAJOR 0 #define CGLM_VERSION_MAJOR 0
#define CGLM_VERSION_MINOR 7 #define CGLM_VERSION_MINOR 7
#define CGLM_VERSION_PATCH 2 #define CGLM_VERSION_PATCH 6
#endif /* cglm_version_h */ #endif /* cglm_version_h */

View File

@@ -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_

View File

@@ -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"

View File

@@ -8,6 +8,14 @@
#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
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@@ -30,6 +38,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 +58,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[] =

View File

@@ -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
View 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
}

View File

@@ -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

View File

@@ -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"

View File

@@ -24,6 +24,7 @@
#include "test_affine.h" #include "test_affine.h"
#include "test_affine_mat.h" #include "test_affine_mat.h"
#include "test_ray.h" #include "test_ray.h"
#include "test_camera.h"
#undef GLM #undef GLM
#undef GLM_PREFIX #undef GLM_PREFIX
@@ -46,6 +47,7 @@
#include "test_affine.h" #include "test_affine.h"
#include "test_affine_mat.h" #include "test_affine_mat.h"
#include "test_ray.h" #include "test_ray.h"
#include "test_camera.h"
#undef GLM #undef GLM
#undef GLM_PREFIX #undef GLM_PREFIX

View File

@@ -199,6 +199,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)
@@ -890,6 +894,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)
@@ -992,6 +1000,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)
@@ -1070,7 +1079,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)
@@ -1236,7 +1244,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)