mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -4,6 +4,12 @@ os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
arch:
|
||||
- amd64
|
||||
- ppc64le
|
||||
- s390x
|
||||
- arm64
|
||||
|
||||
sudo: required
|
||||
dist: trusty
|
||||
|
||||
|
||||
197
CMakeLists.txt
197
CMakeLists.txt
@@ -1,8 +1,9 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
project(cglm VERSION 0.7.4 LANGUAGES C)
|
||||
project(cglm VERSION 0.7.7 LANGUAGES C)
|
||||
|
||||
set(C_STANDARD 11)
|
||||
set(C_STANDARD_REQUIRED YES)
|
||||
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)
|
||||
@@ -21,125 +22,35 @@ if(CGLM_USE_C99)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL -DCGLM_EXPORTS -DCGLM_DLL)
|
||||
add_compile_options("/W3" "/Ox" "/Gy" "/Oi" "/TC" "/analyze")
|
||||
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL -DCGLM_EXPORTS -DCGLM_DLL)
|
||||
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" "-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()
|
||||
add_compile_options(-Wall -Werror -O3)
|
||||
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
|
||||
)
|
||||
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()
|
||||
|
||||
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
|
||||
)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
set(HEADERS_SIMD
|
||||
include/cglm/simd/intrin.h
|
||||
include/cglm/simd/x86.h
|
||||
include/cglm/simd/arm.h
|
||||
)
|
||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||
include(CPack)
|
||||
|
||||
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
|
||||
# Target Start
|
||||
add_library(${PROJECT_NAME}
|
||||
${CGLM_BUILD}
|
||||
src/euler.c
|
||||
src/affine.c
|
||||
@@ -161,35 +72,45 @@ add_library(cglm
|
||||
src/curve.c
|
||||
src/bezier.c
|
||||
src/ray.c
|
||||
src/affine2d.c
|
||||
)
|
||||
|
||||
set_target_properties(cglm PROPERTIES VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||
|
||||
target_include_directories(cglm PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
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
|
||||
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}
|
||||
NAMESPACE ${PROJECT_NAME}::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake)
|
||||
|
||||
|
||||
15
Makefile.am
15
Makefile.am
@@ -12,7 +12,6 @@ AM_CFLAGS = -Wall \
|
||||
-O3 \
|
||||
-Wstrict-aliasing=2 \
|
||||
-fstrict-aliasing \
|
||||
-pedantic \
|
||||
-Werror=strict-prototypes
|
||||
|
||||
lib_LTLIBRARIES = libcglm.la
|
||||
@@ -22,7 +21,10 @@ checkLDFLAGS = -L./.libs \
|
||||
-lm \
|
||||
-lcglm
|
||||
checkCFLAGS = $(AM_CFLAGS) \
|
||||
-I./include
|
||||
-std=gnu11 \
|
||||
-O3 \
|
||||
-DCGLM_DEFINE_PRINTS \
|
||||
-I./include
|
||||
|
||||
check_PROGRAMS = test/tests
|
||||
TESTS = $(check_PROGRAMS)
|
||||
@@ -64,7 +66,8 @@ cglm_HEADERS = include/cglm/version.h \
|
||||
include/cglm/curve.h \
|
||||
include/cglm/bezier.h \
|
||||
include/cglm/applesimd.h \
|
||||
include/cglm/ray.h
|
||||
include/cglm/ray.h \
|
||||
include/cglm/affine2d.h
|
||||
|
||||
cglm_calldir=$(includedir)/cglm/call
|
||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
@@ -86,7 +89,8 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/ease.h \
|
||||
include/cglm/call/curve.h \
|
||||
include/cglm/call/bezier.h \
|
||||
include/cglm/call/ray.h
|
||||
include/cglm/call/ray.h \
|
||||
include/cglm/call/affine2d.h
|
||||
|
||||
cglm_simddir=$(includedir)/cglm/simd
|
||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||
@@ -150,7 +154,8 @@ libcglm_la_SOURCES=\
|
||||
src/ease.c \
|
||||
src/curve.c \
|
||||
src/bezier.c \
|
||||
src/ray.c
|
||||
src/ray.c \
|
||||
src/affine2d.c
|
||||
|
||||
test_tests_SOURCES=\
|
||||
test/runner.c \
|
||||
|
||||
@@ -179,6 +179,8 @@ target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||
cglm)
|
||||
|
||||
add_subdirectory(external/cglm/)
|
||||
|
||||
# or you can use find_package to configure cglm
|
||||
```
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.7.4], [info@recp.me])
|
||||
AC_INIT([cglm], [0.7.7], [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.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.. default-domain:: C
|
||||
|
||||
affine transform matrix (specialized functions)
|
||||
3D Affine Transform Matrix (specialized functions)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine-mat.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.. default-domain:: C
|
||||
|
||||
affine transforms
|
||||
3D Affine Transforms
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine.h
|
||||
@@ -45,6 +45,8 @@ The implementation would be:
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||
|
||||
.. _TransformsOrder:
|
||||
|
||||
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-mat
|
||||
affine2d
|
||||
cam
|
||||
frustum
|
||||
box
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.7.4'
|
||||
version = u'0.7.7'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.7.4'
|
||||
release = u'0.7.7'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -156,16 +156,22 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[in]* **m** mat4 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[in]* **last** 4th item to make it vec4
|
||||
| *[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:
|
||||
| *[in]* **m** mat4 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** vec3 (result, column vector)
|
||||
| *[in]* **m** mat4(affine transform)
|
||||
| *[in]* **v** vec3
|
||||
| *[in]* **last** 4th item to make it vec4
|
||||
| *[out]* **dest** result vector (vec3)
|
||||
|
||||
.. c:function:: void glm_mat4_trace(mat4 m)
|
||||
|
||||
|
||||
@@ -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.**
|
||||
|
||||
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?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
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 */
|
||||
@@ -32,6 +32,7 @@ extern "C" {
|
||||
#include "call/curve.h"
|
||||
#include "call/bezier.h"
|
||||
#include "call/ray.h"
|
||||
#include "call/affine2d.h"
|
||||
|
||||
#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 */
|
||||
@@ -31,5 +31,6 @@
|
||||
#include "curve.h"
|
||||
#include "bezier.h"
|
||||
#include "ray.h"
|
||||
#include "affine2d.h"
|
||||
|
||||
#endif /* cglm_h */
|
||||
|
||||
@@ -8,8 +8,13 @@
|
||||
#ifndef cglm_common_h
|
||||
#define cglm_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
#define _CRT_SECURE_NO_WARNINGS /* 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 <stddef.h>
|
||||
@@ -35,4 +40,12 @@
|
||||
#include "types.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 */
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
CGLM_INLINE
|
||||
void
|
||||
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
|
||||
void
|
||||
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
|
||||
void
|
||||
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];
|
||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||
vec3 res;
|
||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * 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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -31,6 +31,7 @@ extern "C" {
|
||||
#include "struct/project.h"
|
||||
#include "struct/sphere.h"
|
||||
#include "struct/curve.h"
|
||||
#include "struct/affine2d.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
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 "../mat2.h"
|
||||
|
||||
#define GLMS_MAT2_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 1.0f}
|
||||
#define GLMS_MAT2_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f}
|
||||
#define GLMS_MAT2_IDENTITY_INIT {GLM_MAT2_IDENTITY_INIT}
|
||||
#define GLMS_MAT2_ZERO_INIT {GLM_MAT2_ZERO_INIT}
|
||||
|
||||
/* for C only */
|
||||
#define GLMS_MAT2_IDENTITY ((mat3s)GLMS_MAT2_IDENTITY_INIT)
|
||||
|
||||
@@ -289,7 +289,7 @@ glm_smoothinterpc(float from, float to, float t) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_eq(float a, float b) {
|
||||
return fabsf(a - b) <= FLT_EPSILON;
|
||||
return fabsf(a - b) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -61,8 +61,8 @@ glm_vec2_eq(vec2 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_vec2_eq_eps(vec2 v, float val) {
|
||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= FLT_EPSILON;
|
||||
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -73,7 +73,7 @@ glm_vec2_eq_eps(vec2 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
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
|
||||
bool
|
||||
glm_vec2_eqv_eps(vec2 a, vec2 b) {
|
||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON;
|
||||
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -81,9 +81,9 @@ glm_vec3_eq(vec3 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_vec3_eq_eps(vec3 v, float val) {
|
||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[2] - val) <= FLT_EPSILON;
|
||||
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -94,7 +94,7 @@ glm_vec3_eq_eps(vec3 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
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
|
||||
bool
|
||||
glm_vec3_eqv_eps(vec3 a, vec3 b) {
|
||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
||||
&& fabsf(a[2] - b[2]) <= FLT_EPSILON;
|
||||
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -92,10 +92,10 @@ glm_vec4_eq(vec4 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_vec4_eq_eps(vec4 v, float val) {
|
||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[2] - val) <= FLT_EPSILON
|
||||
&& fabsf(v[3] - val) <= FLT_EPSILON;
|
||||
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON
|
||||
&& fabsf(v[3] - val) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -106,9 +106,7 @@ glm_vec4_eq_eps(vec4 v, float val) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_vec4_eq_all(vec4 v) {
|
||||
return v[0] == v[1]
|
||||
&& v[0] == v[2]
|
||||
&& v[0] == v[3];
|
||||
return glm_vec4_eq_eps(v, v[0]);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -135,10 +133,10 @@ glm_vec4_eqv(vec4 a, vec4 b) {
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_vec4_eqv_eps(vec4 a, vec4 b) {
|
||||
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
||||
&& fabsf(a[2] - b[2]) <= FLT_EPSILON
|
||||
&& fabsf(a[3] - b[3]) <= FLT_EPSILON;
|
||||
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON
|
||||
&& fabsf(a[3] - b[3]) <= GLM_FLT_EPSILON;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -602,7 +602,7 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) {
|
||||
_mm_set1_ps(s))));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||
vsubq_f32(vld1q_f32(a),
|
||||
vmulq_f32(vld1q_f32(a),
|
||||
vdupq_n_f32(s))));
|
||||
#else
|
||||
dest[0] += a[0] * s;
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CGLM_VERSION_MAJOR 0
|
||||
#define CGLM_VERSION_MINOR 7
|
||||
#define CGLM_VERSION_PATCH 4
|
||||
#define CGLM_VERSION_PATCH 7
|
||||
|
||||
#endif /* cglm_version_h */
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -16,6 +16,7 @@ set(TEST_MAIN tests)
|
||||
set(TEST_RUNNER_PARAMS "")
|
||||
|
||||
add_executable(${TEST_MAIN} ${TESTFILES})
|
||||
target_compile_definitions(${TEST_MAIN} PRIVATE CGLM_DEFINE_PRINTS=1)
|
||||
|
||||
target_link_libraries(${TEST_MAIN} PRIVATE cglm m)
|
||||
target_include_directories(${TEST_MAIN} PRIVATE
|
||||
|
||||
@@ -8,8 +8,13 @@
|
||||
#ifndef tests_common_h
|
||||
#define tests_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
#define _CRT_SECURE_NO_WARNINGS /* 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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -33,6 +38,8 @@ typedef struct test_entry_t {
|
||||
int show_output;
|
||||
} test_entry_t;
|
||||
|
||||
#ifndef GLM_TESTS_NO_COLORFUL_OUTPUT
|
||||
|
||||
#define RESET "\033[0m"
|
||||
#define BLACK "\033[30m" /* Black */
|
||||
#define RED "\033[31m" /* Red */
|
||||
@@ -51,6 +58,28 @@ typedef struct test_entry_t {
|
||||
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
|
||||
#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_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
|
||||
#define TEST_LIST static test_entry_t tests[] =
|
||||
|
||||
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;
|
||||
|
||||
glm_perspective(fovy, aspect, nearVal, farVal, proj);
|
||||
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < FLT_EPSILON)
|
||||
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < FLT_EPSILON)
|
||||
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < FLT_EPSILON)
|
||||
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
|
||||
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
|
||||
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
|
||||
|
||||
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
|
||||
bool
|
||||
test_eq(float a, float b) {
|
||||
return fabsf(a - b) <= 1e-6;
|
||||
return fabsf(a - b) <= GLM_FLT_EPSILON * 10;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
#include "test_project.h"
|
||||
#include "test_plane.h"
|
||||
#include "test_affine.h"
|
||||
#include "test_affine2d.h"
|
||||
#include "test_affine_mat.h"
|
||||
#include "test_ray.h"
|
||||
#include "test_camera.h"
|
||||
|
||||
#undef GLM
|
||||
#undef GLM_PREFIX
|
||||
@@ -44,8 +46,10 @@
|
||||
#include "test_project.h"
|
||||
#include "test_plane.h"
|
||||
#include "test_affine.h"
|
||||
#include "test_affine2d.h"
|
||||
#include "test_affine_mat.h"
|
||||
#include "test_ray.h"
|
||||
#include "test_camera.h"
|
||||
|
||||
#undef GLM
|
||||
#undef GLM_PREFIX
|
||||
|
||||
67
test/tests.h
67
test/tests.h
@@ -70,6 +70,33 @@ TEST_DECLARE(glmc_uniscaled)
|
||||
TEST_DECLARE(glmc_decompose_rs)
|
||||
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 */
|
||||
TEST_DECLARE(glm_mat4_ucopy)
|
||||
TEST_DECLARE(glm_mat4_copy)
|
||||
@@ -199,6 +226,10 @@ TEST_DECLARE(glmc_mat2_rmc)
|
||||
TEST_DECLARE(camera_lookat)
|
||||
TEST_DECLARE(camera_decomp)
|
||||
|
||||
TEST_DECLARE(glm_frustum)
|
||||
|
||||
TEST_DECLARE(glmc_frustum)
|
||||
|
||||
/* project */
|
||||
TEST_DECLARE(glm_unprojecti)
|
||||
TEST_DECLARE(glm_unproject)
|
||||
@@ -760,7 +791,34 @@ TEST_LIST {
|
||||
TEST_ENTRY(glmc_uniscaled)
|
||||
TEST_ENTRY(glmc_decompose_rs)
|
||||
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 */
|
||||
TEST_ENTRY(glm_mat4_ucopy)
|
||||
TEST_ENTRY(glm_mat4_copy)
|
||||
@@ -890,6 +948,10 @@ TEST_LIST {
|
||||
TEST_ENTRY(camera_lookat)
|
||||
TEST_ENTRY(camera_decomp)
|
||||
|
||||
TEST_ENTRY(glm_frustum)
|
||||
|
||||
TEST_ENTRY(glmc_frustum)
|
||||
|
||||
/* project */
|
||||
TEST_ENTRY(glm_unprojecti)
|
||||
TEST_ENTRY(glm_unproject)
|
||||
@@ -992,6 +1054,7 @@ TEST_LIST {
|
||||
/* bezier */
|
||||
TEST_ENTRY(bezier)
|
||||
|
||||
/* vec2 */
|
||||
/* Macros */
|
||||
|
||||
TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT)
|
||||
@@ -1070,7 +1133,6 @@ TEST_LIST {
|
||||
TEST_ENTRY(glmc_vec2_lerp)
|
||||
|
||||
/* vec3 */
|
||||
|
||||
/* Macros */
|
||||
|
||||
TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT)
|
||||
@@ -1236,7 +1298,8 @@ TEST_LIST {
|
||||
TEST_ENTRY(glmc_vec3_sqrt)
|
||||
|
||||
/* vec4 */
|
||||
|
||||
/* Macros */
|
||||
|
||||
TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT)
|
||||
TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT)
|
||||
TEST_ENTRY(MACRO_GLM_VEC4_ONE)
|
||||
|
||||
@@ -145,6 +145,7 @@
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
@@ -162,6 +163,7 @@
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
|
||||
@@ -247,6 +247,7 @@
|
||||
<PrecompiledHeaderFile />
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
<EnablePREfast>true</EnablePREfast>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
@@ -266,6 +267,7 @@
|
||||
<PrecompiledHeaderFile />
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
<EnablePREfast>true</EnablePREfast>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
|
||||
Reference in New Issue
Block a user