Vulkan spec

This commit is contained in:
2026-05-25 11:04:30 +01:00
commit d86a518b7d
375 changed files with 77089 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
cmake_minimum_required(VERSION 3.8.2)
# List all files containing tests. (Change as needed)
set(TESTFILES
runner.c
src/test_euler.c
src/test_bezier.c
src/test_struct.c
src/test_clamp.c
src/test_common.c
src/tests.c
)
set(TEST_MAIN tests)
set(TEST_RUNNER_PARAMS "")
add_executable(${TEST_MAIN} ${TESTFILES})
target_compile_definitions(${TEST_MAIN} PRIVATE CGLM_DEFINE_PRINTS=1)
if(CMAKE_SYSTEM_NAME STREQUAL WASI)
target_compile_definitions(${TEST_MAIN} PRIVATE _WASI_EMULATED_PROCESS_CLOCKS=1)
target_link_options(${TEST_MAIN} PRIVATE "-lwasi-emulated-process-clocks")
endif()
if(NOT MSVC)
target_link_libraries(${TEST_MAIN} PRIVATE m)
endif()
target_link_libraries(${TEST_MAIN} PRIVATE cglm)
target_include_directories(${TEST_MAIN} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/include
${CMAKE_CURRENT_LIST_DIR}/src
)
set_target_properties(${TEST_MAIN} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
if(LDFLAGS)
target_compile_options(${TEST_MAIN} PRIVATE ${LDFLAGS})
endif()
add_test(
NAME cglm.${TEST_MAIN}
COMMAND ${TEST_MAIN} ${TEST_RUNNER_PARAMS})
add_custom_target(check
make
COMMAND ${CMAKE_CTEST_COMMAND} -V
DEPENDS cglm)
+159
View File
@@ -0,0 +1,159 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef tests_common_h
#define tests_common_h
#ifndef _USE_MATH_DEFINES
# define _USE_MATH_DEFINES /* for windows */
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS /* for windows */
#endif
#ifndef _GNU_SOURCE
# define _GNU_SOURCE /* for drand48() */
#endif
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# define CGLM_CLIPSPACE_INCLUDE_ALL
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cglm/cglm.h>
#include <cglm/struct.h>
#include <cglm/call.h>
typedef struct test_status_t {
const char *msg;
int status;
} test_status_t;
typedef test_status_t (*fntest)(void);
typedef struct test_entry_t {
char *name;
fntest entry;
int ret;
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 */
#define GREEN "\033[32m" /* Green */
#define YELLOW "\033[33m" /* Yellow */
#define BLUE "\033[34m" /* Blue */
#define MAGENTA "\033[35m" /* Magenta */
#define CYAN "\033[36m" /* Cyan */
#define WHITE "\033[37m" /* White */
#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
#define BOLDRED "\033[1m\033[31m" /* Bold Red */
#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
#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[] =
/* __VA_ARGS__ workaround for MSVC: https://stackoverflow.com/a/5134656 */
#define EXPAND(x) x
#define TEST_OK 1
#define TEST_SUCCESS return (test_status_t){NULL, TEST_OK};
#define TEST_IMPL_ARG1(FUN) \
test_status_t test_ ## FUN (void); \
test_status_t test_ ## FUN()
#define TEST_IMPL_ARG2(PREFIX, FUN) TEST_IMPL_ARG1(PREFIX ## FUN)
#define TEST_IMPL_ARG3(arg1, arg2, arg3, ...) arg3
#define TEST_IMPL_CHOOSER(...) \
EXPAND(TEST_IMPL_ARG3(__VA_ARGS__, TEST_IMPL_ARG2, TEST_IMPL_ARG1,))
#define TEST_IMPL(...) EXPAND(TEST_IMPL_CHOOSER(__VA_ARGS__)(__VA_ARGS__))
#define ASSERT_EXT(expr, msg) \
if (!(expr)) { \
fprintf(stderr, \
RED " assert fail" RESET \
" in " BOLDCYAN "%s " RESET \
"on " BOLDMAGENTA "line %d" RESET \
" : " BOLDWHITE " ASSERT(%s)\n" RESET, \
__FILE__, \
__LINE__, \
#expr); \
return (test_status_t){msg, 0}; \
}
#define ASSERT_ARG1(expr) ASSERT_EXT(expr, NULL)
#define ASSERT_ARG2(expr, msg) ASSERT_EXT(expr, msg)
#define ASSERT_ARG3(arg1, arg2, arg3, ...) arg3
#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1,)
#define ASSERT(...) do { ASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__) } while(0);
#define ASSERTIFY(expr) do { \
test_status_t ts; \
ts = expr; \
if (ts.status != TEST_OK) { \
fprintf(stderr, \
RED " assert fail" RESET \
" in " BOLDCYAN "%s " RESET \
"on " BOLDMAGENTA "line %d" RESET \
" : " BOLDWHITE " ASSERTIFY(%s)\n" RESET, \
__FILE__, \
__LINE__, \
#expr); \
return (test_status_t){ts.msg, 0}; \
} \
} while(0);
#if defined(_WIN32) || defined(__MINGW32__) || defined(__MINGW64__)
# define drand48() ((float)(rand() / (RAND_MAX + 1.0)))
# define OK_TEXT "ok:"
# define FAIL_TEXT "fail:"
# define FINAL_TEXT "^_^"
#else
# define OK_TEXT "✔︎"
# define FAIL_TEXT "𐄂"
# define FINAL_TEXT "🎉"
#endif
#endif /* common_h */
+100
View File
@@ -0,0 +1,100 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "include/common.h"
#include "tests.h"
#include <stdlib.h>
#include <time.h>
#include <string.h>
int
main(int argc, const char * argv[]) {
test_entry_t *entry;
test_status_t st;
int32_t i, count, passed, failed, maxlen;
double start, end, elapsed, total;
(void)argc;
(void)argv;
passed = failed = maxlen = 0;
total = 0.0;
count = sizeof(tests) / sizeof(tests[0]);
fprintf(stderr, CYAN "\nWelcome to cglm tests ( " RESET);
glm_arch_print(stderr);
fprintf(stderr, CYAN " )\n\n" RESET);
srand((unsigned int)time(NULL));
for (i = 0; i < count; i++) {
int32_t len;
entry = tests + i;
len = (int32_t)strlen(entry->name);
maxlen = GLM_MAX(maxlen, len);
}
maxlen += 5;
fprintf(stderr,
BOLDWHITE " %-*s %-*s\n",
maxlen, "Test Name", maxlen, "Elapsed Time");
for (i = 0; i < count; i++) {
entry = tests + i;
start = clock();
st = entry->entry();
end = clock();
elapsed = (end - start) / CLOCKS_PER_SEC;
total += elapsed;
if (!st.status) {
fprintf(stderr,
BOLDRED " " FAIL_TEXT BOLDWHITE " %s " RESET, entry->name);
if (st.msg) {
fprintf(stderr,
YELLOW "- %s" RESET,
st.msg);
}
fprintf(stderr, "\n");
failed++;
} else {
fprintf(stderr, GREEN " " OK_TEXT RESET " %-*s ", maxlen, entry->name);
if (elapsed > 0.01)
fprintf(stderr, YELLOW "%.2fs", elapsed);
else
fprintf(stderr, "0");
fprintf(stderr, "\n" RESET);
passed++;
}
}
if (failed == 0) {
fprintf(stderr,
BOLDGREEN "\n All tests passed " FINAL_TEXT "\n" RESET);
}
fprintf(stderr,
CYAN "\ncglm test results (%0.2fs):\n" RESET
"--------------------------\n"
MAGENTA "%d" RESET " tests ran, "
GREEN "%d" RESET " passed, "
RED "%d" RESET " failed\n\n" RESET,
total,
count,
passed,
failed);
return failed;
}
+28
View File
@@ -0,0 +1,28 @@
/*
* 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"
#ifndef CGLM_TEST_AABB2D_ONCE
#define CGLM_TEST_AABB2D_ONCE
/* Macros */
/* Deprecated */
#endif /* CGLM_TEST_VEC4_ONCE */
/* --- */
TEST_IMPL(GLM_PREFIX, aabb2d_sizev) {
vec2 a[2] = {{10.0f, 10.0f}, {20.0f, 20.0f}};
vec2 size = {0};
GLM(aabb2d_sizev)(a, size);
ASSERTIFY(test_assert_vec2_eq(size, (vec2){10.0f, 10.0f}))
TEST_SUCCESS
}
+634
View File
@@ -0,0 +1,634 @@
/*
* 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, translate) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate)(m1, (vec3){13.0f, 11.0f, 7.0f});
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 10.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate)(m1, (vec3){1.0f, -1.0f, -5.0f});
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 12.0f))
ASSERT(test_eq(v2[2], 5.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate_to) {
mat4 m1, m2;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate_to)(m1, (vec3){13.0f, 11.0f, 7.0f}, m2);
glm_mat4_mulv(m2, v1, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 10.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate_to)(m1, (vec3){1.0f, -1.0f, -5.0f}, m2);
glm_mat4_mulv(m2, v2, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 12.0f))
ASSERT(test_eq(v2[2], 5.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate_x) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate_x)(m1, 13.0f);
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 2.0f))
ASSERT(test_eq(v2[2], 3.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate_x)(m1, -1.0f);
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], 2.0f))
ASSERT(test_eq(v2[2], 3.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate_y) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate_y)(m1, 11.0f);
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 3.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate_y)(m1, -1.0f);
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 12.0f))
ASSERT(test_eq(v2[2], 3.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate_z) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate_z)(m1, 7.0f);
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 2.0f))
ASSERT(test_eq(v2[2], 10.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate_z)(m1, -5.0f);
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 2.0f))
ASSERT(test_eq(v2[2], 5.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate_make) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(translate_make)(m1, (vec3){13.0f, 11.0f, 7.0f});
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 10.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(translate_make)(m1, (vec3){1.0f, -1.0f, -5.0f});
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 12.0f))
ASSERT(test_eq(v2[2], 5.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale_to) {
mat4 m1, m2;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(scale_to)(m1, (vec3){13.0f, 11.0f, 7.0f}, m2);
glm_mat4_mulv(m2, v1, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], 22.0f))
ASSERT(test_eq(v2[2], 21.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(scale_to)(m1, (vec3){1.0f, -1.0f, -5.0f}, m2);
glm_mat4_mulv(m2, v2, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], -22.0f))
ASSERT(test_eq(v2[2], -105.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale_make) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
GLM(scale_make)(m1, (vec3){13.0f, 11.0f, 7.0f});
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], 22.0f))
ASSERT(test_eq(v2[2], 21.0f))
ASSERT(test_eq(v2[3], 1.0f))
GLM(scale_make)(m1, (vec3){1.0f, -1.0f, -5.0f});
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], -22.0f))
ASSERT(test_eq(v2[2], -105.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(scale)(m1, (vec3){13.0f, 11.0f, 7.0f});
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], 22.0f))
ASSERT(test_eq(v2[2], 21.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(scale)(m1, (vec3){1.0f, -1.0f, -5.0f});
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], -22.0f))
ASSERT(test_eq(v2[2], -105.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale_uni) {
mat4 m1;
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
glm_mat4_identity(m1);
GLM(scale_uni)(m1, 13.0f);
glm_mat4_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 13.0f))
ASSERT(test_eq(v2[1], 26.0f))
ASSERT(test_eq(v2[2], 39.0f))
ASSERT(test_eq(v2[3], 1.0f))
glm_mat4_identity(m1);
GLM(scale_uni)(m1, -5.0f);
glm_mat4_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], -65.0f))
ASSERT(test_eq(v2[1], -130.0f))
ASSERT(test_eq(v2[2], -195.0f))
ASSERT(test_eq(v2[3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_x) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {0.0f, 1.0f, 0.0f, 1.0f}, v2 = {0.0f, 1.0f, 0.0f, 1.0f};
GLM(rotate_x)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_x)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 0.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_x)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_y) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f}, v2 = {1.0f, 0.0f, 0.0f, 1.0f};
GLM(rotate_y)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_y)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 0.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_y)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_z) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {0.0f, 1.0f, 0.0f, 1.0f}, v2 = {0.0f, 1.0f, 0.0f, 1.0f};
GLM(rotate_z)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 0.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_z)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 0.0f))
glm_vec3_copy(v2, v1);
GLM(rotate_z)(m1, GLM_PI_2f, m1);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 0.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_make) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
/* rotate X around Y = -Z */
GLM(rotate_make)(m1, GLM_PI_2f, GLM_YUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -1.0f))
/* rotate -Z around X = Y */
GLM(rotate_make)(m1, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 1.0f))
ASSERT(test_eq(v1[2], 0.0f))
/* rotate Y around X = +Z */
GLM(rotate_make)(m1, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT, m2 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
/* 360 deg */
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
ASSERTIFY(test_assert_mat4_eq(m1, m2))
/* rotate X around Y = -Z */
GLM(rotate)(m1, GLM_PI_2f, GLM_YUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -1.0f))
glm_mat4_identity(m1);
/* rotate -Z around X = Y */
GLM(rotate)(m1, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 1.0f))
ASSERT(test_eq(v1[2], 0.0f))
glm_mat4_identity(m1);
/* rotate Y around X = +Z */
GLM(rotate)(m1, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_at) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
GLM(rotate_at)(m1, (vec3){0.5f, 0.0f, 0.0f}, GLM_PI_2f, GLM_YUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.5f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -0.5f))
glm_mat4_identity(m1);
GLM(rotate_at)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_ZUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.5f))
ASSERT(test_eq(v1[2], -0.5f))
glm_mat4_identity(m1);
v1[0] = 1.0f;
v1[1] = 1.0f;
v1[2] = 1.0f;
GLM(rotate_at)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate_atm) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
GLM(rotate_atm)(m1, (vec3){0.5f, 0.0f, 0.0f}, GLM_PI_2f, GLM_YUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.5f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], -0.5f))
GLM(rotate_atm)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_ZUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.5f))
ASSERT(test_eq(v1[2], -0.5f))
v1[0] = 1.0f;
v1[1] = 1.0f;
v1[2] = 1.0f;
GLM(rotate_atm)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_XUP);
glm_mat4_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, decompose_scalev) {
mat4 m1;
vec3 s1;
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose_scalev)(m1, s1);
ASSERT(test_eq(s1[0], 7.0f))
ASSERT(test_eq(s1[1], 8.0f))
ASSERT(test_eq(s1[2], 9.0f))
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose_scalev)(m1, s1);
ASSERT(test_eq(s1[0], 49.0f))
ASSERT(test_eq(s1[1], 64.0f))
ASSERT(test_eq(s1[2], 81.0f))
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
ASSERT(test_eq(s1[0], 49.0f))
ASSERT(test_eq(s1[1], 64.0f))
ASSERT(test_eq(s1[2], 81.0f))
glm_translate(m1, (vec3){4.0f, 5.0f, 6.0f});
ASSERT(test_eq(s1[0], 49.0f))
ASSERT(test_eq(s1[1], 64.0f))
ASSERT(test_eq(s1[2], 81.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, uniscaled) {
mat4 m1;
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
ASSERT(!GLM(uniscaled)(m1))
GLM(scale_make)(m1, (vec3){7.0f, 7.0f, 7.0f});
ASSERT(GLM(uniscaled)(m1))
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
ASSERT(GLM(uniscaled)(m1))
glm_translate(m1, (vec3){4.0f, 5.0f, 6.0f});
ASSERT(GLM(uniscaled)(m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, decompose_rs) {
mat4 m1, m2, r;
vec3 s1;
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose_rs)(m1, r, s1);
ASSERT(test_eq(s1[0], 7.0f))
ASSERT(test_eq(s1[1], 8.0f))
ASSERT(test_eq(s1[2], 9.0f))
ASSERTIFY(test_assert_mat4_eq_identity(r));
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose_rs)(m1, r, s1);
ASSERT(test_eq(s1[0], 49.0f))
ASSERT(test_eq(s1[1], 64.0f))
ASSERT(test_eq(s1[2], 81.0f))
ASSERTIFY(test_assert_mat4_eq_identity(r));
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
ASSERT(test_eq(s1[0], 49.0f))
ASSERT(test_eq(s1[1], 64.0f))
ASSERT(test_eq(s1[2], 81.0f))
GLM(decompose_rs)(m1, r, s1);
glm_mat4_identity(m2);
glm_mat4_mul(m2, r, m2);
glm_scale(m2, s1);
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, decompose) {
mat4 m1, m2, r;
vec4 t;
vec3 s;
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose)(m1, t, r, s);
ASSERT(test_eq(s[0], 7.0f))
ASSERT(test_eq(s[1], 8.0f))
ASSERT(test_eq(s[2], 9.0f))
ASSERTIFY(test_assert_mat4_eq_identity(r));
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
GLM(decompose)(m1, t, r, s);
ASSERT(test_eq(s[0], 49.0f))
ASSERT(test_eq(s[1], 64.0f))
ASSERT(test_eq(s[2], 81.0f))
ASSERTIFY(test_assert_mat4_eq_identity(r));
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
ASSERT(test_eq(s[0], 49.0f))
ASSERT(test_eq(s[1], 64.0f))
ASSERT(test_eq(s[2], 81.0f))
GLM(decompose)(m1, t, r, s);
glm_mat4_identity(m2);
glm_mat4_mul(m2, r, m2);
glm_scale(m2, s);
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
glm_mat4_identity(m1);
glm_translate(m1, (vec3){56.0f, 13.0f, 90.0f});
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
glm_scale(m1, (vec3){12.0f, 34.0f, 23.0f});
GLM(decompose)(m1, t, r, s);
ASSERT(test_eq(t[0], 56.0f))
ASSERT(test_eq(t[1], 13.0f))
ASSERT(test_eq(t[2], 90.0f))
ASSERT(test_eq(s[0], 12.0f))
ASSERT(test_eq(s[1], 34.0f))
ASSERT(test_eq(s[2], 23.0f))
glm_mat4_identity(m2);
glm_translate(m2, t);
glm_mat4_mul(m2, r, m2);
glm_scale(m2, s);
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
TEST_SUCCESS
}
+310
View 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
}
+112
View File
@@ -0,0 +1,112 @@
/*
* 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"
#ifndef glm_affine_mat_test_guard
#define glm_affine_mat_test_guard
CGLM_INLINE
void
glm_inv_tr_raw(mat4 mat) {
CGLM_ALIGN_MAT mat3 r;
CGLM_ALIGN(8) vec3 t;
/* rotate */
glm_mat4_pick3t(mat, r);
glm_mat4_ins3(r, mat);
/* translate */
glm_mat3_mulv(r, mat[3], t);
glm_vec3_negate(t);
glm_vec3_copy(t, mat[3]);
}
#endif
TEST_IMPL(GLM_PREFIX, mul) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
mat4 m3;
mat4 m4 = GLM_MAT4_ZERO_INIT;
int i, j, k;
test_rand_mat4(m1);
test_rand_mat4(m2);
GLM(mul)(m1, m2, m3);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
ASSERTIFY(test_assert_mat4_eq(m3, m4))
/* test pre compiled */
GLM(mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mul_rot) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
mat4 m3;
mat4 m4 = GLM_MAT4_ZERO_INIT;
int i, j, k;
glm_rotate(m1, drand48(), (vec3){drand48(), drand48(), drand48()});
glm_rotate(m2, drand48(), (vec3){drand48(), drand48(), drand48()});
GLM(mul_rot)(m1, m2, m3);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
ASSERTIFY(test_assert_mat4_eq(m3, m4))
/* test pre compiled */
GLM(mul_rot)(m1, m2, m3);
ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, inv_tr) {
mat4 m1, m2;
int i;
for (i = 0; i < 10000; i++) {
test_rand_mat4(m1);
glm_mat4_copy(m1, m2);
/* test inverse precise */
GLM(inv_tr)(m1);
GLM(inv_tr)(m1);
ASSERTIFY(test_assert_mat4_eq(m1, m2))
/* test inverse precise */
GLM(mat4_inv)(m1, m2);
GLM(inv_tr)(m2);
ASSERTIFY(test_assert_mat4_eq(m1, m2))
/* test with raw */
glm_mat4_copy(m1, m2);
glm_inv_tr_raw(m2);
GLM(inv_tr)(m1);
ASSERTIFY(test_assert_mat4_eq(m1, m2))
}
TEST_SUCCESS
}
+66
View File
@@ -0,0 +1,66 @@
/*
* 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"
CGLM_INLINE
float
test_bezier_plain(float s, float p0, float c0, float c1, float p1) {
float x, xx, xxx, ss, sss;
x = 1.0f - s;
xx = x * x;
xxx = xx * x;
ss = s * s;
sss = ss * s;
return p0 * xxx + 3.0f * (c0 * s * xx + c1 * ss * x) + p1 * sss;
}
CGLM_INLINE
float
test_hermite_plain(float s, float p0, float t0, float t1, float p1) {
float ss, sss;
ss = s * s;
sss = ss * s;
return p0 * (2.0f * sss - 3.0f * ss + 1.0f)
+ t0 * (sss - 2.0f * ss + s)
+ p1 * (-2.0f * sss + 3.0f * ss)
+ t1 * (sss - ss);
}
TEST_IMPL(bezier) {
float s, p0, p1, c0, c1, smc, Bs, Bs_plain;
s = test_rand();
p0 = test_rand();
p1 = test_rand();
c0 = test_rand();
c1 = test_rand();
/* test cubic bezier */
smc = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1});
Bs = glm_bezier(s, p0, c0, c1, p1);
Bs_plain = test_bezier_plain(s, p0, c0, c1, p1);
ASSERT(test_eq(Bs, Bs_plain));
ASSERTIFY(test_assert_eqf(smc, Bs_plain))
ASSERTIFY(test_assert_eqf(Bs, smc))
/* test cubic hermite */
smc = glm_smc(s, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1});
Bs = glm_hermite(s, p0, c0, c1, p1);
Bs_plain = test_hermite_plain(s, p0, c0, c1, p1);
ASSERT(test_eq(Bs, Bs_plain));
ASSERT(test_eq(smc, Bs_plain));
ASSERT(test_eq(Bs, smc));
TEST_SUCCESS
}
+115
View File
@@ -0,0 +1,115 @@
/*
* 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
}
TEST_IMPL(GLM_PREFIX, camera_lookat) {
mat4 view1, view2;
vec3 center,
eye = {0.024f, 14.6f, 67.04f},
dir = {0.0f, 0.0f, -1.0f},
up = {0.0f, 1.0f, 0.0f};
glm_vec3_add(eye, dir, center);
glm_lookat(eye, center, up, view1);
glm_look(eye, dir, up, view2);
ASSERTIFY(test_assert_mat4_eq(view1, view2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, camera_decomp) {
mat4 proj, proj2;
vec4 sizes;
float aspect, fovy, nearZ, farZ;
aspect = 0.782f;
fovy = glm_rad(49.984f);
nearZ = 0.1f;
farZ = 100.0f;
glm_perspective(fovy, aspect, nearZ, farZ, proj);
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);
glm_frustum(-sizes[0] * 0.5f,
sizes[0] * 0.5f,
-sizes[1] * 0.5f,
sizes[1] * 0.5f,
nearZ,
farZ,
proj2);
ASSERTIFY(test_assert_mat4_eq(proj, proj2))
TEST_SUCCESS
}
+38
View File
@@ -0,0 +1,38 @@
/*
* 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"
#include "../../include/cglm/clipspace/persp_lh_no.h"
#include "../../include/cglm/call/clipspace/persp_lh_no.h"
TEST_IMPL(GLM_PREFIX, perspective_lh_no) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
GLM(perspective_lh_no)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], (zFarVal + zNearVal) / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], 1.0f))
ASSERT(test_eq(dst[3][2], -2 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_lh_no*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = 1.0020020f;
cmp[2][3] = 1.0000000f;
cmp[3][2] = -0.2002002f;
return test_assert_mat4_eq(dst, cmp);
}
+38
View File
@@ -0,0 +1,38 @@
/*
* 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"
#include "../../include/cglm/clipspace/persp_lh_zo.h"
#include "../../include/cglm/call/clipspace/persp_lh_zo.h"
TEST_IMPL(GLM_PREFIX, perspective_lh_zo) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
GLM(perspective_lh_zo)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], zFarVal / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], 1.0f))
ASSERT(test_eq(dst[3][2], -1 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/* "Reference values" generated by GLM's glm::perspectiveLH_ZO */
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = 1.0010010f;
cmp[2][3] = 1.0000000f;
cmp[3][2] = -0.1001001f;
return test_assert_mat4_eq(dst, cmp);
}
+38
View File
@@ -0,0 +1,38 @@
/*
* 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"
#include "../../include/cglm/clipspace/persp_rh_no.h"
#include "../../include/cglm/call/clipspace/persp_rh_no.h"
TEST_IMPL(GLM_PREFIX, perspective_rh_no) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
GLM(perspective_rh_no)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1.0f / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], -1.0f * (zFarVal + zNearVal) / (zFarVal - zNearVal)))
ASSERT(test_eq(dst[2][3], -1.0f))
ASSERT(test_eq(dst[3][2], -2 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_rh_no*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = -1.0020020f;
cmp[2][3] = -1.0000000f;
cmp[3][2] = -0.2002002f;
return test_assert_mat4_eq(dst, cmp);
}
+38
View File
@@ -0,0 +1,38 @@
/*
* 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"
#include "../../include/cglm/clipspace/persp_rh_zo.h"
#include "../../include/cglm/call/clipspace/persp_rh_zo.h"
TEST_IMPL(GLM_PREFIX, perspective_rh_zo) {
mat4 dst;
const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f;
const float zNearVal = 0.1f;
const float zFarVal = 100.0f;
GLM(perspective_rh_zo)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1 / (tanf(fovy / 2) * aspect)))
ASSERT(test_eq(dst[1][1], 1 / tanf(fovy / 2)))
ASSERT(test_eq(dst[2][2], zFarVal / (zNearVal - zFarVal)))
ASSERT(test_eq(dst[2][3], -1.0f))
ASSERT(test_eq(dst[3][2], -1 * zFarVal * zNearVal / (zFarVal - zNearVal)))
/* Sanity mk. II */
/*reference test data for glm_perspective_rh_zo*/
mat4 cmp = {0};
cmp[0][0] = 1.8106601f;
cmp[1][1] = 2.4142134f;
cmp[2][2] = -1.0010010f;
cmp[2][3] = -1.0000000f;
cmp[3][2] = -0.1001001f;
return test_assert_mat4_eq(dst, cmp);
}
+31
View File
@@ -0,0 +1,31 @@
/*
* 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(clamp) {
vec3 v3 = {15.07f, 0.4f, 17.3f};
vec4 v4 = {5.07f, 2.3f, 1.3f, 1.4f};
ASSERT(glm_eq(glm_clamp(1.6f, 0.0f, 1.0f), 1.0f))
ASSERT(glm_eq(glm_clamp(-1.6f, 0.0f, 1.0f), 0.0f))
ASSERT(glm_eq(glm_clamp(0.6f, 0.0f, 1.0f), 0.6f))
glm_vec3_clamp(v3, 0.0, 1.0);
glm_vec4_clamp(v4, 1.5, 3.0);
ASSERT(glm_eq(v3[0], 1.0f))
ASSERT(glm_eq(v3[1], 0.4f))
ASSERT(glm_eq(v3[2], 1.0f))
ASSERT(glm_eq(v4[0], 3.0f))
ASSERT(glm_eq(v4[1], 2.3f))
ASSERT(glm_eq(v4[2], 1.5f))
ASSERT(glm_eq(v4[3], 1.5f))
TEST_SUCCESS
}
+581
View File
@@ -0,0 +1,581 @@
/*
* Copyright (c), Recep Aslantas.
* MIT License (MIT), http://opensource.org/licenses/MIT
*/
#include "test_common.h"
#include <time.h>
void
test_rand_mat4(mat4 dest) {
glm_mat4_copy(GLM_MAT4_IDENTITY, dest);
/* random position */
dest[3][0] = drand48();
dest[3][1] = drand48();
dest[3][2] = drand48();
/* random rotatation around random axis with random angle */
glm_rotate(dest, drand48(), (vec3){drand48(), drand48(), drand48()});
/* random scale */
/* glm_scale(dest, (vec3){drand48(), drand48(), drand48()}); */
}
void
test_rand_mat4x2(mat4x2 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[2][0] = drand48();
dest[2][1] = drand48();
dest[3][0] = drand48();
dest[3][1] = drand48();
}
void
test_rand_mat4x3(mat4x3 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[0][2] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[1][2] = drand48();
dest[2][0] = drand48();
dest[2][1] = drand48();
dest[2][2] = drand48();
dest[3][0] = drand48();
dest[3][1] = drand48();
dest[3][2] = drand48();
}
void
test_rand_mat3(mat3 dest) {
mat4 m4;
/* random rotatation around random axis with random angle */
glm_rotate_make(m4, drand48(), (vec3){drand48(), drand48(), drand48()});
glm_mat4_pick3(m4, dest);
}
void
test_rand_mat3x2(mat3x2 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[2][0] = drand48();
dest[2][1] = drand48();
}
void
test_rand_mat3x4(mat3x4 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[0][2] = drand48();
dest[0][3] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[1][2] = drand48();
dest[1][3] = drand48();
dest[2][0] = drand48();
dest[2][1] = drand48();
dest[2][2] = drand48();
dest[2][3] = drand48();
}
void
test_rand_mat2(mat2 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
}
void
test_rand_mat2x3(mat2x3 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[0][2] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[1][2] = drand48();
}
void
test_rand_mat2x4(mat2x4 dest) {
dest[0][0] = drand48();
dest[0][1] = drand48();
dest[0][2] = drand48();
dest[0][3] = drand48();
dest[1][0] = drand48();
dest[1][1] = drand48();
dest[1][2] = drand48();
dest[1][3] = drand48();
}
void
test_rand_vec3(vec3 dest) {
dest[0] = drand48();
dest[1] = drand48();
dest[2] = drand48();
}
vec3s
test_rand_vec3s(void) {
vec3s r;
test_rand_vec3(r.raw);
return r;
}
void
test_rand_vec4(vec4 dest) {
dest[0] = drand48();
dest[1] = drand48();
dest[2] = drand48();
dest[3] = drand48();
}
vec4s
test_rand_vec4s(void) {
vec4s r;
test_rand_vec4(r.raw);
return r;
}
float
test_rand(void) {
return drand48();
}
void
test_rand_quat(versor q) {
glm_quat(q, drand48(), drand48(), drand48(), drand48());
glm_quat_normalize(q);
}
test_status_t
test_assert_mat4_eq(mat4 m1, mat4 m2) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4_eqt(mat4 m1, mat4 m2) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= eps);
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2_eqt(mat2 m1, mat2 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009);
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2_eq(mat2 m1, mat2 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2_eq_identity(mat2 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
if (i == j) {
ASSERT(test_eq(m2[i][j], 1.0f))
} else {
ASSERT(test_eq(m2[i][j], 0.0f))
}
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2_eq_zero(mat2 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m2[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2x3_eq_zero(mat2x3 m2x3) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
ASSERT(test_eq(m2x3[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2x3_eq(mat2x3 m1, mat2x3 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2x4_eq_zero(mat2x4 m2x4) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 4; j++) {
ASSERT(test_eq(m2x4[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat2x4_eq(mat2x4 m1, mat2x4 m2) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 4; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3_eq(mat3 m1, mat3 m2) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3_eqt(mat3 m1, mat3 m2) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009);
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3_eq_identity(mat3 m3) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) {
ASSERT(test_eq(m3[i][j], 1.0f))
} else {
ASSERT(test_eq(m3[i][j], 0.0f))
}
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3_eq_zero(mat3 m3) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
ASSERT(test_eq(m3[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3x2_eq_zero(mat3x2 m3x2) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m3x2[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3x2_eq(mat3x2 m1, mat3x2 m2) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3x4_eq_zero(mat3x4 m3x4) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
ASSERT(test_eq(m3x4[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat3x4_eq(mat3x4 m1, mat3x4 m2) {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4_eq_identity(mat4 m4) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == j) {
ASSERT(test_eq(m4[i][j], 1.0f))
} else {
ASSERT(test_eq(m4[i][j], 0.0f))
}
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4_eq_zero(mat4 m4) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
ASSERT(test_eq(m4[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4x2_eq_zero(mat4x2 m4x2) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m4x2[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4x2_eq(mat4x2 m1, mat4x2 m2) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4x3_eq_zero(mat4x3 m4x3) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
ASSERT(test_eq(m4x3[i][j], 0.0f))
}
}
TEST_SUCCESS
}
test_status_t
test_assert_mat4x3_eq(mat4x3 m1, mat4x3 m2) {
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
}
}
TEST_SUCCESS
}
test_status_t
test_assert_eqf(float a, float b) {
ASSERT(fabsf(a - b) <= 0.000009); /* rounding errors */
TEST_SUCCESS
}
test_status_t
test_assert_vec2_eq(vec2 v1, vec2 v2) {
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
TEST_SUCCESS
}
test_status_t
test_assert_vec3_eq(vec3 v1, vec3 v2) {
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
TEST_SUCCESS
}
test_status_t
test_assert_vec3s_eq(vec3s v1, vec3s v2) {
test_assert_vec3_eq(v1.raw, v2.raw);
TEST_SUCCESS
}
test_status_t
test_assert_vec4_eq(vec4 v1, vec4 v2) {
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
ASSERT(fabsf(v1[3] - v2[3]) <= 0.000009);
TEST_SUCCESS
}
test_status_t
test_assert_vec4s_eq(vec4s v1, vec4s v2) {
test_assert_vec4_eq(v1.raw, v2.raw);
TEST_SUCCESS
}
test_status_t
test_assert_quat_eq_abs(versor v1, versor v2) {
ASSERT(fabsf(fabsf(v1[0]) - fabsf(v2[0])) <= 0.0009); /* rounding errors */
ASSERT(fabsf(fabsf(v1[1]) - fabsf(v2[1])) <= 0.0009);
ASSERT(fabsf(fabsf(v1[2]) - fabsf(v2[2])) <= 0.0009);
ASSERT(fabsf(fabsf(v1[3]) - fabsf(v2[3])) <= 0.0009);
TEST_SUCCESS
}
test_status_t
test_assert_quat_eq(versor v1, versor v2) {
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
ASSERT(fabsf(v1[3] - v2[3]) <= 0.000009);
TEST_SUCCESS
}
test_status_t
test_assert_quat_eq_identity(versor q) {
versor p = GLM_QUAT_IDENTITY_INIT;
ASSERT(fabsf(q[0] - p[0]) <= 0.000009); /* rounding errors */
ASSERT(fabsf(q[1] - p[1]) <= 0.000009);
ASSERT(fabsf(q[2] - p[2]) <= 0.000009);
ASSERT(fabsf(q[3] - p[3]) <= 0.000009);
TEST_SUCCESS
}
+176
View File
@@ -0,0 +1,176 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef test_common_h
#define test_common_h
#include "../include/common.h"
#if !defined(_WIN32) && !defined(_MSC_VER)
# pragma GCC diagnostic ignored "-Wstrict-prototypes"
#endif
void
test_rand_mat4(mat4 dest);
void
test_rand_mat4x2(mat4x2 dest);
void
test_rand_mat4x3(mat4x3 dest);
void
test_rand_mat3(mat3 dest);
void
test_rand_mat3x2(mat3x2 dest);
void
test_rand_mat3x4(mat3x4 dest);
void
test_rand_mat2(mat2 dest);
void
test_rand_mat2x3(mat2x3 dest);
void
test_rand_mat2x4(mat2x4 dest);
test_status_t
test_assert_eqf(float a, float b);
test_status_t
test_assert_mat4_eq(mat4 m1, mat4 m2);
test_status_t
test_assert_mat4_eqt(mat4 m1, mat4 m2);
test_status_t
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps);
test_status_t
test_assert_mat4_eq_identity(mat4 m4);
test_status_t
test_assert_mat4_eq_zero(mat4 m4);
test_status_t
test_assert_mat4x2_eq_zero(mat4x2 m4x2);
test_status_t
test_assert_mat4x2_eq(mat4x2 m1, mat4x2 m2);
test_status_t
test_assert_mat4x3_eq_zero(mat4x3 m4x3);
test_status_t
test_assert_mat4x3_eq(mat4x3 m1, mat4x3 m2);
test_status_t
test_assert_mat2_eqt(mat2 m1, mat2 m2);
test_status_t
test_assert_mat2_eq(mat2 m1, mat2 m2);
test_status_t
test_assert_mat2_eq_identity(mat2 m2);
test_status_t
test_assert_mat2_eq_zero(mat2 m2);
test_status_t
test_assert_mat2x3_eq_zero(mat2x3 m2x3);
test_status_t
test_assert_mat2x3_eq(mat2x3 m1, mat2x3 m2);
test_status_t
test_assert_mat2x4_eq_zero(mat2x4 m2x4);
test_status_t
test_assert_mat2x4_eq(mat2x4 m1, mat2x4 m2);
test_status_t
test_assert_mat3_eq(mat3 m1, mat3 m2);
test_status_t
test_assert_vec2_eq(vec2 v1, vec2 v2);
test_status_t
test_assert_mat3_eqt(mat3 m1, mat3 m2);
test_status_t
test_assert_mat3_eq_identity(mat3 m3);
test_status_t
test_assert_mat3_eq_zero(mat3 m3);
test_status_t
test_assert_mat3x2_eq_zero(mat3x2 m3x2);
test_status_t
test_assert_mat3x2_eq(mat3x2 m1, mat3x2 m2);
test_status_t
test_assert_mat3x4_eq_zero(mat3x4 m3x4);
test_status_t
test_assert_mat3x4_eq(mat3x4 m1, mat3x4 m2);
test_status_t
test_assert_vec3_eq(vec3 v1, vec3 v2);
test_status_t
test_assert_vec3s_eq(vec3s v1, vec3s v2);
test_status_t
test_assert_vec4_eq(vec4 v1, vec4 v2);
test_status_t
test_assert_vec4s_eq(vec4s v1, vec4s v2);
test_status_t
test_assert_quat_eq(versor v1, versor v2);
test_status_t
test_assert_quat_eq_identity(versor q) ;
test_status_t
test_assert_quat_eq_abs(versor v1, versor v2);
void
test_rand_vec3(vec3 dest);
vec3s
test_rand_vec3s(void);
void
test_rand_vec4(vec4 dest);
vec4s
test_rand_vec4s(void);
float
test_rand(void);
void
test_rand_quat(versor q);
CGLM_INLINE
bool
test_eq(float a, float b) {
return fabsf(a - b) <= GLM_FLT_EPSILON * 10;
}
CGLM_INLINE
bool
test_eq_th(float a, float b, float th) {
return fabsf(a - b) <= th;
}
#endif /* test_common_h */
+45
View File
@@ -0,0 +1,45 @@
/*
* 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(euler) {
mat4 rot1, rot2;
vec3 inAngles, outAngles;
inAngles[0] = glm_rad(-45.0f); /* X angle */
inAngles[1] = glm_rad(88.0f); /* Y angle */
inAngles[2] = glm_rad(18.0f); /* Z angle */
glm_euler_xyz(inAngles, rot1);
/* extract angles */
glmc_euler_angles(rot1, outAngles);
/* angles must be equal in that range */
ASSERTIFY(test_assert_vec3_eq(inAngles, outAngles))
/* matrices must be equal */
glmc_euler_xyz(outAngles, rot2);
ASSERTIFY(test_assert_mat4_eq(rot1, rot2))
/* change range */
inAngles[0] = glm_rad(-145.0f); /* X angle */
inAngles[1] = glm_rad(818.0f); /* Y angle */
inAngles[2] = glm_rad(181.0f); /* Z angle */
glm_euler_xyz(inAngles, rot1);
glmc_euler_angles(rot1, outAngles);
/* angles may not be equal but matrices MUST! */
/* matrices must be equal */
glmc_euler_xyz(outAngles, rot2);
ASSERTIFY(test_assert_mat4_eq(rot1, rot2))
TEST_SUCCESS
}
+493
View File
@@ -0,0 +1,493 @@
/*
* 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"
#include "../../include/cglm/handed/euler_to_quat_lh.h"
TEST_IMPL(GLM_PREFIX, euler_xyz_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_euler_xyz_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
/* use my function to get the quaternion */
glm_euler_xyz_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_xzy_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xzy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_euler_xzy_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xzy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
/* use my function to get the quaternion */
glm_euler_xzy_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_yxz_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yxz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_euler_yxz_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yxz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
/* use my function to get the quaternion */
glm_euler_yxz_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_yzx_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yzx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_euler_yzx_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yzx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
/* use my function to get the quaternion */
glm_euler_yzx_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_zxy_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zxy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_euler_zxy_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zxy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
/* use my function to get the quaternion */
glm_euler_zxy_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_zyx_quat_lh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f,-1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zyx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_euler_zyx_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
/* use my function to get the quaternion */
glm_euler_zyx_quat_lh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
}
}
}
TEST_SUCCESS
}
+573
View File
@@ -0,0 +1,573 @@
/*
* 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"
#include "../../include/cglm/handed/euler_to_quat_rh.h"
TEST_IMPL(GLM_PREFIX, euler_xyz_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_euler_xyz_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_XYZ, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
/* use my function to get the quaternion */
glm_euler_xyz_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_XYZ, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_xzy_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xzy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_euler_xzy_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_XZY, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xzy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
/* use my function to get the quaternion */
glm_euler_xzy_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_XZY, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_yxz_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yxz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_euler_yxz_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_YXZ, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yxz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
/* use my function to get the quaternion */
glm_euler_yxz_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_YXZ, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_yzx_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yzx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_euler_yzx_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_YZX, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in yzx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
/* use my function to get the quaternion */
glm_euler_yzx_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_YZX, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_zxy_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zxy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_euler_zxy_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_ZXY, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zxy order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
/* use my function to get the quaternion */
glm_euler_zxy_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_ZXY, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, euler_zyx_quat_rh) {
vec3 axis_x = {1.0f, 0.0f, 0.0f};
vec3 axis_y = {0.0f, 1.0f, 0.0f};
vec3 axis_z = {0.0f, 0.0f, 1.0f};
/* random angles for testing */
vec3 angles;
/* quaternion representations for rotations */
versor rot_x, rot_y, rot_z;
versor expected;
versor result;
versor tmp;
mat4 expected_mat4;
/* 100 randomized tests */
for (int i = 0; i < 100; i++) {
test_rand_vec3(angles);
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in zyx order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
glm_euler_zyx_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
/* verify that it acts the same as rotating by 3 axis quaternions */
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_ZYX, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
/* Start gimbal lock tests */
for (float x = -90.0f; x <= 90.0f; x += 90.0f) {
for (float y = -90.0f; y <= 90.0f; y += 90.0f) {
for (float z = -90.0f; z <= 90.0f; z += 90.0f) {
angles[0] = x;
angles[1] = y;
angles[2] = z;
/* create the rotation quaternions using the angles and axises */
glm_quatv(rot_x, angles[0], axis_x);
glm_quatv(rot_y, angles[1], axis_y);
glm_quatv(rot_z, angles[2], axis_z);
/* apply the rotations to a unit quaternion in xyz order */
glm_quat_identity(expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_z, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_y, expected);
glm_quat_copy(expected, tmp);
glm_quat_mul(tmp, rot_x, expected);
/* use my function to get the quaternion */
glm_euler_zyx_quat_rh(angles, result);
/* verify if the magnitude of the quaternion stays 1 */
ASSERT(test_eq(glm_quat_norm(result), 1.0f))
ASSERTIFY(test_assert_quat_eq(result, expected))
/* verify that it acts the same as glm_euler_by_order */
glm_euler_by_order(angles, GLM_EULER_ZYX, expected_mat4);
glm_mat4_quat(expected_mat4, expected);
ASSERTIFY(test_assert_quat_eq_abs(result, expected));
}
}
}
TEST_SUCCESS
}
+536
View File
@@ -0,0 +1,536 @@
/*
* 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, ivec2) {
ivec4 v4 = {2, 3, 5, 7};
ivec3 v3 = {11, 13, 17};
ivec2 v2;
GLM(ivec2)(v4, v2);
ASSERT(v2[0] == 2)
ASSERT(v2[1] == 3)
GLM(ivec2)(v3, v2);
ASSERT(v2[0] == 11)
ASSERT(v2[1] == 13)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_copy) {
ivec2 src = {7, 5};
ivec2 dst = {99, 99};
GLM(ivec2_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_zero) {
ivec2 v = {2, 3};
GLM(ivec2_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_one) {
ivec2 v = {-2, 9};
GLM(ivec2_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_dot) {
ivec2 a = {2, 3};
ivec2 b = {4, 4};
int dot1, dot2;
dot1 = GLM(ivec2_dot)(a, b);
dot2 = a[0] * b[0] + a[1] * b[1];
ASSERT(dot1 == dot2)
ASSERT(dot1 == 20)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_cross) {
ivec2 a = {10, 9};
ivec2 b = {1, 2};
int cross1, cross2;
cross1 = GLM(ivec2_cross)(a, b);
cross2 = a[0] * b[1] - a[1] * b[0];
ASSERT(cross1 == cross2)
ASSERT(cross1 == 11)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_add) {
ivec2 a = {14, 3};
ivec2 b = {-3, 2};
ivec2 v = {99, 99};
GLM(ivec2_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_adds) {
ivec2 a = {-3, 1};
ivec2 v = {99, 99};
int s = 2;
GLM(ivec2_adds)(a, s, v);
ASSERT(v[0] == -1)
ASSERT(v[1] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_sub) {
ivec2 a = {-2, 9};
ivec2 b = {3, 2};
ivec2 v = {99, 99};
GLM(ivec2_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subs) {
ivec2 a = {5, -2};
ivec2 v = {99, 99};
int s = -3;
GLM(ivec2_subs)(a, s, v);
ASSERT(v[0] == 8)
ASSERT(v[1] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_mul) {
ivec2 a = {3, 4};
ivec2 b = {-2, 3};
ivec2 v = {99, 99};
GLM(ivec2_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_scale) {
ivec2 a = {-9, 2};
ivec2 v = {99, 99};
int s = -2;
GLM(ivec2_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_div) {
ivec2 v1 = {6, 5},
v2 = {-2, 4},
v3;
GLM(ivec2_div)(v1, v2, v3);
ASSERT(v1[0] / v2[0] == v3[0])
ASSERT(v1[1] / v2[1] == v3[1])
ASSERT(v3[0] == -3)
ASSERT(v3[1] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_divs) {
ivec2 v1 = {16, -8}, v2;
int s = 4;
GLM(ivec2_divs)(v1, s, v2);
ASSERT(v1[0] / s == v2[0])
ASSERT(v1[1] / s == v2[1])
ASSERT(v2[0] == 4)
ASSERT(v2[1] == -2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_mod) {
ivec2 a = {16, -8};
ivec2 b = {3, 5};
ivec2 dest;
GLM(ivec2_mod)(a, b, dest);
ASSERT(a[0] % b[0] == dest[0])
ASSERT(a[1] % b[1] == dest[1])
ASSERT(dest[0] == 1)
ASSERT(dest[1] == -3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_addadd) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_addadd)(a, b, c);
ASSERT(d[0] + a[0] + b[0] == c[0])
ASSERT(d[1] + a[1] + b[1] == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_addadds) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_addadds)(a, s, c);
ASSERT(d[0] + a[0] + s == c[0])
ASSERT(d[1] + a[1] + s == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subadd) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_subadd)(a, b, c);
ASSERT(d[0] + (a[0] - b[0]) == c[0])
ASSERT(d[1] + (a[1] - b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subadds) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_subadds)(a, s, c);
ASSERT(d[0] + a[0] - s == c[0])
ASSERT(d[1] + a[1] - s == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_muladd) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_muladd)(a, b, c);
ASSERT(d[0] + a[0] * b[0] == c[0])
ASSERT(d[1] + a[1] * b[1] == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_muladds) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_muladds)(a, s, c);
ASSERT(d[0] + a[0] * s == c[0])
ASSERT(d[1] + a[1] * s == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_maxadd) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_maxadd)(a, b, c);
ASSERT(d[0] += glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imax(a[1], b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_minadd) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_minadd)(a, b, c);
ASSERT(d[0] += glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imin(a[1], b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subsub) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_subsub)(a, b, c);
ASSERT(d[0] - (a[0] - b[0]) == c[0])
ASSERT(d[1] - (a[1] - b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subsubs) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_subsubs)(a, s, c);
ASSERT(d[0] - (a[0] - s) == c[0])
ASSERT(d[1] - (a[1] - s) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_addsub) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_addsub)(a, b, c);
ASSERT(d[0] - (a[0] + b[0]) == c[0])
ASSERT(d[1] - (a[1] + b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_addsubs) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_addsubs)(a, s, c);
ASSERT(d[0] - (a[0] + s) == c[0])
ASSERT(d[1] - (a[1] + s) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_mulsub) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_mulsub)(a, b, c);
ASSERT(d[0] - a[0] * b[0] == c[0])
ASSERT(d[1] - a[1] * b[1] == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_mulsubs) {
ivec2 a = {2, -3},
c = {1, 2},
d = {1, 2};
int s = 9;
GLM(ivec2_mulsubs)(a, s, c);
ASSERT(d[0] - a[0] * s == c[0])
ASSERT(d[1] - a[1] * s == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_maxsub) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_maxsub)(a, b, c);
ASSERT(d[0] -= glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imax(a[1], b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_minsub) {
ivec2 a = {2, -3},
b = {-3, 4},
c = {1, 2},
d = {1, 2};
GLM(ivec2_minsub)(a, b, c);
ASSERT(d[0] -= glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imin(a[1], b[1]) == c[1])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_distance2) {
ivec2 a = {-1, 3};
ivec2 b = {5, 4};
int v;
v = GLM(ivec2_distance2)(a, b);
ASSERT(v == 37)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_distance) {
ivec2 a = {3, 2};
ivec2 b = {-2, 5};
float v;
v = GLM(ivec2_distance)(a, b);
ASSERT(test_eq(v, 5.8309518948f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_fill) {
ivec2 v1;
ivec2 v2 = {-1, 3};
GLM(ivec2_fill)(v1, 1);
GLM(ivec2_fill)(v2, 2);
ASSERT(GLM(ivec2_eq)(v1, 1))
ASSERT(GLM(ivec2_eq)(v2, 2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_eq) {
ivec2 v1 = {-1, 2};
GLM(ivec2_fill)(v1, 2);
ASSERT(GLM(ivec2_eq)(v1, 2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_eqv) {
ivec2 v1, v2, v3;
GLM(ivec2_fill)(v1, 1);
GLM(ivec2_fill)(v2, 2);
GLM(ivec2_fill)(v3, 1);
ASSERT(GLM(ivec2_eqv)(v1, v3))
ASSERT(!GLM(ivec2_eqv)(v1, v2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_maxv) {
ivec2 a = {9, -20};
ivec2 b = {8, -1};
ivec2 v = {99, 99};
GLM(ivec2_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_minv) {
ivec2 a = {16, 0};
ivec2 b = {-15, 10};
ivec2 v = {99, 99};
GLM(ivec2_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_clamp) {
ivec2 v = {3, -1};
GLM(ivec2_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
v[0] = -15;
v[1] = 4;
GLM(ivec2_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_abs) {
ivec2 v1 = {2, -3}, v2 = {-12, -31};
ivec2 v3, v4;
GLM(ivec2_abs)(v1, v3);
GLM(ivec2_abs)(v2, v4);
ASSERT(v3[0] == 2)
ASSERT(v3[1] == 3)
ASSERT(v4[0] == 12)
ASSERT(v4[1] == 31)
TEST_SUCCESS
}
+582
View File
@@ -0,0 +1,582 @@
/*
* 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, ivec3) {
ivec4 v4 = {2, 3, 5, 7};
ivec3 v3 = {99, 99, 99};
GLM(ivec3)(v4, v3);
ASSERT(v3[0] == 2)
ASSERT(v3[1] == 3)
ASSERT(v3[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_copy) {
ivec3 src = {7, 5, 2};
ivec3 dst = {99, 99, 99};
GLM(ivec3_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
ASSERT(dst[2] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_zero) {
ivec3 v = {2, 3, 5};
GLM(ivec3_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
ASSERT(v[2] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_one) {
ivec3 v = {-2, 9, 12};
GLM(ivec3_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
ASSERT(v[2] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_dot) {
ivec3 a = {2, 3, 1};
ivec3 b = {4, 4, 2};
int dot1, dot2;
dot1 = GLM(ivec3_dot)(a, b);
dot2 = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
ASSERT(dot1 == dot2)
ASSERT(dot1 == 22)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_norm2) {
ivec3 v = {2, 3, 4};
int norm2_1, norm2_2;
norm2_1 = GLM(ivec3_norm2)(v);
norm2_2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
ASSERT(norm2_1 == norm2_2)
ASSERT(norm2_1 == 29)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_norm) {
ivec3 v = {2, 3, 4};
int norm1, norm2;
norm1 = GLM(ivec3_norm)(v);
norm2 = (int)sqrtf((float)(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
ASSERT(norm1 == norm2)
ASSERT(norm1 == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_add) {
ivec3 a = {14, 3, 2};
ivec3 b = {-3, 2, 1};
ivec3 v = {99, 99, 99};
GLM(ivec3_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
ASSERT(v[2] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_adds) {
ivec3 a = {-3, 1, 4};
ivec3 v = {99, 99, 99};
int s = 2;
GLM(ivec3_adds)(a, s, v);
ASSERT(v[0] == -1)
ASSERT(v[1] == 3)
ASSERT(v[2] == 6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_sub) {
ivec3 a = {-2, 9, 1};
ivec3 b = {3, 2, -1};
ivec3 v = {99, 99, 99};
GLM(ivec3_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
ASSERT(v[2] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subs) {
ivec3 a = {5, -2, 6};
ivec3 v = {99, 99, 99};
int s = -3;
GLM(ivec3_subs)(a, s, v);
ASSERT(v[0] == 8)
ASSERT(v[1] == 1)
ASSERT(v[2] == 9)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_mul) {
ivec3 a = {3, 4, 5};
ivec3 b = {-2, 3, 1};
ivec3 v = {99, 99, 99};
GLM(ivec3_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
ASSERT(v[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_scale) {
ivec3 a = {-9, 2, 3};
ivec3 v = {99, 99, 99};
int s = -2;
GLM(ivec3_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
ASSERT(v[2] == -6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_div) {
ivec3 v1 = {6, 5, 8},
v2 = {-2, 4, 2},
v3;
GLM(ivec3_div)(v1, v2, v3);
ASSERT(v1[0] / v2[0] == v3[0])
ASSERT(v1[1] / v2[1] == v3[1])
ASSERT(v1[2] / v2[2] == v3[2])
ASSERT(v3[0] == -3)
ASSERT(v3[1] == 1)
ASSERT(v3[2] == 4)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_divs) {
ivec3 v1 = {16, -8, 12}, v2;
int s = 4;
GLM(ivec3_divs)(v1, s, v2);
ASSERT(v1[0] / s == v2[0])
ASSERT(v1[1] / s == v2[1])
ASSERT(v1[2] / s == v2[2])
ASSERT(v2[0] == 4)
ASSERT(v2[1] == -2)
ASSERT(v2[2] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_mod) {
ivec3 a = {16, -8, 10};
ivec3 b = {3, 5, 4};
ivec3 dest;
GLM(ivec3_mod)(a, b, dest);
ASSERT(a[0] % b[0] == dest[0])
ASSERT(a[1] % b[1] == dest[1])
ASSERT(a[2] % b[2] == dest[2])
ASSERT(dest[0] == 1)
ASSERT(dest[1] == -3)
ASSERT(dest[2] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_addadd) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_addadd)(a, b, c);
ASSERT(d[0] + a[0] + b[0] == c[0])
ASSERT(d[1] + a[1] + b[1] == c[1])
ASSERT(d[2] + a[2] + b[2] == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_addadds) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_addadds)(a, s, c);
ASSERT(d[0] + a[0] + s == c[0])
ASSERT(d[1] + a[1] + s == c[1])
ASSERT(d[2] + a[2] + s == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subadd) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_subadd)(a, b, c);
ASSERT(d[0] + a[0] - b[0] == c[0])
ASSERT(d[1] + a[1] - b[1] == c[1])
ASSERT(d[2] + a[2] - b[2] == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subadds) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_subadds)(a, s, c);
ASSERT(d[0] + a[0] - s == c[0])
ASSERT(d[1] + a[1] - s == c[1])
ASSERT(d[2] + a[2] - s == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_muladd) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_muladd)(a, b, c);
ASSERT(d[0] + a[0] * b[0] == c[0])
ASSERT(d[1] + a[1] * b[1] == c[1])
ASSERT(d[2] + a[2] * b[2] == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_muladds) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_muladds)(a, s, c);
ASSERT(d[0] + a[0] * s == c[0])
ASSERT(d[1] + a[1] * s == c[1])
ASSERT(d[2] + a[2] * s == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_maxadd) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_maxadd)(a, b, c);
ASSERT(d[0] += glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imax(a[1], b[1]) == c[1])
ASSERT(d[2] += glm_imax(a[2], b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_minadd) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_minadd)(a, b, c);
ASSERT(d[0] += glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imin(a[1], b[1]) == c[1])
ASSERT(d[2] += glm_imin(a[2], b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subsub) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_subsub)(a, b, c);
ASSERT(d[0] - (a[0] - b[0]) == c[0])
ASSERT(d[1] - (a[1] - b[1]) == c[1])
ASSERT(d[2] - (a[2] - b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subsubs) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_subsubs)(a, s, c);
ASSERT(d[0] - (a[0] - s) == c[0])
ASSERT(d[1] - (a[1] - s) == c[1])
ASSERT(d[2] - (a[2] - s) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_addsub) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_addsub)(a, b, c);
ASSERT(d[0] - (a[0] + b[0]) == c[0])
ASSERT(d[1] - (a[1] + b[1]) == c[1])
ASSERT(d[2] - (a[2] + b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_addsubs) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_addsubs)(a, s, c);
ASSERT(d[0] - (a[0] + s) == c[0])
ASSERT(d[1] - (a[1] + s) == c[1])
ASSERT(d[2] - (a[2] + s) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_mulsub) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_mulsub)(a, b, c);
ASSERT(d[0] - a[0] * b[0] == c[0])
ASSERT(d[1] - a[1] * b[1] == c[1])
ASSERT(d[2] - a[2] * b[2] == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_mulsubs) {
ivec3 a = {2, -3, 5},
c = {1, 2, -9},
d = {1, 2, -9};
int s = 9;
GLM(ivec3_mulsubs)(a, s, c);
ASSERT(d[0] - a[0] * s == c[0])
ASSERT(d[1] - a[1] * s == c[1])
ASSERT(d[2] - a[2] * s == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_maxsub) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_maxsub)(a, b, c);
ASSERT(d[0] -= glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imax(a[1], b[1]) == c[1])
ASSERT(d[2] -= glm_imax(a[2], b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_minsub) {
ivec3 a = {2, -3, 8},
b = {-3, 4, 5},
c = {1, 2, 6},
d = {1, 2, 6};
GLM(ivec3_minsub)(a, b, c);
ASSERT(d[0] -= glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imin(a[1], b[1]) == c[1])
ASSERT(d[2] -= glm_imin(a[2], b[2]) == c[2])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_distance2) {
ivec3 a = {-1, 3, 0};
ivec3 b = {5, 4, 2};
int v;
v = GLM(ivec3_distance2)(a, b);
ASSERT(v == 41)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_distance) {
ivec3 a = {3, 2, 4};
ivec3 b = {-2, 5, 2};
float v;
v = GLM(ivec3_distance)(a, b);
ASSERT(test_eq(v, 6.1644140029f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_fill) {
ivec3 v1;
ivec3 v2 = {-1, 3, 4};
GLM(ivec3_fill)(v1, 1);
GLM(ivec3_fill)(v2, 2);
ASSERT(GLM(ivec3_eq)(v1, 1))
ASSERT(GLM(ivec3_eq)(v2, 2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_eq) {
ivec3 v1 = { -1, 2, 4 };
GLM(ivec3_fill)(v1, 2);
ASSERT(GLM(ivec3_eq)(v1, 2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_eqv) {
ivec3 v1, v2, v3;
GLM(ivec3_fill)(v1, 1);
GLM(ivec3_fill)(v2, 2);
GLM(ivec3_fill)(v3, 1);
ASSERT(GLM(ivec3_eqv)(v1, v3))
ASSERT(!GLM(ivec3_eqv)(v1, v2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_maxv) {
ivec3 a = {9, -20, 5};
ivec3 b = {8, -1, 2};
ivec3 v = {99, 99, 99};
GLM(ivec3_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
ASSERT(v[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_minv) {
ivec3 a = {16, 0, 4};
ivec3 b = {-15, 10, 8};
ivec3 v = {99, 99, 99};
GLM(ivec3_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
ASSERT(v[2] == 4)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_clamp) {
ivec3 v = {3, -1, 10};
GLM(ivec3_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
ASSERT(v[2] == 4)
v[0] = -15;
v[1] = 4;
v[2] = 1;
GLM(ivec3_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
ASSERT(v[2] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_abs) {
ivec3 v1 = {2, -3, 4}, v2 = {-12, -31, -42};
ivec3 v3, v4;
GLM(ivec3_abs)(v1, v3);
GLM(ivec3_abs)(v2, v4);
ASSERT(v3[0] == 2)
ASSERT(v3[1] == 3)
ASSERT(v3[2] == 4)
ASSERT(v4[0] == 12)
ASSERT(v4[1] == 31)
ASSERT(v4[2] == 42)
TEST_SUCCESS
}
+488
View File
@@ -0,0 +1,488 @@
/*
* 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, ivec4) {
ivec4 v3 = {2, 3, 5};
ivec4 v4;
GLM(ivec4)(v3, 7, v4);
ASSERT(v4[0] == 2)
ASSERT(v4[1] == 3)
ASSERT(v4[2] == 5)
ASSERT(v4[3] == 7)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_copy) {
ivec4 src = {7, 5, 2, 11};
ivec4 dst = {99, 99, 99, 99};
GLM(ivec4_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
ASSERT(dst[2] == 2)
ASSERT(dst[3] == 11)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_zero) {
ivec4 v = {2, 3, 5, 7};
GLM(ivec4_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
ASSERT(v[2] == 0)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_one) {
ivec4 v = {-2, 9, 12, 7};
GLM(ivec4_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
ASSERT(v[2] == 1)
ASSERT(v[3] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_add) {
ivec4 a = {14, 3, 2, -4};
ivec4 b = {-3, 2, 1, -1};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
ASSERT(v[2] == 3)
ASSERT(v[3] == -5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_adds) {
ivec4 a = {-3, 1, 4, 2};
ivec4 v = {99, 99, 99, 99};
int s = -2;
GLM(ivec4_adds)(a, s, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == -1)
ASSERT(v[2] == 2)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_sub) {
ivec4 a = {-2, 9, 1, 5};
ivec4 b = {3, 2, -1, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
ASSERT(v[2] == 2)
ASSERT(v[3] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subs) {
ivec4 a = {5, -2, 6, 1};
ivec4 v = {99, 99, 99, 99};
int s = 2;
GLM(ivec4_subs)(a, s, v);
ASSERT(v[0] == 3)
ASSERT(v[1] == -4)
ASSERT(v[2] == 4)
ASSERT(v[3] == -1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_mul) {
ivec4 a = {3, 4, 5, -3};
ivec4 b = {-2, 3, 1, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
ASSERT(v[2] == 5)
ASSERT(v[3] == -6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_scale) {
ivec4 a = {-9, 2, 3, 0};
ivec4 v = {99, 99, 99, 99};
int s = -2;
GLM(ivec4_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
ASSERT(v[2] == -6)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_addadd) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_addadd)(a, b, c);
ASSERT(d[0] + a[0] + b[0] == c[0])
ASSERT(d[1] + a[1] + b[1] == c[1])
ASSERT(d[2] + a[2] + b[2] == c[2])
ASSERT(d[3] + a[3] + b[3] == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_addadds) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_addadds)(a, s, c);
ASSERT(d[0] + a[0] + s == c[0])
ASSERT(d[1] + a[1] + s == c[1])
ASSERT(d[2] + a[2] + s == c[2])
ASSERT(d[3] + a[3] + s == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subadd) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_subadd)(a, b, c);
ASSERT(d[0] + a[0] - b[0] == c[0])
ASSERT(d[1] + a[1] - b[1] == c[1])
ASSERT(d[2] + a[2] - b[2] == c[2])
ASSERT(d[3] + a[3] - b[3] == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subadds) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_subadds)(a, s, c);
ASSERT(d[0] + a[0] - s == c[0])
ASSERT(d[1] + a[1] - s == c[1])
ASSERT(d[2] + a[2] - s == c[2])
ASSERT(d[3] + a[3] - s == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_muladd) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_muladd)(a, b, c);
ASSERT(d[0] + a[0] * b[0] == c[0])
ASSERT(d[1] + a[1] * b[1] == c[1])
ASSERT(d[2] + a[2] * b[2] == c[2])
ASSERT(d[3] + a[3] * b[3] == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_muladds) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_muladds)(a, s, c);
ASSERT(d[0] + a[0] * s == c[0])
ASSERT(d[1] + a[1] * s == c[1])
ASSERT(d[2] + a[2] * s == c[2])
ASSERT(d[3] + a[3] * s == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_maxadd) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_maxadd)(a, b, c);
ASSERT(d[0] += glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imax(a[1], b[1]) == c[1])
ASSERT(d[2] += glm_imax(a[2], b[2]) == c[2])
ASSERT(d[3] += glm_imax(a[3], b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_minadd) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_minadd)(a, b, c);
ASSERT(d[0] += glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] += glm_imin(a[1], b[1]) == c[1])
ASSERT(d[2] += glm_imin(a[2], b[2]) == c[2])
ASSERT(d[3] += glm_imin(a[3], b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subsub) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_subsub)(a, b, c);
ASSERT(d[0] - (a[0] - b[0]) == c[0])
ASSERT(d[1] - (a[1] - b[1]) == c[1])
ASSERT(d[2] - (a[2] - b[2]) == c[2])
ASSERT(d[3] - (a[3] - b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subsubs) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_subsubs)(a, s, c);
ASSERT(d[0] - (a[0] - s) == c[0])
ASSERT(d[1] - (a[1] - s) == c[1])
ASSERT(d[2] - (a[2] - s) == c[2])
ASSERT(d[3] - (a[3] - s) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_addsub) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_addsub)(a, b, c);
ASSERT(d[0] - (a[0] + b[0]) == c[0])
ASSERT(d[1] - (a[1] + b[1]) == c[1])
ASSERT(d[2] - (a[2] + b[2]) == c[2])
ASSERT(d[3] - (a[3] + b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_addsubs) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_addsubs)(a, s, c);
ASSERT(d[0] - (a[0] + s) == c[0])
ASSERT(d[1] - (a[1] + s) == c[1])
ASSERT(d[2] - (a[2] + s) == c[2])
ASSERT(d[3] - (a[3] + s) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_mulsub) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_mulsub)(a, b, c);
ASSERT(d[0] - a[0] * b[0] == c[0])
ASSERT(d[1] - a[1] * b[1] == c[1])
ASSERT(d[2] - a[2] * b[2] == c[2])
ASSERT(d[3] - a[3] * b[3] == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_mulsubs) {
ivec4 a = {2, -3, 4, 7},
c = {1, 2, -8, 5},
d = {1, 2, -8, 5};
int s = 9;
GLM(ivec4_mulsubs)(a, s, c);
ASSERT(d[0] - a[0] * s == c[0])
ASSERT(d[1] - a[1] * s == c[1])
ASSERT(d[2] - a[2] * s == c[2])
ASSERT(d[3] - a[3] * s == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_maxsub) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_maxsub)(a, b, c);
ASSERT(d[0] -= glm_imax(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imax(a[1], b[1]) == c[1])
ASSERT(d[2] -= glm_imax(a[2], b[2]) == c[2])
ASSERT(d[3] -= glm_imax(a[3], b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_minsub) {
ivec4 a = {2, -3, 8, -7},
b = {-3, 4, 5, -2},
c = {1, 2, 6, 15},
d = {1, 2, 6, 15};
GLM(ivec4_minsub)(a, b, c);
ASSERT(d[0] -= glm_imin(a[0], b[0]) == c[0])
ASSERT(d[1] -= glm_imin(a[1], b[1]) == c[1])
ASSERT(d[2] -= glm_imin(a[2], b[2]) == c[2])
ASSERT(d[3] -= glm_imin(a[3], b[3]) == c[3])
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_distance2) {
ivec4 a = {-1, 3, 0, 4};
ivec4 b = {5, 4, 2, 6};
int v;
v = GLM(ivec4_distance2)(a, b);
ASSERT(v == 45)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_distance) {
ivec4 a = {3, 2, 4, -1};
ivec4 b = {-2, 5, 2, 4};
float v;
v = GLM(ivec4_distance)(a, b);
ASSERT(test_eq(v, 7.9372539331f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_maxv) {
ivec4 a = {9, -20, 5, -3};
ivec4 b = {8, -1, 2, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
ASSERT(v[2] == 5)
ASSERT(v[3] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_minv) {
ivec4 a = {16, 0, 4, 5};
ivec4 b = {-15, 10, 8, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
ASSERT(v[2] == 4)
ASSERT(v[3] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_clamp) {
ivec4 v = {3, -1, 10, -100};
GLM(ivec4_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
ASSERT(v[2] == 4)
ASSERT(v[3] == -2)
v[0] = -15;
v[1] = 4;
v[2] = 1;
v[3] = 0;
GLM(ivec4_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
ASSERT(v[2] == 1)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_abs) {
ivec4 v1 = {2, -3, 4, -5}, v2 = {-12, -31, -42, -50};
ivec4 v3, v4;
GLM(ivec4_abs)(v1, v3);
GLM(ivec4_abs)(v2, v4);
ASSERT(v3[0] == 2)
ASSERT(v3[1] == 3)
ASSERT(v3[2] == 4)
ASSERT(v3[3] == 5)
ASSERT(v4[0] == 12)
ASSERT(v4[1] == 31)
ASSERT(v4[2] == 42)
ASSERT(v4[3] == 50)
TEST_SUCCESS
}
+302
View File
@@ -0,0 +1,302 @@
/*
* 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"
#define A_MATRIX2x2 {{1,2},{5,6}}
#define MAT2_ARRAY {1, 5, 2, 7}
#ifndef CGLM_TEST_MAT2_ONCE
#define CGLM_TEST_MAT2_ONCE
TEST_IMPL(MACRO_GLM_MAT2_IDENTITY_INIT) {
mat2 m = GLM_MAT2_IDENTITY_INIT;
ASSERT(test_eq(m[0][0], 1.0f))
ASSERT(test_eq(m[0][1], 0.0f))
ASSERT(test_eq(m[1][0], 0.0f))
ASSERT(test_eq(m[1][1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT2_ZERO_INIT) {
mat2 m = GLM_MAT2_ZERO_INIT;
ASSERT(test_eq(m[0][0], 0.0f))
ASSERT(test_eq(m[0][1], 0.0f))
ASSERT(test_eq(m[1][0], 0.0f))
ASSERT(test_eq(m[1][1], 0.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT2_IDENTITY) {
ASSERT(test_eq(GLM_MAT2_IDENTITY[0][0], 1.0f))
ASSERT(test_eq(GLM_MAT2_IDENTITY[0][1], 0.0f))
ASSERT(test_eq(GLM_MAT2_IDENTITY[1][0], 0.0f))
ASSERT(test_eq(GLM_MAT2_IDENTITY[1][1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT2_ZERO) {
ASSERT(test_eq(GLM_MAT2_ZERO[0][0], 0.0f))
ASSERT(test_eq(GLM_MAT2_ZERO[0][1], 0.0f))
ASSERT(test_eq(GLM_MAT2_ZERO[1][0], 0.0f))
ASSERT(test_eq(GLM_MAT2_ZERO[1][1], 0.0f))
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT2_ONCE */
TEST_IMPL(GLM_PREFIX, mat2_copy) {
mat2 m1 = A_MATRIX2x2;
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
GLM(mat2_copy)(m1, m2);
test_assert_mat2_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_identity) {
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
mat2 m3;
GLM(mat2_identity)(m3);
ASSERTIFY(test_assert_mat2_eq_identity(m1))
ASSERTIFY(test_assert_mat2_eq_identity(m2))
ASSERTIFY(test_assert_mat2_eq_identity(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_identity_array) {
size_t i, count;
mat2 matrices[4] = {
A_MATRIX2x2,
A_MATRIX2x2,
A_MATRIX2x2,
A_MATRIX2x2
};
count = 4;
GLM(mat2_identity_array)(matrices, count);
for (i = 0; i < count; i++) {
ASSERTIFY(test_assert_mat2_eq_identity(matrices[i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_zero) {
mat2 m1 = GLM_MAT2_ZERO_INIT;
mat2 m2 = GLM_MAT2_ZERO_INIT;
mat2 m3;
GLM(mat2_zero)(m3);
ASSERTIFY(test_assert_mat2_eq_zero(m1))
ASSERTIFY(test_assert_mat2_eq_zero(m2))
ASSERTIFY(test_assert_mat2_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_mul) {
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
mat2 m3;
mat2 m4 = GLM_MAT2_ZERO_INIT;
int i, j, k;
/* test random matrices */
/* random matrices */
test_rand_mat2(m1);
test_rand_mat2(m2);
GLM(mat2_mul)(m1, m2, m3);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
for (k = 0; k < 2; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
ASSERTIFY(test_assert_mat2_eq(m3, m4))
/* test pre compiled */
GLM(mat2_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_transpose_to) {
mat2 mat = A_MATRIX2x2;
mat2 m1;
GLM(mat2_transpose_to)(mat, m1);
ASSERTIFY(test_assert_mat2_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_transpose) {
mat2 mat = A_MATRIX2x2;
mat2 m1;
GLM(mat2_copy)(mat, m1);
GLM(mat2_transpose)(m1);
ASSERTIFY(test_assert_mat2_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_mulv) {
vec2 res;
mat2 mat = A_MATRIX2x2;
vec2 v = {11.0f, 21.0f};
int i;
GLM(mat2_mulv)(mat, v, res);
for (i = 0; i < 2; i++) {
ASSERT(test_eq(res[i], v[0] * mat[0][i] + v[1] * mat[1][i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_trace) {
mat2 mat = A_MATRIX2x2;
float trace;
trace = GLM(mat2_trace)(mat);
ASSERT(test_eq(trace, mat[0][0] + mat[1][1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_scale) {
mat2 m1 = A_MATRIX2x2;
mat2 m2 = A_MATRIX2x2;
int i, j, scale;
scale = rand() % 100;
GLM(mat2_scale)(m1, (float)scale);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_det) {
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_inv) {
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
mat2 m3;
int i;
m1[0][0] = 41.0f;
m1[0][1] = 0.0f;
m1[1][0] = 0.0f;
m1[1][1] = 70.0f;
for (i = 0; i < 10000; i++) {
/* test inverse precise */
GLM(mat2_inv)(m1, m2);
GLM(mat2_inv)(m2, m3);
ASSERTIFY(test_assert_mat2_eq(m1, m3))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_swap_col) {
mat2 m1 = A_MATRIX2x2;
mat2 m2 = A_MATRIX2x2;
GLM(mat2_swap_col)(m1, 0, 1);
ASSERTIFY(test_assert_vec2_eq(m1[0], m2[1]))
ASSERTIFY(test_assert_vec2_eq(m1[1], m2[0]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_swap_row) {
mat2 m1 = A_MATRIX2x2;
mat2 m2 = A_MATRIX2x2;
GLM(mat2_swap_row)(m1, 0, 1);
ASSERT(test_eq(m1[0][0], m2[0][1]))
ASSERT(test_eq(m1[0][1], m2[0][0]))
ASSERT(test_eq(m1[1][0], m2[1][1]))
ASSERT(test_eq(m1[1][1], m2[1][0]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_rmc) {
mat2 mat = A_MATRIX2x2;
vec2 v = {11.0f, 12.0f};
vec2 v1;
float r1, r2;
int i;
r1 = GLM(mat2_rmc)(v, mat, v);
for (i = 0; i < 2; i++) {
v1[i] = v[0] * mat[i][0] + v[1] * mat[i][1];
}
r2 = v[0] * v1[0] + v[1] * v1[1];
ASSERT(test_eq(r1, r2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2_make) {
mat2 dest;
unsigned int i, j;
float src[4] = MAT2_ARRAY;
GLM(mat2_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=2, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
}
TEST_SUCCESS
}
#undef A_MATRIX2x2
+156
View File
@@ -0,0 +1,156 @@
/*
* 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"
#define A_MATRIX2X3 {{1,2,3},{5,6,7}}
#define A_MATRIX2X3_TRANSPOSE {{1,5}, {2,6}, {3,7}}
#ifndef CGLM_TEST_MAT2X3_ONCE
#define CGLM_TEST_MAT2X3_ONCE
TEST_IMPL(MACRO_GLM_MAT2X3_ZERO_INIT) {
mat2x3 mat2x3_zero = GLM_MAT2X3_ZERO_INIT;
test_assert_mat2x3_eq_zero(mat2x3_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT2X3_ZERO) {
mat2x3 mat2x3_zero = GLM_MAT2X3_ZERO;
test_assert_mat2x3_eq_zero(mat2x3_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT2X3_ONCE */
TEST_IMPL(GLM_PREFIX, mat2x3_copy) {
mat2x3 m1 = A_MATRIX2X3;
mat2x3 m2 = GLM_MAT2X3_ZERO_INIT;
GLM(mat2x3_copy)(m1, m2);
test_assert_mat2x3_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_zero) {
mat2x3 m1 = GLM_MAT2X3_ZERO_INIT;
mat2x3 m2 = GLM_MAT2X3_ZERO_INIT;
mat2x3 m3;
GLM(mat2x3_zero)(m3);
ASSERTIFY(test_assert_mat2x3_eq_zero(m1))
ASSERTIFY(test_assert_mat2x3_eq_zero(m2))
ASSERTIFY(test_assert_mat2x3_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_make) {
float src[18] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f,
2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f
};
mat2x3 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=6,j++) {
GLM(mat2x3_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k][2]));
ASSERT(test_eq(src[i+3], dest[j][k+1][0]));
ASSERT(test_eq(src[i+4], dest[j][k+1][1]));
ASSERT(test_eq(src[i+5], dest[j][k+1][2]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_mul) {
mat2x3 m1 = GLM_MAT2X3_ZERO_INIT;
mat3x2 m2 = GLM_MAT3X2_ZERO_INIT;
mat3 m3 = GLM_MAT3_ZERO_INIT;
mat3 m4 = GLM_MAT3_ZERO_INIT;
int c, r, k;
/* test random matrices */
/* random matrices */
test_rand_mat2x3(m1);
test_rand_mat3x2(m2);
for (r = 0; r < 3; r++) {
for (c = 0; c < 3; c++) {
for (k = 0; k < 2; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat2x3_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat3_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_mulv) {
mat2x3 mat = A_MATRIX2X3;
vec2 v = {11.0f, 21.0f};
int i;
vec3 dest;
float res = 0.0;
GLM(mat2x3_mulv)(mat, v, dest);
for (i = 0; i < 3; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_transpose) {
mat2x3 m1 = A_MATRIX2X3;
mat3x2 m2;
mat3x2 m3 = A_MATRIX2X3_TRANSPOSE;
GLM(mat2x3_transpose)(m1, m2);
ASSERTIFY(test_assert_mat3x2_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x3_scale) {
mat2x3 m1 = A_MATRIX2X3;
mat2x3 m2 = A_MATRIX2X3;
int i, j, scale;
scale = rand() % 100;
GLM(mat2x3_scale)(m1, (float) scale);
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+159
View File
@@ -0,0 +1,159 @@
/*
* 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"
#define A_MATRIX2X4 {{1,2,3,4},{5,6,7,8}}
#define A_MATRIX2X4_TRANSPOSE {{1,5}, {2,6}, {3,7}, {4,8}}
#ifndef CGLM_TEST_MAT2X4_ONCE
#define CGLM_TEST_MAT2X4_ONCE
TEST_IMPL(MACRO_GLM_MAT2X4_ZERO_INIT) {
mat2x4 mat2x4_zero = GLM_MAT2X4_ZERO_INIT;
test_assert_mat2x4_eq_zero(mat2x4_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT2X4_ZERO) {
mat2x4 mat2x4_zero = GLM_MAT2X4_ZERO;
test_assert_mat2x4_eq_zero(mat2x4_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT2X4_ONCE */
TEST_IMPL(GLM_PREFIX, mat2x4_copy) {
mat2x4 m1 = A_MATRIX2X4;
mat2x4 m2 = GLM_MAT2X4_ZERO_INIT;
GLM(mat2x4_copy)(m1, m2);
test_assert_mat2x4_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_zero) {
mat2x4 m1 = GLM_MAT2X4_ZERO_INIT;
mat2x4 m2 = GLM_MAT2X4_ZERO_INIT;
mat2x4 m3;
GLM(mat2x4_zero)(m3);
ASSERTIFY(test_assert_mat2x4_eq_zero(m1))
ASSERTIFY(test_assert_mat2x4_eq_zero(m2))
ASSERTIFY(test_assert_mat2x4_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_make) {
float src[24] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f, 77.3f, 88.4f,
2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f, 90.3f, 34.2f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f, 22.9f, 5.5f
};
mat2x4 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=8,j++) {
GLM(mat2x4_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k][2]));
ASSERT(test_eq(src[i+3], dest[j][k][3]));
ASSERT(test_eq(src[i+4], dest[j][k+1][0]));
ASSERT(test_eq(src[i+5], dest[j][k+1][1]));
ASSERT(test_eq(src[i+6], dest[j][k+1][2]));
ASSERT(test_eq(src[i+7], dest[j][k+1][3]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_mul) {
mat2x4 m1 = GLM_MAT2X4_ZERO_INIT;
mat4x2 m2 = GLM_MAT4X2_ZERO_INIT;
mat4 m3 = GLM_MAT4_ZERO_INIT;
mat4 m4 = GLM_MAT4_ZERO_INIT;
int c, r, k;
/* test random matrices */
/* random matrices */
test_rand_mat2x4(m1);
test_rand_mat4x2(m2);
for (r = 0; r < 4; r++) {
for (c = 0; c < 4; c++) {
for (k = 0; k < 2; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat2x4_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_mulv) {
mat2x4 mat = A_MATRIX2X4;
vec2 v = {11.0f, 21.0f};
int i;
vec4 dest;
float res = 0.0;
GLM(mat2x4_mulv)(mat, v, dest);
for (i = 0; i < 4; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_transpose) {
mat2x4 m1 = A_MATRIX2X4;
mat4x2 m2;
mat4x2 m3 = A_MATRIX2X4_TRANSPOSE;
GLM(mat2x4_transpose)(m1, m2);
ASSERTIFY(test_assert_mat4x2_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat2x4_scale) {
mat2x4 m1 = A_MATRIX2X4;
mat2x4 m2 = A_MATRIX2X4;
int i, j, scale;
scale = rand() % 100;
GLM(mat2x4_scale)(m1, (float) scale);
for (i = 0; i < 2; i++) {
for (j = 0; j < 4; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+329
View File
@@ -0,0 +1,329 @@
/*
* 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"
#define A_MATRIX {{1,2,3},{5,6,7},{9,10,11}}
#define MAT3_ARRAY {1, 5, 2, 7, 12, 1, 4, 6, 0}
TEST_IMPL(GLM_PREFIX, mat3_copy) {
mat3 m1 = A_MATRIX;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
GLM(mat3_copy)(m1, m2);
test_assert_mat3_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_identity) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
mat3 m3;
GLM(mat3_identity)(m3);
ASSERTIFY(test_assert_mat3_eq_identity(m1))
ASSERTIFY(test_assert_mat3_eq_identity(m2))
ASSERTIFY(test_assert_mat3_eq_identity(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_identity_array) {
size_t i, count;
mat3 matrices[4] = {
A_MATRIX,
A_MATRIX,
A_MATRIX,
A_MATRIX
};
count = 4;
GLM(mat3_identity_array)(matrices, count);
for (i = 0; i < count; i++) {
ASSERTIFY(test_assert_mat3_eq_identity(matrices[i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_zero) {
mat3 m1 = GLM_MAT3_ZERO_INIT;
mat3 m2 = GLM_MAT3_ZERO_INIT;
mat3 m3;
GLM(mat3_zero)(m3);
ASSERTIFY(test_assert_mat3_eq_zero(m1))
ASSERTIFY(test_assert_mat3_eq_zero(m2))
ASSERTIFY(test_assert_mat3_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_mul) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
mat3 m3;
mat3 m4 = GLM_MAT3_ZERO_INIT;
int i, j, k;
/* test random matrices */
/* random matrices */
test_rand_mat3(m1);
test_rand_mat3(m2);
GLM(mat3_mul)(m1, m2, m3);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
for (k = 0; k < 3; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
ASSERTIFY(test_assert_mat3_eq(m3, m4))
/* test pre compiled */
GLM(mat3_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat3_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_mulv) {
vec4 res;
mat3 mat = A_MATRIX;
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
int i;
GLM(mat3_mulv)(mat, v, res);
for (i = 0; i < 3; i++) {
ASSERT(test_eq(res[i],
v[0] * mat[0][i]
+ v[1] * mat[1][i]
+ v[2] * mat[2][i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_trace) {
mat3 mat = A_MATRIX;
float trace;
trace = GLM(mat3_trace)(mat);
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_quat) {
mat3 m1, m3;
mat4 m2;
versor q1, q2, q3;
vec3 axis1;
vec3 axis2 = {1.9f, 2.3f, 4.5f};
GLM(quat)(q1, GLM_PI_4f, 1.9f, 2.3f, 4.5f);
GLM(quat_mat3)(q1, m1);
GLM(mat3_quat)(m1, q2);
GLM(rotate_make)(m2, GLM_PI_4f, axis2);
GLM(mat3_quat)(m1, q3);
GLM(quat_axis)(q3, axis1);
GLM(vec3_normalize)(axis1);
GLM(vec3_normalize)(axis2);
GLM(mat4_pick3)(m2, m3);
ASSERT(test_eq(glm_quat_angle(q3), GLM_PI_4f))
ASSERTIFY(test_assert_vec3_eq(axis1, axis2))
ASSERTIFY(test_assert_vec4_eq(q1, q2))
ASSERTIFY(test_assert_mat3_eq(m1, m3))
ASSERTIFY(test_assert_vec4_eq(q1, q3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_transpose_to) {
mat3 mat = A_MATRIX;
mat3 m1;
GLM(mat3_transpose_to)(mat, m1);
ASSERTIFY(test_assert_mat3_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_transpose) {
mat3 mat = A_MATRIX;
mat3 m1;
GLM(mat3_copy)(mat, m1);
GLM(mat3_transpose)(m1);
ASSERTIFY(test_assert_mat3_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_scale) {
mat3 m1 = A_MATRIX;
mat3 m2 = A_MATRIX;
int i, j, k, scale;
scale = rand() % 100;
GLM(mat3_scale)(m1, (float)scale);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
for (k = 0; k < 3; k++)
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_det) {
mat3 mat;
float a, b, c,
d, e, f,
g, h, i;
float det1, det2;
test_rand_mat3(mat);
a = mat[0][0]; b = mat[0][1]; c = mat[0][2];
d = mat[1][0]; e = mat[1][1]; f = mat[1][2];
g = mat[2][0]; h = mat[2][1]; i = mat[2][2];
det1 = a * (e * i - h * f) - d * (b * i - c * h) + g * (b * f - c * e);
det2 = GLM(mat3_det)(mat);
ASSERT(test_eq(det1, det2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_inv) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
mat3 m3;
int i;
for (i = 0; i < 100000; i++) {
test_rand_mat3(m1);
test_rand_mat3(m2);
/* test inverse precise */
GLM(mat3_inv)(m1, m2);
GLM(mat3_inv)(m2, m3);
ASSERTIFY(test_assert_mat3_eq(m1, m3))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_swap_col) {
mat3 m1 = A_MATRIX;
mat3 m2 = A_MATRIX;
GLM(mat3_swap_col)(m1, 0, 1);
ASSERTIFY(test_assert_vec3_eq(m1[0], m2[1]))
ASSERTIFY(test_assert_vec3_eq(m1[1], m2[0]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_swap_row) {
mat3 m1 = A_MATRIX;
mat3 m2 = A_MATRIX;
GLM(mat3_swap_row)(m1, 0, 1);
ASSERT(test_eq(m1[0][0], m2[0][1]))
ASSERT(test_eq(m1[0][1], m2[0][0]))
ASSERT(test_eq(m1[0][2], m2[0][2]))
ASSERT(test_eq(m1[1][0], m2[1][1]))
ASSERT(test_eq(m1[1][1], m2[1][0]))
ASSERT(test_eq(m1[1][2], m2[1][2]))
ASSERT(test_eq(m1[2][0], m2[2][1]))
ASSERT(test_eq(m1[2][1], m2[2][0]))
ASSERT(test_eq(m1[2][2], m2[2][2]))
GLM(mat3_swap_row)(m1, 1, 2);
ASSERT(test_eq(m1[0][0], m2[0][1]))
ASSERT(test_eq(m1[0][1], m2[0][2]))
ASSERT(test_eq(m1[0][2], m2[0][0]))
ASSERT(test_eq(m1[1][0], m2[1][1]))
ASSERT(test_eq(m1[1][1], m2[1][2]))
ASSERT(test_eq(m1[1][2], m2[1][0]))
ASSERT(test_eq(m1[2][0], m2[2][1]))
ASSERT(test_eq(m1[2][1], m2[2][2]))
ASSERT(test_eq(m1[2][2], m2[2][0]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_rmc) {
mat3 mat = A_MATRIX;
vec3 v = {11.0f, 12.0f, 13.0f};
vec3 v1;
float r1, r2;
int i;
r1 = GLM(mat3_rmc)(v, mat, v);
for (i = 0; i < 3; i++) {
v1[i] = v[0] * mat[i][0]
+ v[1] * mat[i][1]
+ v[2] * mat[i][2];
}
r2 = v[0] * v1[0] + v[1] * v1[1] + v[2] * v1[2];
ASSERT(test_eq(r1, r2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3_make) {
mat3 dest;
unsigned int i, j;
float src[9] = MAT3_ARRAY;
GLM(mat3_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=3, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
ASSERT(test_eq(dest[j][2], src[i+2]))
}
TEST_SUCCESS
}
#undef A_MATRIX
+155
View File
@@ -0,0 +1,155 @@
/*
* 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"
#define A_MATRIX3X2 {{1,2},{5,6},{3,7}}
#define A_MATRIX3X2_TRANSPOSE {{1,5,3}, {2,6,7}}
#ifndef CGLM_TEST_MAT3X2_ONCE
#define CGLM_TEST_MAT3X2_ONCE
TEST_IMPL(MACRO_GLM_MAT3X2_ZERO_INIT) {
mat3x2 mat3x2_zero = GLM_MAT3X2_ZERO_INIT;
test_assert_mat3x2_eq_zero(mat3x2_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT3X2_ZERO) {
mat3x2 mat3x2_zero = GLM_MAT3X2_ZERO;
test_assert_mat3x2_eq_zero(mat3x2_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT3X2_ONCE */
TEST_IMPL(GLM_PREFIX, mat3x2_copy) {
mat3x2 m1 = A_MATRIX3X2;
mat3x2 m2 = GLM_MAT3X2_ZERO_INIT;
GLM(mat3x2_copy)(m1, m2);
test_assert_mat3x2_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_zero) {
mat3x2 m1 = GLM_MAT3X2_ZERO_INIT;
mat3x2 m2 = GLM_MAT3X2_ZERO_INIT;
mat3x2 m3;
GLM(mat3x2_zero)(m3);
ASSERTIFY(test_assert_mat3x2_eq_zero(m1))
ASSERTIFY(test_assert_mat3x2_eq_zero(m2))
ASSERTIFY(test_assert_mat3x2_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_make) {
float src[18] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f,
2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f
};
mat3x2 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=6,j++) {
GLM(mat3x2_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k+1][0]));
ASSERT(test_eq(src[i+3], dest[j][k+1][1]));
ASSERT(test_eq(src[i+4], dest[j][k+2][0]));
ASSERT(test_eq(src[i+5], dest[j][k+2][1]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_mul) {
mat3x2 m1 = GLM_MAT3X2_ZERO_INIT;
mat2x3 m2 = GLM_MAT2X3_ZERO_INIT;
mat2 m3 = GLM_MAT2_ZERO_INIT;
mat2 m4 = GLM_MAT2_ZERO_INIT;
int c, r, k;
test_rand_mat3x2(m1);
test_rand_mat2x3(m2);
for (r = 0; r < 2; r++) {
for (c = 0; c < 2; c++) {
for (k = 0; k < 3; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat3x2_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_mulv) {
mat3x2 mat = A_MATRIX3X2;
vec3 v = {11.0f, 21.0f, 31.0f};
int i;
vec2 dest;
float res = 0.0;
GLM(mat3x2_mulv)(mat, v, dest);
for (i = 0; i < 2; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_transpose) {
mat3x2 m1 = A_MATRIX3X2;
mat2x3 m2;
mat2x3 m3 = A_MATRIX3X2_TRANSPOSE;
GLM(mat3x2_transpose)(m1, m2);
ASSERTIFY(test_assert_mat2x3_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x2_scale) {
mat3x2 m1 = A_MATRIX3X2;
mat3x2 m2 = A_MATRIX3X2;
int i, j, scale;
scale = rand() % 100;
GLM(mat3x2_scale)(m1, (float) scale);
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+161
View File
@@ -0,0 +1,161 @@
/*
* 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"
#define A_MATRIX3X4 {{1,2,4,5},{6,7,8,9},{10,11,12,13}}
#define A_MATRIX3X4_TRANSPOSE {{1,6,10}, {2,7,1}, {4,8,12}, {5,9,13}}
#ifndef CGLM_TEST_MAT3X4_ONCE
#define CGLM_TEST_MAT3X4_ONCE
TEST_IMPL(MACRO_GLM_MAT3X4_ZERO_INIT) {
mat3x4 mat3x4_zero = GLM_MAT3X4_ZERO_INIT;
test_assert_mat3x4_eq_zero(mat3x4_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT3X4_ZERO) {
mat3x4 mat3x4_zero = GLM_MAT3X4_ZERO;
test_assert_mat3x4_eq_zero(mat3x4_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT3X4_ONCE */
TEST_IMPL(GLM_PREFIX, mat3x4_copy) {
mat3x4 m1 = A_MATRIX3X4;
mat3x4 m2 = GLM_MAT3X4_ZERO_INIT;
GLM(mat3x4_copy)(m1, m2);
test_assert_mat3x4_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_zero) {
mat3x4 m1 = GLM_MAT3X4_ZERO_INIT;
mat3x4 m2 = GLM_MAT3X4_ZERO_INIT;
mat3x4 m3;
GLM(mat3x4_zero)(m3);
ASSERTIFY(test_assert_mat3x4_eq_zero(m1))
ASSERTIFY(test_assert_mat3x4_eq_zero(m2))
ASSERTIFY(test_assert_mat3x4_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_make) {
float src[36] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f, 2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f,
2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f, 0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f, 2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f
};
mat3x4 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=12,j++) {
GLM(mat3x4_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k][2]));
ASSERT(test_eq(src[i+3], dest[j][k][3]));
ASSERT(test_eq(src[i+4], dest[j][k+1][0]));
ASSERT(test_eq(src[i+5], dest[j][k+1][1]));
ASSERT(test_eq(src[i+6], dest[j][k+1][2]));
ASSERT(test_eq(src[i+7], dest[j][k+1][3]));
ASSERT(test_eq(src[i+8], dest[j][k+2][0]));
ASSERT(test_eq(src[i+9], dest[j][k+2][1]));
ASSERT(test_eq(src[i+10], dest[j][k+2][2]));
ASSERT(test_eq(src[i+11], dest[j][k+2][3]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_mul) {
mat3x4 m1 = GLM_MAT3X4_ZERO_INIT;
mat4x3 m2 = GLM_MAT4X3_ZERO_INIT;
mat4 m3 = GLM_MAT4_ZERO_INIT;
mat4 m4 = GLM_MAT4_ZERO_INIT;
int c, r, k;
test_rand_mat3x4(m1);
test_rand_mat4x3(m2);
for (r = 0; r < 4; r++) {
for (c = 0; c < 4; c++) {
for (k = 0; k < 3; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat3x4_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_mulv) {
mat3x4 mat = A_MATRIX3X4;
vec4 v = {11.0f, 21.0f, 31.0f};
int i;
vec4 dest;
float res = 0.0;
GLM(mat3x4_mulv)(mat, v, dest);
for (i = 0; i < 4; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_transpose) {
mat3x4 m1 = A_MATRIX3X4;
mat4x3 m2;
mat4x3 m3 = A_MATRIX3X2_TRANSPOSE;
GLM(mat3x4_transpose)(m1, m2);
ASSERTIFY(test_assert_mat4x3_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat3x4_scale) {
mat3x4 m1 = A_MATRIX3X4;
mat3x4 m2 = A_MATRIX3X4;
int i, j, scale;
scale = rand() % 100;
GLM(mat3x4_scale)(m1, (float) scale);
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+506
View File
@@ -0,0 +1,506 @@
/*
* 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"
#define A_MATRIX {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}
#define A_MATRIX3 {{1,2,3},{5,6,7},{9,10,11}}
#define MAT4_ARRAY {1, 5, 2, 7, 12, 1, 4, 6, 0, 8, 1, 0, 6, 5, 0, 1}
TEST_IMPL(GLM_PREFIX, mat4_ucopy) {
mat4 m1 = A_MATRIX;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
GLM(mat4_ucopy)(m1, m2);
ASSERTIFY(test_assert_mat4_eq(m1, m2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_copy) {
mat4 m1 = A_MATRIX;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
GLM(mat4_copy)(m1, m2);
test_assert_mat4_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_identity) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
mat4 m3;
GLM(mat4_identity)(m3);
ASSERTIFY(test_assert_mat4_eq_identity(m1))
ASSERTIFY(test_assert_mat4_eq_identity(m2))
ASSERTIFY(test_assert_mat4_eq_identity(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_identity_array) {
size_t i, count;
mat4 matrices[4] = {
A_MATRIX,
A_MATRIX,
A_MATRIX,
A_MATRIX
};
count = 4;
GLM(mat4_identity_array)(matrices, count);
for (i = 0; i < count; i++) {
ASSERTIFY(test_assert_mat4_eq_identity(matrices[i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_zero) {
mat4 m1 = GLM_MAT4_ZERO_INIT;
mat4 m2 = GLM_MAT4_ZERO_INIT;
mat4 m3;
GLM(mat4_zero)(m3);
ASSERTIFY(test_assert_mat4_eq_zero(m1))
ASSERTIFY(test_assert_mat4_eq_zero(m2))
ASSERTIFY(test_assert_mat4_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_pick3) {
mat4 m1 = A_MATRIX;
mat3 m2 = GLM_MAT3_ZERO_INIT;
mat3 m3 = A_MATRIX3;
GLM(mat4_pick3)(m1, m2);
ASSERTIFY(test_assert_mat3_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_pick3t) {
mat4 m1 = A_MATRIX;
mat3 m2 = GLM_MAT3_ZERO_INIT;
mat3 m3 = A_MATRIX3;
GLM(mat4_pick3t)(m1, m2);
ASSERTIFY(test_assert_mat3_eqt(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_ins3) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat3 m2 = A_MATRIX3;
int i, j;
GLM(mat4_ins3)(m2, m1);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
ASSERT(m1[i][j] == m2[i][j])
}
}
ASSERT(test_eq(m1[3][0], 0.0f))
ASSERT(test_eq(m1[3][1], 0.0f))
ASSERT(test_eq(m1[3][2], 0.0f))
ASSERT(test_eq(m1[3][3], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_mul) {
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
mat4 m3;
mat4 m4 = GLM_MAT4_ZERO_INIT;
int i, j, k;
/* test random matrices */
/* random matrices */
test_rand_mat4(m1);
test_rand_mat4(m2);
GLM(mat4_mul)(m1, m2, m3);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
/* column-major */
m4[i][j] += m1[k][j] * m2[i][k];
}
}
ASSERTIFY(test_assert_mat4_eq(m3, m4))
/* test pre compiled */
GLM(mat4_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_mulN) {
mat4 res1, res2;
mat4 m1 = A_MATRIX;
mat4 m2 = A_MATRIX;
mat4 m3 = A_MATRIX;
mat4 *matrices[] = {
&m1, &m2, &m3
};
GLM(mat4_mulN)(matrices, sizeof(matrices) / sizeof(matrices[0]), res1);
GLM(mat4_mul)(*matrices[0], *matrices[1], res2);
GLM(mat4_mul)(res2, *matrices[2], res2);
ASSERTIFY(test_assert_mat4_eq(res1, res1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_mulv) {
vec4 res;
mat4 mat = A_MATRIX;
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
int i;
GLM(mat4_mulv)(mat, v, res);
for (i = 0; i < 4; i++) {
ASSERT(test_eq(res[i],
v[0] * mat[0][i]
+ v[1] * mat[1][i]
+ v[2] * mat[2][i]
+ v[3] * mat[3][i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_mulv3) {
vec4 res;
mat4 mat = A_MATRIX;
vec3 v = {1.0f, 2.0f, 3.0f};
float last;
int i;
last = 1.0f;
GLM(mat4_mulv3)(mat, v, last, res);
for (i = 0; i < 3; i++) {
ASSERT(test_eq(res[i],
v[0] * mat[0][i]
+ v[1] * mat[1][i]
+ v[2] * mat[2][i]
+ last * mat[3][i]))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_trace) {
mat4 mat = A_MATRIX;
float trace;
trace = GLM(mat4_trace)(mat);
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2] + mat[3][3]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_trace3) {
mat4 mat = A_MATRIX;
float trace;
trace = GLM(mat4_trace3)(mat);
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_quat) {
mat4 m1, m2;
versor q1, q2, q3;
vec3 axis1;
vec3 axis2 = {1.9f, 2.3f, 4.5f};
GLM(quat)(q1, GLM_PI_4f, 1.9f, 2.3f, 4.5f);
GLM(quat_mat4)(q1, m1);
GLM(mat4_quat)(m1, q2);
GLM(rotate_make)(m2, GLM_PI_4f, axis2);
GLM(mat4_quat)(m1, q3);
GLM(quat_axis)(q3, axis1);
GLM(vec3_normalize)(axis1);
GLM(vec3_normalize)(axis2);
ASSERT(test_eq(glm_quat_angle(q3), GLM_PI_4f))
ASSERTIFY(test_assert_vec3_eq(axis1, axis2))
ASSERTIFY(test_assert_vec4_eq(q1, q2))
ASSERTIFY(test_assert_mat4_eq(m1, m2))
ASSERTIFY(test_assert_vec4_eq(q1, q3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_transpose_to) {
mat4 mat = A_MATRIX;
mat4 m1;
GLM(mat4_transpose_to)(mat, m1);
ASSERTIFY(test_assert_mat4_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_transpose) {
mat4 mat = A_MATRIX;
mat4 m1;
GLM(mat4_copy)(mat, m1);
GLM(mat4_transpose)(m1);
ASSERTIFY(test_assert_mat4_eqt(mat, m1))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_scale_p) {
mat4 m1 = A_MATRIX;
mat4 m2 = A_MATRIX;
int i, j, k, scale;
scale = rand() % 100;
GLM(mat4_scale_p)(m1, (float)scale);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_scale) {
mat4 m1 = A_MATRIX;
mat4 m2 = A_MATRIX;
int i, j, k, scale;
scale = rand() % 100;
GLM(mat4_scale)(m1, (float)scale);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
for (k = 0; k < 4; k++)
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_det) {
mat4 mat = GLM_MAT4_IDENTITY_INIT;
float t[6];
float a, b, c, d,
e, f, g, h,
i, j, k, l,
m, n, o, p;
float det1, det2;
test_rand_mat4(mat);
a = mat[0][0]; b = mat[0][1]; c = mat[0][2]; d = mat[0][3];
e = mat[1][0]; f = mat[1][1]; g = mat[1][2]; h = mat[1][3];
i = mat[2][0]; j = mat[2][1]; k = mat[2][2]; l = mat[2][3];
m = mat[3][0]; n = mat[3][1]; o = mat[3][2]; p = mat[3][3];
t[0] = k * p - o * l;
t[1] = j * p - n * l;
t[2] = j * o - n * k;
t[3] = i * p - m * l;
t[4] = i * o - m * k;
t[5] = i * n - m * j;
det1 = a * (f * t[0] - g * t[1] + h * t[2])
- b * (e * t[0] - g * t[3] + h * t[4])
+ c * (e * t[1] - f * t[3] + h * t[5])
- d * (e * t[2] - f * t[4] + g * t[5]);
det2 = GLM(mat4_det(mat));
ASSERT(test_eq(det1, det2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_inv) {
mat4 m1, m2, m3;
int i;
for (i = 0; i < 100000; i++) {
test_rand_mat4(m1);
test_rand_mat4(m2);
/* test inverse precise */
GLM(mat4_inv)(m1, m2);
GLM(mat4_inv)(m2, m3);
ASSERTIFY(test_assert_mat4_eq(m1, m3))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_inv_precise) {
mat4 m1, m2, m3;
mat4 m4, m5, m6;
int i;
for (i = 0; i < 100000; i++) {
test_rand_mat4(m1);
test_rand_mat4(m2);
glm_mat4_inv_precise(m1, m2);
glm_mat4_inv_precise(m2, m3);
ASSERTIFY(test_assert_mat4_eq(m1, m3))
test_rand_mat4(m4);
test_rand_mat4(m5);
glmc_mat4_inv_precise(m4, m5);
glmc_mat4_inv_precise(m5, m6);
ASSERTIFY(test_assert_mat4_eq(m4, m6))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_inv_fast) {
mat4 m1, m2, m3;
int i;
for (i = 0; i < 100000; i++) {
test_rand_mat4(m1);
test_rand_mat4(m2);
/* test inverse precise */
GLM(mat4_inv_fast)(m1, m2);
GLM(mat4_inv_fast)(m2, m3);
ASSERTIFY(test_assert_mat4_eq2(m1, m3, 0.0009f))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_swap_col) {
mat4 m1 = A_MATRIX;
mat4 m2 = A_MATRIX;
GLM(mat4_swap_col)(m1, 0, 1);
GLM(mat4_swap_col)(m1, 2, 3);
ASSERTIFY(test_assert_vec4_eq(m1[0], m2[1]))
ASSERTIFY(test_assert_vec4_eq(m1[1], m2[0]))
ASSERTIFY(test_assert_vec4_eq(m1[2], m2[3]))
ASSERTIFY(test_assert_vec4_eq(m1[3], m2[2]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_swap_row) {
mat4 m1 = A_MATRIX;
mat4 m2 = A_MATRIX;
GLM(mat4_swap_row)(m1, 0, 1);
GLM(mat4_swap_row)(m1, 2, 3);
ASSERT(test_eq(m1[0][0], m2[0][1]))
ASSERT(test_eq(m1[0][1], m2[0][0]))
ASSERT(test_eq(m1[0][2], m2[0][3]))
ASSERT(test_eq(m1[0][3], m2[0][2]))
ASSERT(test_eq(m1[1][0], m2[1][1]))
ASSERT(test_eq(m1[1][1], m2[1][0]))
ASSERT(test_eq(m1[1][2], m2[1][3]))
ASSERT(test_eq(m1[1][3], m2[1][2]))
ASSERT(test_eq(m1[2][0], m2[2][1]))
ASSERT(test_eq(m1[2][1], m2[2][0]))
ASSERT(test_eq(m1[2][2], m2[2][3]))
ASSERT(test_eq(m1[2][3], m2[2][2]))
ASSERT(test_eq(m1[3][0], m2[3][1]))
ASSERT(test_eq(m1[3][1], m2[3][0]))
ASSERT(test_eq(m1[3][2], m2[3][3]))
ASSERT(test_eq(m1[3][3], m2[3][2]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_rmc) {
mat4 mat = A_MATRIX;
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
vec4 v1;
float r1, r2;
int i;
r1 = GLM(mat4_rmc)(v, mat, v);
for (i = 0; i < 4; i++) {
v1[i] = v[0] * mat[i][0]
+ v[1] * mat[i][1]
+ v[2] * mat[i][2]
+ v[3] * mat[i][3];
}
r2 = v[0] * v1[0] + v[1] * v1[1] + v[2] * v1[2] + v[3] * v1[3];
ASSERT(test_eq(r1, r2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4_make) {
mat4 dest;
unsigned int i, j;
float src[16] = MAT4_ARRAY;
GLM(mat4_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=4, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
ASSERT(test_eq(dest[j][2], src[i+2]))
ASSERT(test_eq(dest[j][3], src[i+3]))
}
TEST_SUCCESS
}
#undef A_MATRIX
#undef A_MATRIX3
+158
View File
@@ -0,0 +1,158 @@
/*
* 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"
#define A_MATRIX4X2 {{1,2},{3,4},{5,6},{7,8}}
#define A_MATRIX4X2_TRANSPOSE {{1,3,5,7}, {2,4,6,8}}
#ifndef CGLM_TEST_MAT4X2_ONCE
#define CGLM_TEST_MAT4X2_ONCE
TEST_IMPL(MACRO_GLM_MAT4X2_ZERO_INIT) {
mat4x2 mat4x2_zero = GLM_MAT4X2_ZERO_INIT;
test_assert_mat4x2_eq_zero(mat4x2_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT4X2_ZERO) {
mat4x2 mat4x2_zero = GLM_MAT4X2_ZERO;
test_assert_mat4x2_eq_zero(mat4x2_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT4X2_ONCE */
TEST_IMPL(GLM_PREFIX, mat4x2_copy) {
mat4x2 m1 = A_MATRIX4X2;
mat4x2 m2 = GLM_MAT4X2_ZERO_INIT;
GLM(mat4x2_copy)(m1, m2);
test_assert_mat4x2_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_zero) {
mat4x2 m1 = GLM_MAT4X2_ZERO_INIT;
mat4x2 m2 = GLM_MAT4X2_ZERO_INIT;
mat4x2 m3;
GLM(mat4x2_zero)(m3);
ASSERTIFY(test_assert_mat4x2_eq_zero(m1))
ASSERTIFY(test_assert_mat4x2_eq_zero(m2))
ASSERTIFY(test_assert_mat4x2_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_make) {
float src[24] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f, 2.3f, 4.2f,
2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f, 0.5f, 1.7f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f, 2.3f, 4.2f
};
mat4x2 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=8,j++) {
GLM(mat4x2_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k+1][0]));
ASSERT(test_eq(src[i+3], dest[j][k+1][1]));
ASSERT(test_eq(src[i+4], dest[j][k+2][0]));
ASSERT(test_eq(src[i+5], dest[j][k+2][1]));
ASSERT(test_eq(src[i+6], dest[j][k+3][0]));
ASSERT(test_eq(src[i+7], dest[j][k+3][1]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_mul) {
mat4x2 m1 = GLM_MAT4X2_ZERO_INIT;
mat2x4 m2 = GLM_MAT2X4_ZERO_INIT;
mat2 m3 = GLM_MAT2_ZERO_INIT;
mat2 m4 = GLM_MAT2_ZERO_INIT;
int c, r, k;
test_rand_mat4x2(m1);
test_rand_mat2x4(m2);
for (r = 0; r < 2; r++) {
for (c = 0; c < 2; c++) {
for (k = 0; k < 4; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat4x2_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_mulv) {
mat4x2 mat = A_MATRIX4X2;
vec4 v = {11.0f, 21.0f, 31.0f, 41.0f};
int i;
vec2 dest;
float res = 0.0;
GLM(mat4x2_mulv)(mat, v, dest);
for (i = 0; i < 2; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2] + mat[3][i] * v[3];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_transpose) {
mat4x2 m1 = A_MATRIX4X2;
mat2x4 m2;
mat2x4 m3 = A_MATRIX4X2_TRANSPOSE;
GLM(mat4x2_transpose)(m1, m2);
ASSERTIFY(test_assert_mat2x4_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x2_scale) {
mat4x2 m1 = A_MATRIX4X2;
mat4x2 m2 = A_MATRIX4X2;
int i, j, scale;
scale = rand() % 100;
GLM(mat4x2_scale)(m1, (float) scale);
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+162
View File
@@ -0,0 +1,162 @@
/*
* 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"
#define A_MATRIX4X3 {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}
#define A_MATRIX4X3_TRANSPOSE {{1,4,7,10},{2,5,8,11},{3,6,9,12}}
#ifndef CGLM_TEST_MAT4X3_ONCE
#define CGLM_TEST_MAT4X3_ONCE
TEST_IMPL(MACRO_GLM_MAT4X3_ZERO_INIT) {
mat4x3 mat4x3_zero = GLM_MAT4X3_ZERO_INIT;
test_assert_mat4x3_eq_zero(mat4x3_zero);
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_MAT4X3_ZERO) {
mat4x3 mat4x3_zero = GLM_MAT4X3_ZERO;
test_assert_mat4x3_eq_zero(mat4x3_zero);
TEST_SUCCESS
}
#endif /* CGLM_TEST_MAT4X3_ONCE */
TEST_IMPL(GLM_PREFIX, mat4x3_copy) {
mat4x3 m1 = A_MATRIX4X3;
mat4x3 m2 = GLM_MAT4X3_ZERO_INIT;
GLM(mat4x3_copy)(m1, m2);
test_assert_mat4x3_eq(m1, m2);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_zero) {
mat4x3 m1 = GLM_MAT4X3_ZERO_INIT;
mat4x3 m2 = GLM_MAT4X3_ZERO_INIT;
mat4x3 m3;
GLM(mat4x3_zero)(m3);
ASSERTIFY(test_assert_mat4x3_eq_zero(m1))
ASSERTIFY(test_assert_mat4x3_eq_zero(m2))
ASSERTIFY(test_assert_mat4x3_eq_zero(m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_make) {
float src[36] = {
0.5f, 1.7f, 10.3f, 4.2f, 8.9f, 1.1f, 2.3f, 4.2f, 5.3f, 4.8f, 96.3f, 13.7f,
4.7f, 5.5f, 2.3f, 4.2f, 2.3f, 4.2f, 66.5f, 23.7f, 6.6f, 8.9f, 0.5f, 1.7f,
5.3f, 4.8f, 96.3f, 13.7f, 4.7f, 5.5f, 2.3f, 4.2f, 0.5f, 1.7f, 10.3f, 4.2f
};
mat4x3 dest[3];
float *srcp = src;
unsigned int i, j, k;
for (i = 0, j = 0, k = 0; i < sizeof(src) / sizeof(float); i+=12,j++) {
GLM(mat4x3_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][k][0]));
ASSERT(test_eq(src[i+1], dest[j][k][1]));
ASSERT(test_eq(src[i+2], dest[j][k][2]));
ASSERT(test_eq(src[i+3], dest[j][k+1][0]));
ASSERT(test_eq(src[i+4], dest[j][k+1][1]));
ASSERT(test_eq(src[i+5], dest[j][k+1][2]));
ASSERT(test_eq(src[i+6], dest[j][k+2][0]));
ASSERT(test_eq(src[i+7], dest[j][k+2][1]));
ASSERT(test_eq(src[i+8], dest[j][k+2][2]));
ASSERT(test_eq(src[i+9], dest[j][k+3][0]));
ASSERT(test_eq(src[i+10], dest[j][k+3][1]));
ASSERT(test_eq(src[i+11], dest[j][k+3][2]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_mul) {
mat4x3 m1 = GLM_MAT4X3_ZERO_INIT;
mat3x4 m2 = GLM_MAT3X4_ZERO_INIT;
mat3 m3 = GLM_MAT3_ZERO_INIT;
mat3 m4 = GLM_MAT3_ZERO_INIT;
int c, r, k;
test_rand_mat4x3(m1);
test_rand_mat3x4(m2);
for (r = 0; r < 3; r++) {
for (c = 0; c < 3; c++) {
for (k = 0; k < 4; k++) {
m4[c][r] += m1[k][r] * m2[c][k];
}
}
}
GLM(mat4x3_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat3_eq(m3, m4))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_mulv) {
mat4x3 mat = A_MATRIX4X3;
vec4 v = {11.0f, 21.0f, 31.0f, 41.0f};
int i;
vec3 dest;
float res = 0.0;
GLM(mat4x3_mulv)(mat, v, dest);
for (i = 0; i < 3; i++) {
res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2] + mat[3][i] * v[3];
ASSERT(test_eq(dest[i], res))
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_transpose) {
mat4x3 m1 = A_MATRIX4X3;
mat3x4 m2;
mat3x4 m3 = A_MATRIX4X3_TRANSPOSE;
GLM(mat4x3_transpose)(m1, m2);
ASSERTIFY(test_assert_mat3x4_eq(m2, m3))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, mat4x3_scale) {
mat4x3 m1 = A_MATRIX4X3;
mat4x3 m2 = A_MATRIX4X3;
int i, j, scale;
scale = rand() % 100;
GLM(mat4x3_scale)(m1, (float) scale);
for (i = 0; i < 4; i++) {
for (j = 0; j < 3; j++) {
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
}
}
TEST_SUCCESS
}
+118
View File
@@ -0,0 +1,118 @@
/*
* 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, perlin_vec4) {
vec4 p1[] = {
{0.1f, 0.2f, 0.3f, 0.4f},
{0.2f, 0.3f, 0.4f, 0.5f},
{0.3f, 0.4f, 0.5f, 0.6f},
{0.4f, 0.5f, 0.6f, 0.7f},
{0.5f, 0.6f, 0.7f, 0.8f},
{0.6f, 0.7f, 0.8f, 0.9f},
{0.7f, 0.8f, 0.9f, 1.0f},
{0.8f, 0.9f, 1.0f, 1.1f},
{0.9f, 1.0f, 1.1f, 1.2f},
{1.0f, 1.1f, 1.2f, 1.3f},
};
/* expected values calculated by glm::perlin */
float e[] = {
-0.5091819763183594f,
-0.4375732541084290f,
-0.3212279379367828f,
-0.2279999703168869f,
-0.1577337533235550f,
-0.0445968918502331f,
0.1069696992635727f,
0.2067739963531494f,
0.2106968611478806f,
0.1397782564163208f
};
for (int i = 0; i < 10; i++) {
ASSERT(test_eq(GLM(perlin_vec4)(p1[i]), e[i]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, perlin_vec3) {
vec3 p1[] = {
{0.1f, 0.2f, 0.3f},
{0.2f, 0.3f, 0.4f},
{0.3f, 0.4f, 0.5f},
{0.4f, 0.5f, 0.6f},
{0.5f, 0.6f, 0.7f},
{0.6f, 0.7f, 0.8f},
{0.7f, 0.8f, 0.9f},
{0.8f, 0.9f, 1.0f},
{0.9f, 1.0f, 1.1f},
{1.0f, 1.1f, 1.2f},
};
/* expected values calculated by glm::perlin */
float e[] = {
-0.2909241318702698f,
-0.4667602181434631f,
-0.4679279625415802f,
-0.2616460621356964f,
0.0562822706997395f,
0.3178773224353790f,
0.3981811404228210f,
0.3011017739772797f,
0.1263920217752457f,
-0.0602480024099350f
};
for (int i = 0; i < 10; i++) {
ASSERT(test_eq(GLM(perlin_vec3)(p1[i]), e[i]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, perlin_vec2) {
vec2 p1[] = {
{0.1f, 0.2f},
{0.2f, 0.3f},
{0.3f, 0.4f},
{0.4f, 0.5f},
{0.5f, 0.6f},
{0.6f, 0.7f},
{0.7f, 0.8f},
{0.8f, 0.9f},
{0.9f, 1.0f},
{1.0f, 1.1f},
};
/* expected values calculated by glm::perlin */
float e[] = {
0.2841092348098755f,
0.2328013032674789f,
-0.0017980185803026f,
-0.3300299644470215f,
-0.5998955368995667f,
-0.6914522647857666f,
-0.5896517634391785f,
-0.3778679668903351f,
-0.1557840555906296f,
0.0453133136034012f
};
for (int i = 0; i < 10; i++) {
ASSERT(test_eq(GLM(perlin_vec2)(p1[i]), e[i]));
}
TEST_SUCCESS
}
+39
View File
@@ -0,0 +1,39 @@
/*
* 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, plane_normalize) {
vec4 p1 = {2.0f, -3.0f, 4.0f, 5.0f}, p2 = {2.0f, -3.0f, 4.0f, 5.0f};
float s = 1.0f;
float norm;
GLM(plane_normalize)(p2);
norm = sqrtf(p1[0] * p1[0] + p1[1] * p1[1] + p1[2] * p1[2]);
if (norm == 0.0f) {
ASSERT(test_eq(p1[0], 0.0f))
ASSERT(test_eq(p1[1], 0.0f))
ASSERT(test_eq(p1[2], 0.0f))
ASSERT(test_eq(p1[3], 0.0f))
TEST_SUCCESS
}
norm = s / norm;
ASSERT(test_eq(p1[0] * norm, p2[0]))
ASSERT(test_eq(p1[1] * norm, p2[1]))
ASSERT(test_eq(p1[2] * norm, p2[2]))
ASSERT(test_eq(p1[3] * norm, p2[3]))
glm_vec4_zero(p1);
GLM(plane_normalize)(p1);
ASSERTIFY(test_assert_vec4_eq(p1, GLM_VEC4_ZERO))
TEST_SUCCESS
}
+112
View File
@@ -0,0 +1,112 @@
/*
* 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, unprojecti) {
mat4 model, view, proj, mvp;
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
vec3 pos = {13.0f, 45.0f, 0.74f};
vec3 projected, unprojected;
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
glm_perspective_default(0.5f, proj);
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
GLM(project)(pos, mvp, viewport, projected);
glm_mat4_inv(mvp, mvp);
GLM(unprojecti)(projected, mvp, viewport, unprojected);
/* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, unproject) {
mat4 model, view, proj, mvp;
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
vec3 pos = {13.0f, 45.0f, 0.74f};
vec3 projected, unprojected;
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
glm_perspective_default(0.5f, proj);
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
GLM(project)(pos, mvp, viewport, projected);
GLM(unproject)(projected, mvp, viewport, unprojected);
/* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, project) {
mat4 model, view, proj, mvp;
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
vec3 pos = {13.0f, 45.0f, 0.74f};
vec3 projected, unprojected;
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
glm_perspective_default(0.5f, proj);
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
GLM(project)(pos, mvp, viewport, projected);
GLM(unproject)(projected, mvp, viewport, unprojected);
/* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
/* test with no projection */
glm_mat4_identity(mvp);
GLM(project)(pos, mvp, viewport, projected);
GLM(unproject)(projected, mvp, viewport, unprojected);
ASSERT(test_eq(pos[0], unprojected[0]))
ASSERT(test_eq(pos[1], unprojected[1]))
ASSERT(test_eq(pos[2], unprojected[2]))
TEST_SUCCESS
}
File diff suppressed because it is too large Load Diff
+73
View File
@@ -0,0 +1,73 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"
TEST_IMPL(GLM_PREFIX, ray_triangle) {
/* Check whether a simple hit is recognized with the right distance */
vec3 origin = { 0.0f, 0.0f, 0.0f};
vec3 direction = { 1.0f, 0.0f, 0.0f};
vec3 opposite = {-1.0f, 0.0f, 0.0f};
vec3 v0 = { 5.0f, -1.0f, 1.0f};
vec3 v1 = { 5.0f, -1.0f, -1.0f};
vec3 v2 = { 5.0f, 1.0f, 0.0f};
float d;
bool hit;
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, &d);
ASSERT(hit);
ASSERT(fabsf(d - 5.0f) <= 0.0000009);
/* Check whether a simple miss works */
hit = GLM(ray_triangle)(origin, opposite, v0, v1, v2, &d);
ASSERT(!hit);
/* Check that we can disregard distance and pass NULL pointer instead */
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, NULL);
ASSERT(hit);
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ray_sphere) {
vec4 sphere = {5.0f, 0.0f, 0.0f, 1.0f}; /* Sphere: center at (5, 0, 0) with radius 1 */
float t1, t2;
bool hit;
/* Case 1: Ray misses the sphere */
hit = GLM(ray_sphere)((vec3){10.0f, 3.0f, 0.0f}, (vec3){1.0f, 0.0f, 0.0f}, sphere, &t1, &t2);
ASSERT(!hit); /* Expect no intersection */
/* Case 2: Ray starts inside the sphere */
hit = GLM(ray_sphere)((vec3){5.0f, 0.5f, 0.0f}, (vec3){1.0f, 0.0f, 0.0f}, sphere, &t1, &t2);
ASSERT(hit); /* Expect an intersection */
ASSERT(t1 < 0 && t2 > 0); /* Ray exits at t2 */
/* Case 3: Ray intersects the sphere from outside */
hit = GLM(ray_sphere)((vec3){0.0f, 0.0f, 0.0f}, (vec3){1.0f, 0.0f, 0.0f}, sphere, &t1, &t2);
ASSERT(hit); /* Expect an intersection */
ASSERT(t1 > 0 && t2 > 0); /* Intersections at t1 and t2 */
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ray_at) {
vec3 origin = {0.0f, 0.0f, 0.0f};
vec3 direction = {1.0f, 1.0f, 1.0f}; /* Diagonal direction */
float distance = sqrtf(3.0f); /* Distance along the ray; sqrt(3) for unit length due to direction normalization */
vec3 result;
/* Normalize the direction to ensure accurate distance measurement */
glm_vec3_normalize(direction);
GLM(ray_at)(origin, direction, distance, result);
ASSERT(fabsf(result[0] - 1.0f) <= 0.0000009); /* Expecting to be 1 unit along the x-axis */
ASSERT(fabsf(result[1] - 1.0f) <= 0.0000009); /* Expecting to be 1 unit along the y-axis */
ASSERT(fabsf(result[2] - 1.0f) <= 0.0000009); /* Expecting to be 1 unit along the z-axis */
TEST_SUCCESS
}
+150
View File
@@ -0,0 +1,150 @@
/*
* 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(mat2x3s_zero_init) {
mat2x3s mat2x3_zero = GLMS_MAT2X3_ZERO_INIT;
test_assert_mat2x3_eq_zero(mat2x3_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat2x3s_zero) {
mat2x3s mat2x3_zero = GLMS_MAT2X3_ZERO;
test_assert_mat2x3_eq_zero(mat2x3_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat2x4s_zero_init) {
mat2x4s mat2x4_zero = GLMS_MAT2X4_ZERO_INIT;
test_assert_mat2x4_eq_zero(mat2x4_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat2x4s_zero) {
mat2x4s mat2x4_zero = GLMS_MAT2X4_ZERO;
test_assert_mat2x4_eq_zero(mat2x4_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat3s_identity_init) {
mat3s mat3_identity = GLMS_MAT3_IDENTITY_INIT;
mat3 mat3_identity_a = GLM_MAT3_IDENTITY_INIT;
test_assert_mat3_eq(mat3_identity.raw, mat3_identity_a);
TEST_SUCCESS
}
TEST_IMPL(mat3s_zero_init) {
mat3s mat3_zero = GLMS_MAT3_ZERO_INIT;
mat3 mat3_zero_a = GLM_MAT3_ZERO_INIT;
test_assert_mat3_eq(mat3_zero.raw, mat3_zero_a);
TEST_SUCCESS
}
TEST_IMPL(mat3x2s_zero_init) {
mat3x2s mat3x2_zero = GLMS_MAT3X2_ZERO_INIT;
test_assert_mat3x2_eq_zero(mat3x2_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat3x2s_zero) {
mat3x2s mat3x2_zero = GLMS_MAT3X2_ZERO;
test_assert_mat3x2_eq_zero(mat3x2_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat3x4s_zero_init) {
mat3x4s mat3x4_zero = GLMS_MAT3X4_ZERO_INIT;
test_assert_mat3x4_eq_zero(mat3x4_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat3x4s_zero) {
mat3x4s mat3x4_zero = GLMS_MAT3X4_ZERO;
test_assert_mat3x4_eq_zero(mat3x4_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat4s_identity_init) {
mat4s mat4_identity = GLMS_MAT4_IDENTITY_INIT;
mat4 mat4_identity_a = GLM_MAT4_IDENTITY_INIT;
test_assert_mat4_eq(mat4_identity.raw, mat4_identity_a);
TEST_SUCCESS
}
TEST_IMPL(mat4s_zero_init) {
mat4s mat4_zero = GLMS_MAT4_ZERO_INIT;
mat4 mat4_zero_a = GLM_MAT4_ZERO_INIT;
test_assert_mat4_eq(mat4_zero.raw, mat4_zero_a);
TEST_SUCCESS
}
TEST_IMPL(mat4x2s_zero_init) {
mat4x2s mat4x2_zero = GLMS_MAT4X2_ZERO_INIT;
test_assert_mat4x2_eq_zero(mat4x2_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat4x2s_zero) {
mat4x2s mat4x2_zero = GLMS_MAT4X2_ZERO;
test_assert_mat4x2_eq_zero(mat4x2_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat4x3s_zero_init) {
mat4x3s mat4x3_zero = GLMS_MAT4X3_ZERO_INIT;
test_assert_mat4x3_eq_zero(mat4x3_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(mat4x3s_zero) {
mat4x3s mat4x3_zero = GLMS_MAT4X3_ZERO;
test_assert_mat4x3_eq_zero(mat4x3_zero.raw);
TEST_SUCCESS
}
TEST_IMPL(quats_zero_init) {
versors quat_zero = GLMS_QUAT_IDENTITY_INIT;
versor quat_zero_a = GLM_QUAT_IDENTITY_INIT;
test_assert_quat_eq(quat_zero.raw, quat_zero_a);
TEST_SUCCESS
}
TEST_IMPL(vec3s_one_init) {
vec3s vec3_one = GLMS_VEC3_ONE_INIT;
vec3 vec3_one_a = GLM_VEC3_ONE_INIT;
test_assert_vec3_eq(vec3_one.raw, vec3_one_a);
TEST_SUCCESS
}
TEST_IMPL(vec3s_zero_init) {
vec3s vec3_zero = GLMS_VEC3_ZERO_INIT;
vec3 vec3_zero_a = GLM_VEC3_ZERO_INIT;
test_assert_vec3_eq(vec3_zero.raw, vec3_zero_a);
TEST_SUCCESS
}
TEST_IMPL(vec4s_black_init) {
vec4s vec4_black = GLMS_VEC4_BLACK_INIT;
vec4 vec4_black_a = GLM_VEC4_BLACK_INIT;
test_assert_vec4_eq(vec4_black.raw, vec4_black_a);
TEST_SUCCESS
}
TEST_IMPL(vec4s_one_init) {
vec4s vec4_one = GLMS_VEC4_ONE_INIT;
vec4 vec4_one_a = GLM_VEC4_ONE_INIT;
test_assert_vec4_eq(vec4_one.raw, vec4_one_a);
TEST_SUCCESS
}
TEST_IMPL(vec4s_zero_init) {
vec4s vec4_zero = GLMS_VEC4_ZERO_INIT;
vec4 vec4_zero_a = GLM_VEC4_ZERO_INIT;
test_assert_vec4_eq(vec4_zero.raw, vec4_zero_a);
TEST_SUCCESS
}
+951
View File
@@ -0,0 +1,951 @@
/*
* 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"
#ifndef CGLM_TEST_VEC2_ONCE
#define CGLM_TEST_VEC2_ONCE
/* Macros */
TEST_IMPL(MACRO_GLM_VEC2_ONE_INIT) {
vec2 v = GLM_VEC2_ONE_INIT;
ASSERT(test_eq(v[0], 1.0f))
ASSERT(test_eq(v[1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_VEC2_ZERO_INIT) {
vec2 v = GLM_VEC2_ZERO_INIT;
ASSERT(test_eq(v[0], 0.0f))
ASSERT(test_eq(v[1], 0.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_VEC2_ONE) {
ASSERT(test_eq(GLM_VEC2_ONE[0], 1.0f))
ASSERT(test_eq(GLM_VEC2_ONE[1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(MACRO_GLM_VEC2_ZERO) {
ASSERT(test_eq(GLM_VEC2_ZERO[0], 0.0f))
ASSERT(test_eq(GLM_VEC2_ZERO[0], 0.0f))
TEST_SUCCESS
}
#endif /* CGLM_TEST_VEC2_ONCE */
TEST_IMPL(GLM_PREFIX, vec2) {
vec4 v4 = {10.0f, 9.0f, 8.0f, 7.0f};
vec3 v3 = {11.0f, 12.0f, 13.0f};
vec2 v2;
GLM(vec2)(v4, v2);
ASSERT(test_eq(v2[0], v4[0]))
ASSERT(test_eq(v2[1], v4[1]))
GLM(vec2)(v3, v2);
ASSERT(test_eq(v2[0], v3[0]))
ASSERT(test_eq(v2[1], v3[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_copy) {
vec2 v1 = {10.0f, 9.0f};
vec2 v2 = {1.0f, 2.0f};
GLM(vec2_copy)(v1, v2);
ASSERTIFY(test_assert_vec2_eq(v1, v2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_zero) {
vec2 v1 = {10.0f, 9.0f};
vec2 v2 = {1.0f, 2.0f};
GLM(vec2_zero)(v1);
GLM(vec2_zero)(v2);
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ZERO))
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ZERO))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_one) {
vec2 v1 = {10.0f, 9.0f};
vec2 v2 = {1.0f, 2.0f};
GLM(vec2_one)(v1);
GLM(vec2_one)(v2);
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ONE))
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ONE))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_dot) {
vec2 a = {10.0f, 9.0f};
vec2 b = {1.0f, 2.0f};
float dot1, dot2;
dot1 = GLM(vec2_dot)(a, b);
dot2 = a[0] * b[0] + a[1] * b[1];
ASSERT(test_eq(dot1, dot2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_cross) {
vec2 a = {10.0f, 9.0f};
vec2 b = {1.0f, 2.0f};
float cprod;
cprod = a[0] * b[1] - a[1] * b[0];
ASSERT(test_eq(glm_vec2_cross(a, b), cprod))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_norm2) {
vec2 a = {10.0f, 9.0f};
float n1, n2;
n1 = GLM(vec2_norm2)(a);
n2 = a[0] * a[0] + a[1] * a[1];
ASSERT(test_eq(n1, n2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_norm) {
vec2 a = {10.0f, 9.0f};
float n1, n2;
n1 = GLM(vec2_norm)(a);
n2 = sqrtf(a[0] * a[0] + a[1] * a[1]);
ASSERT(test_eq(n1, n2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_add) {
vec2 a = {-10.0f, 9.0f};
vec2 b = {12.0f, 19.0f};
vec2 c, d;
c[0] = a[0] + b[0];
c[1] = a[1] + b[1];
GLM(vec2_add)(a, b, d);
ASSERTIFY(test_assert_vec2_eq(c, d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_adds) {
vec4 a = {-10.0f, 9.0f};
vec4 c, d;
float s = 7.0f;
c[0] = a[0] + s;
c[1] = a[1] + s;
GLM(vec2_adds)(a, s, d);
ASSERTIFY(test_assert_vec2_eq(c, d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_sub) {
vec2 a = {-10.0f, 9.0f};
vec2 b = {12.0f, 19.0f};
vec2 c, d;
c[0] = a[0] - b[0];
c[1] = a[1] - b[1];
GLM(vec2_sub)(a, b, d);
ASSERTIFY(test_assert_vec2_eq(c, d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_subs) {
vec2 a = {-10.0f, 9.0f};
vec2 c, d;
float s = 7.0f;
c[0] = a[0] - s;
c[1] = a[1] - s;
GLM(vec2_subs)(a, s, d);
ASSERTIFY(test_assert_vec2_eq(c, d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_mul) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3;
GLM(vec2_mul)(v1, v2, v3);
ASSERT(test_eq(v1[0] * v2[0], v3[0]))
ASSERT(test_eq(v1[1] * v2[1], v3[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_scale) {
vec2 v1 = {2.0f, -3.0f}, v2;
float s = 7.0f;
GLM(vec2_scale)(v1, s, v2);
ASSERT(test_eq(v1[0] * s, v2[0]))
ASSERT(test_eq(v1[1] * s, v2[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_scale_as) {
vec2 v1 = {2.0f, -3.0f}, v2;
float s = 7.0f;
float norm;
GLM(vec2_scale_as)(v1, s, v2);
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
if (norm < FLT_EPSILON) {
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
TEST_SUCCESS
}
norm = s / norm;
ASSERT(test_eq(v1[0] * norm, v2[0]))
ASSERT(test_eq(v1[1] * norm, v2[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_div) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3;
GLM(vec2_div)(v1, v2, v3);
ASSERT(test_eq(v1[0] / v2[0], v3[0]))
ASSERT(test_eq(v1[1] / v2[1], v3[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_divs) {
vec2 v1 = {2.0f, -3.0f}, v2;
float s = 7.0f;
GLM(vec2_divs)(v1, s, v2);
ASSERT(test_eq(v1[0] / s, v2[0]))
ASSERT(test_eq(v1[1] / s, v2[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_addadd) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_addadd)(v1, v2, v4);
ASSERT(test_eq(v3[0] + v1[0] + v2[0], v4[0]))
ASSERT(test_eq(v3[1] + v1[1] + v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_subadd) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_subadd)(v1, v2, v4);
ASSERT(test_eq(v3[0] + v1[0] - v2[0], v4[0]))
ASSERT(test_eq(v3[1] + v1[1] - v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_muladd) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_muladd)(v1, v2, v4);
ASSERT(test_eq(v3[0] + v1[0] * v2[0], v4[0]))
ASSERT(test_eq(v3[1] + v1[1] * v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_muladds) {
vec2 v1 = {2.0f, -3.0f},
v2 = {1.0f, 2.0f},
v3 = {1.0f, 2.0f};
float s = 9.0f;
GLM(vec2_muladds)(v1, s, v3);
ASSERT(test_eq(v2[0] + v1[0] * s, v3[0]))
ASSERT(test_eq(v2[1] + v1[1] * s, v3[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_maxadd) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_maxadd)(v1, v2, v4);
ASSERT(test_eq(v3[0] + glm_max(v1[0], v2[0]), v4[0]))
ASSERT(test_eq(v3[1] + glm_max(v1[1], v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_minadd) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_minadd)(v1, v2, v4);
ASSERT(test_eq(v3[0] + glm_min(v1[0], v2[0]), v4[0]))
ASSERT(test_eq(v3[1] + glm_min(v1[1], v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_subsub) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_subsub)(v1, v2, v4);
ASSERT(test_eq(v3[0] - (v1[0] - v2[0]), v4[0]))
ASSERT(test_eq(v3[1] - (v1[1] - v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_addsub) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_addsub)(v1, v2, v4);
ASSERT(test_eq(v3[0] - (v1[0] + v2[0]), v4[0]))
ASSERT(test_eq(v3[1] - (v1[1] + v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_mulsub) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_mulsub)(v1, v2, v4);
ASSERT(test_eq(v3[0] - v1[0] * v2[0], v4[0]))
ASSERT(test_eq(v3[1] - v1[1] * v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_mulsubs) {
vec2 v1 = {2.0f, -3.0f},
v2 = {1.0f, 2.0f},
v3 = {1.0f, 2.0f};
float s = 9.0f;
GLM(vec2_mulsubs)(v1, s, v3);
ASSERT(test_eq(v2[0] - v1[0] * s, v3[0]))
ASSERT(test_eq(v2[1] - v1[1] * s, v3[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_maxsub) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_maxsub)(v1, v2, v4);
ASSERT(test_eq(v3[0] - glm_max(v1[0], v2[0]), v4[0]))
ASSERT(test_eq(v3[1] - glm_max(v1[1], v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_minsub) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {1.0f, 2.0f},
v4 = {1.0f, 2.0f};
GLM(vec2_minsub)(v1, v2, v4);
ASSERT(test_eq(v3[0] - glm_min(v1[0], v2[0]), v4[0]))
ASSERT(test_eq(v3[1] - glm_min(v1[1], v2[1]), v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_negate_to) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3, v4;
GLM(vec2_negate_to)(v1, v3);
GLM(vec2_negate_to)(v2, v4);
ASSERT(test_eq(-v1[0], v3[0]))
ASSERT(test_eq(-v1[1], v3[1]))
ASSERT(test_eq(-v2[0], v4[0]))
ASSERT(test_eq(-v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_negate) {
vec2 v1 = {2.0f, -3.0f},
v2 = {-3.0f, 4.0f},
v3 = {2.0f, -3.0f},
v4 = {-3.0f, 4.0f};
GLM(vec2_negate)(v1);
GLM(vec2_negate)(v2);
ASSERT(test_eq(-v1[0], v3[0]))
ASSERT(test_eq(-v1[1], v3[1]))
ASSERT(test_eq(-v2[0], v4[0]))
ASSERT(test_eq(-v2[1], v4[1]))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_normalize) {
vec2 v1 = {2.0f, -3.0f}, v2 = {2.0f, -3.0f};
float s = 1.0f;
float norm;
GLM(vec2_normalize)(v2);
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
if (norm < FLT_EPSILON) {
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
TEST_SUCCESS
}
norm = s / norm;
ASSERT(test_eq(v1[0] * norm, v2[0]))
ASSERT(test_eq(v1[1] * norm, v2[1]))
glm_vec2_zero(v1);
GLM(vec2_normalize)(v1);
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ZERO))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_normalize_to) {
vec2 v1 = {2.0f, -3.0f}, v2;
float s = 1.0f;
float norm;
GLM(vec2_normalize_to)(v1, v2);
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
if (norm < FLT_EPSILON) {
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 0.0f))
TEST_SUCCESS
}
norm = s / norm;
ASSERT(test_eq(v1[0] * norm, v2[0]))
ASSERT(test_eq(v1[1] * norm, v2[1]))
glm_vec2_zero(v1);
GLM(vec2_normalize_to)(v1, v2);
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ZERO))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_rotate) {
vec2 v1 = {1.0f, 0.0f};
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], 1.0f))
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], 0.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_center) {
vec2 v1 = {1.0f, 1.0f},
v2 = {0.0f, 0.0f};
vec2 dest;
GLM(vec2_center)(v1, v2, dest);
ASSERTIFY(test_assert_vec2_eq(dest, (vec2){ 0.5f, 0.5f }))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_distance2) {
vec2 v1 = {30.0f, 0.0f},
v2 = {0.0f, 0.0f},
v3 = {3.0f, 10.0f},
v4 = {0.46f, 4.0f};
float d;
d = GLM(vec2_distance2)(v1, v2);
ASSERT(test_eq(d, 30.0f * 30.0f))
d = GLM(vec2_distance2)(v3, v4);
ASSERT(test_eq(powf(v3[0] - v4[0], 2.0f)
+ powf(v3[1] - v4[1], 2.0f), d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_distance) {
vec2 v1 = {30.0f, 0.0f},
v2 = {0.0f, 0.0f},
v3 = {3.0f, 10.0f},
v4 = {0.46f, 4.0f};
float d;
d = GLM(vec2_distance)(v1, v2);
ASSERT(test_eq(d, 30.0f))
d = GLM(vec2_distance)(v3, v4);
ASSERT(test_eq(sqrtf(powf(v3[0] - v4[0], 2.0f)
+ powf(v3[1] - v4[1], 2.0f)), d))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_maxv) {
vec2 v1, v2, v3;
vec2 v5 = {-1.456f, -1.456f};
vec2 v6 = {11.0f, 11.0f};
vec2 v7 = {78.0f, -78.0f};
GLM(vec2_maxv)(v5, v6, v1);
GLM(vec2_maxv)(v5, v7, v2);
GLM(vec2_maxv)(v6, v7, v3);
ASSERT(test_eq(v1[0], 11.0f))
ASSERT(test_eq(v1[1], 11.0f))
ASSERT(test_eq(v2[0], 78.0f))
ASSERT(test_eq(v2[1], -1.456f))
ASSERT(test_eq(v3[0], 78.0f))
ASSERT(test_eq(v3[1], 11.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_minv) {
vec2 v1, v2, v3;
vec2 v5 = {-1.456f, -1.456f};
vec2 v6 = {11.0f, 11.0f};
vec2 v7 = {78.0f, -78.0f};
GLM(vec2_minv)(v5, v6, v1);
GLM(vec2_minv)(v5, v7, v2);
GLM(vec2_minv)(v6, v7, v3);
ASSERT(test_eq(v1[0], -1.456f))
ASSERT(test_eq(v1[1], -1.456f))
ASSERT(test_eq(v2[0], -1.456f))
ASSERT(test_eq(v2[1], -78.0f))
ASSERT(test_eq(v3[0], 11.0f))
ASSERT(test_eq(v3[1], -78.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_clamp) {
vec2 v1 = {-1.456f, -11.456f};
vec2 v2 = {0.110f, 111.0f};
vec2 v3 = {78.0f, 32.0f};
GLM(vec2_clamp)(v1, -1.03f, 30.0f);
GLM(vec2_clamp)(v2, 0.11f, 111.0f);
GLM(vec2_clamp)(v3, -88.0f, 70.0f);
ASSERT(test_eq(v1[0], -1.03f))
ASSERT(test_eq(v1[1], -1.03f))
ASSERT(test_eq(v2[0], 0.11f))
ASSERT(test_eq(v2[1], 111.0f))
ASSERT(test_eq(v3[0], 70.0f))
ASSERT(test_eq(v3[1], 32.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_abs) {
vec2 v1 = {2, -3}, v2 = {-12, -31};
vec2 v3, v4;
vec2 v5 = {2, 3}, v6 = {12, 31};
GLM(vec2_abs)(v1, v3);
GLM(vec2_abs)(v2, v4);
ASSERTIFY(test_assert_vec2_eq(v3, v5))
ASSERTIFY(test_assert_vec2_eq(v4, v6))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_fract) {
vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4;
vec2 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f};
GLM(vec2_fract)(v1, v3);
GLM(vec2_fract)(v2, v4);
ASSERTIFY(test_assert_vec2_eq(v3, v5))
ASSERTIFY(test_assert_vec2_eq(v4, v6))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_floor) {
vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4;
vec2 v5 = {2.0f, 3.0f}, v6 = {12.0f, 31.0f};
GLM(vec2_floor)(v1, v3);
GLM(vec2_floor)(v2, v4);
ASSERTIFY(test_assert_vec2_eq(v3, v5))
ASSERTIFY(test_assert_vec2_eq(v4, v6))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_mods) {
vec2 v1 = {2.104f, 3.012f}, v2 = {12.35f, 31.140f}, v3, v4;
vec2 v5 = {0.104f, 0.012f}, v6 = {0.35f, 0.140f};
/* Mod 1 - leaves just the fractional part */
GLM(vec2_mods)(v1, 1.0f, v3);
GLM(vec2_mods)(v2, 1.0f, v4);
ASSERTIFY(test_assert_vec2_eq(v3, v5))
ASSERTIFY(test_assert_vec2_eq(v4, v6))
/* Mod 2 - parity + fractional part */
GLM(vec2_mods)(v1, 2.0f, v3);
GLM(vec2_mods)(v2, 2.0f, v4);
vec2 v7 = {0.104f, 1.012f}, v8 = {0.35f, 1.140f};
ASSERTIFY(test_assert_vec2_eq(v3, v7))
ASSERTIFY(test_assert_vec2_eq(v4, v8))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_swizzle) {
vec2 v;
v[0] = 1;
v[1] = 2;
GLM(vec2_swizzle)(v, GLM_SHUFFLE2(1, 0), v);
ASSERTIFY(test_assert_vec2_eq(v, (vec2){2, 1}))
GLM(vec2_swizzle)(v, GLM_SHUFFLE2(0, 0), v);
ASSERTIFY(test_assert_vec2_eq(v, (vec2){1, 1}))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_lerp) {
vec2 v1 = {-100.0f, -200.0f};
vec2 v2 = {100.0f, 200.0f};
vec2 v3;
GLM(vec2_lerp)(v1, v2, 0.5f, v3);
ASSERT(test_eq(v3[0], 0.0f))
ASSERT(test_eq(v3[1], 0.0f))
GLM(vec2_lerp)(v1, v2, 0.75f, v3);
ASSERT(test_eq(v3[0], 50.0f))
ASSERT(test_eq(v3[1], 100.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_steps) {
vec2 v1 = {-100.0f, -200.0f};
vec2 v2;
GLM(vec2_steps)(-2.5f, v1, v2);
ASSERT(test_eq(v2[0], 0.0f))
ASSERT(test_eq(v2[1], 0.0f))
GLM(vec2_steps)(-150.0f, v1, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 0.0f))
GLM(vec2_steps)(-300.0f, v1, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_stepr) {
vec2 v1 = {-2.5f, -150.0f};
vec2 v2;
GLM(vec2_stepr)(v1, -200.0f, v2);
ASSERT(test_eq(v2[0], 0.0f))
ASSERT(test_eq(v2[1], 0.0f))
GLM(vec2_stepr)(v1, -150.0f, v2);
ASSERT(test_eq(v2[0], 0.0f))
ASSERT(test_eq(v2[1], 1.0f))
GLM(vec2_stepr)(v1, 0.0f, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_step) {
vec2 v1 = {-100.0f, -200.0f};
vec2 s1 = {-100.0f, 0.0f};
vec2 s2 = {100.0f, -220.0f};
vec2 s3 = {100.0f, 200.0f};
vec2 v2;
GLM(vec2_step)(s1, v1, v2);
ASSERT(test_eq(v2[0], 1.0f))
ASSERT(test_eq(v2[1], 0.0f))
GLM(vec2_step)(s2, v1, v2);
ASSERT(test_eq(v2[0], 0.0f))
ASSERT(test_eq(v2[1], 1.0f))
GLM(vec2_step)(s3, v1, v2);
ASSERT(test_eq(v2[0], 0.0f))
ASSERT(test_eq(v2[1], 0.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_complex_mul) {
vec2 v1 = { 3.0f, 5.0f },
v2 = { 7.0f, 11.0f },
v3 = { cosf(GLM_PIf/4.0f), sinf(GLM_PIf/4.0f) };
GLM(vec2_complex_mul)(v1, v2, v2);
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ -34, 68 }))
GLM(vec2_complex_mul)(v3, v3, v3);
ASSERTIFY(test_assert_vec2_eq(v3, (vec2){ 0.0f, 1.0f }))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_complex_div) {
vec2 v1 = { -34.0f, 68.0f },
v2 = { 3.0f, 5.0f },
v3 = { cosf(GLM_PIf/4.0f), sinf(GLM_PIf/4.0f) },
v4 = { cosf(GLM_PIf/4.0f), -sinf(GLM_PIf/4.0f) };
GLM(vec2_complex_div)(v1, v2, v2);
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ 7.0f, 11.0f }))
GLM(vec2_complex_div)(v3, v4, v4);
ASSERTIFY(test_assert_vec2_eq(v4, (vec2){ 0.0f, 1.0f }))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_make) {
float src[6] = {
7.2f, 1.0f,
2.5f, 6.1f,
17.7f, 4.3f
};
vec2 dest[3];
float *srcp = src;
unsigned int i, j;
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=2,j++) {
GLM(vec2_make)(srcp + i, dest[j]);
ASSERT(test_eq(src[ i ], dest[j][0]));
ASSERT(test_eq(src[i+1], dest[j][1]));
}
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_reflect) {
vec2 dest;
/* Reflecting off a "horizontal" surface in 2D */
vec2 I1 = {1.0f, -1.0f}; /* Incoming vector */
vec2 N1 = {0.0f, 1.0f}; /* Normal vector */
GLM(vec2_reflect)(I1, N1, dest);
ASSERT(fabsf(dest[0] - 1.0f) < 0.00001f &&
fabsf(dest[1] - 1.0f) < 0.00001f); /* Expect reflection upwards */
/* Reflecting at an angle in 2D */
vec2 I2 = {sqrtf(2)/2, -sqrtf(2)/2}; /* Incoming vector at 45 degrees */
vec2 N2 = {0.0f, 1.0f}; /* Upwards normal vector */
GLM(vec2_reflect)(I2, N2, dest);
ASSERT(fabsf(dest[0] - sqrtf(2)/2) < 0.00001f &&
fabsf(dest[1] - sqrtf(2)/2) < 0.00001f); /* Expect reflection upwards */
/* Reflecting off a line in 2D representing a "vertical" surface analogy */
vec2 I3 = {1.0f, 0.0f}; /* Incoming vector */
vec2 N3 = {-1.0f, 0.0f}; /* Normal vector representing a "vertical" line */
GLM(vec2_reflect)(I3, N3, dest);
ASSERT(fabsf(dest[0] + 1.0f) < 0.00001f &&
fabsf(dest[1]) < 0.00001f); /* Expect reflection to the left */
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_refract) {
vec2 v = {sqrtf(0.5f), -sqrtf(0.5f)}; /* Incoming vector at 45 degrees to normal */
vec2 N = {0.0f, 1.0f}; /* Surface normal */
vec2 dest;
float eta;
float r;
/* Water to Air (eta = 1.33/1.0) */
eta = 1.33f / 1.0f;
r = GLM(vec2_refract)(v, N, eta, dest);
// In 2D, we expect a similar bending behavior as in 3D, so we check dest[1]
if (!(dest[0] == 0.0f && dest[1] == 0.0f)) {
ASSERT(dest[1] < -0.3f); // Refracted ray bends away from the normal
ASSERT(r == true);
} else {
ASSERT(dest[0] == 0.0f && dest[1] == 0.0f); // Total internal reflection
ASSERT(r == false);
}
/* Air to Glass (eta = 1.0 / 1.5) */
eta = 1.0f / 1.5f;
r = GLM(vec2_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal
/* Glass to Water (eta = 1.5 / 1.33) */
eta = 1.5f / 1.33f;
r = GLM(vec2_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -0.6f); // Expect bending towards the normal, less bending than air to glass
/* Diamond to Air (eta = 2.42 / 1.0) */
eta = 2.42f / 1.0f;
r = GLM(vec2_refract)(v, N, eta, dest);
if (!(dest[0] == 0.0f && dest[1] == 0.0f)) {
/* High potential for total internal reflection, but if it occurs, expect significant bending */
ASSERT(dest[1] < -sqrtf(0.5f));
ASSERT(r == true);
} else {
ASSERT(dest[0] == 0.0f && dest[1] == 0.0f); // Total internal reflection
ASSERT(r == false);
}
TEST_SUCCESS
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+91
View File
@@ -0,0 +1,91 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/* test inline */
/*---------------------------------------------------------------------------*/
#define GLM_PREFIX glm_
#define GLM(X) (glm_ ## X)
#include "test_vec2.h"
#include "test_vec3.h"
#include "test_vec4.h"
#include "test_ivec2.h"
#include "test_ivec3.h"
#include "test_ivec4.h"
#include "test_mat2.h"
#include "test_mat2x3.h"
#include "test_mat2x4.h"
#include "test_mat3.h"
#include "test_mat3x2.h"
#include "test_mat3x4.h"
#include "test_mat4.h"
#include "test_mat4x2.h"
#include "test_mat4x3.h"
#include "test_quat.h"
#include "test_project.h"
#include "test_plane.h"
#include "test_noise.h"
#include "test_affine.h"
#include "test_affine2d.h"
#include "test_affine_mat.h"
#include "test_aabb2d.h"
#include "test_ray.h"
#include "test_cam.h"
#include "test_cam_lh_no.h"
#include "test_cam_lh_zo.h"
#include "test_cam_rh_no.h"
#include "test_cam_rh_zo.h"
#include "test_euler_to_quat_rh.h"
#include "test_euler_to_quat_lh.h"
#undef GLM
#undef GLM_PREFIX
/* test pre-compiled */
/*---------------------------------------------------------------------------*/
#define GLM_PREFIX glmc_
#define GLM(X) (glmc_ ## X)
#include "test_vec2.h"
#include "test_vec3.h"
#include "test_vec4.h"
#include "test_ivec2.h"
#include "test_ivec3.h"
#include "test_ivec4.h"
#include "test_mat2.h"
#include "test_mat2x3.h"
#include "test_mat2x4.h"
#include "test_mat3.h"
#include "test_mat3x2.h"
#include "test_mat3x4.h"
#include "test_mat4.h"
#include "test_mat4x2.h"
#include "test_mat4x3.h"
#include "test_quat.h"
#include "test_project.h"
#include "test_plane.h"
#include "test_noise.h"
#include "test_affine.h"
#include "test_affine2d.h"
#include "test_affine_mat.h"
#include "test_aabb2d.h"
#include "test_ray.h"
#include "test_cam.h"
#include "test_cam_lh_no.h"
#include "test_cam_lh_zo.h"
#include "test_cam_rh_no.h"
#include "test_cam_rh_zo.h"
#include "test_euler_to_quat_rh.h"
#include "test_euler_to_quat_lh.h"
#undef GLM
#undef GLM_PREFIX
/*---------------------------------------------------------------------------*/
+2437
View File
File diff suppressed because it is too large Load Diff