diff options
author | bonmas14 <bonmas14@gmail.com> | 2025-08-23 01:28:41 +0300 |
---|---|---|
committer | bonmas14 <bonmas14@gmail.com> | 2025-08-23 01:28:41 +0300 |
commit | 8ebdc95621bc61fdf3c98cd7ae4ddca67398df23 (patch) | |
tree | 205413ed09ac001e37267889d429a363c37008f2 /src/ungrateful.h | |
parent | c96c355b360f18f982459e1a866dcbf5864efdb8 (diff) | |
download | ungrateful-main.tar.gz ungrateful-main.zip |
Diffstat (limited to 'src/ungrateful.h')
-rw-r--r-- | src/ungrateful.h | 497 |
1 files changed, 318 insertions, 179 deletions
diff --git a/src/ungrateful.h b/src/ungrateful.h index bbbea47..82152fa 100644 --- a/src/ungrateful.h +++ b/src/ungrateful.h @@ -61,6 +61,7 @@ #include <limits.h> #include <assert.h> #include <math.h> +#include <wchar.h> #define UNUSED(x) (void)(x) @@ -71,6 +72,7 @@ #define UN_MAX(a, b) (a) > (b) ? (a) : (b) #define UN_MIN(a, b) (a) < (b) ? (a) : (b) +#define UN_TODO(msg) assert((msg, false)) #define UN_CSTR (u8*) #define UN_STR(cstr) un_string_from_cstring(UN_CSTR cstr) #define CSTR (char*) @@ -97,19 +99,21 @@ typedef int8_t b8; typedef float f32; typedef double f64; -#ifndef PI +typedef wchar_t wchar; + +#if !defined(PI) # define PI 3.14159265358979323846f #endif -#ifndef EPSILON +#if !defined(EPSILON) # define EPSILON 0.000001f #endif -#ifndef DEG2RAD +#if !defined(DEG2RAD) # define DEG2RAD (PI/180.0f) #endif -#ifndef RAD2DEG +#if !defined(RAD2DEG) # define RAD2DEG (180.0f/PI) #endif @@ -119,18 +123,18 @@ typedef double f64; typedef float real; #endif // UN_DOUBLE_PRECISION -#ifndef PI_D +#if !defined(PI_D) # define PI_D 3.14159265358979323846 #endif -#ifndef EPSILON_D +#if !defined(EPSILON_D) # define EPSILON_D 0.000000000000001 #endif -#ifndef DEG2RAD_D +#if !defined(DEG2RAD_D) # define DEG2RAD_D (PI/180.0) #endif -#ifndef RAD2DEG_D +#if !defined(RAD2DEG_D) # define RAD2DEG_D (180.0/PI) #endif @@ -143,7 +147,6 @@ typedef double f64; typedef enum { UN_ALLOC_MSG_ALLOCATE, - UN_ALLOC_MSG_REALLOCATE, UN_ALLOC_MSG_FREE, UN_ALLOC_MSG_SELF_DELETE, } Allocator_Message; @@ -158,15 +161,15 @@ typedef struct { void *data; } Allocator; -// extern Allocator un_allocator_create_heap(s64 chunk_size); /* ... for large things */ -extern Allocator un_allocator_create_arena(u64 initial_size); /* Grouping allocator, that will recursively grow */ +// extern Allocator un_allocator_create_heap(s64 chunk_size); /* ... for large things. */ +extern Allocator un_allocator_create_arena(u64 initial_size); /* Grouping allocator, that will recursively grow. */ +extern Allocator un_allocator_create_wrapper(Allocator target); /* Allocator for debug purposes. */ extern Allocator un_allocator_get_standard(void); extern Allocator un_allocator_get_temporary(void); extern void *un_memory_alloc(u64 size, Allocator alloc); -extern void *un_memory_realloc(void *ptr, u64 size, Allocator alloc); -extern void *un_memory_free(void *ptr, Allocator alloc); +extern void un_memory_free(void *ptr, Allocator alloc); extern void un_memory_destroy(Allocator *alloc); extern void un_memory_set(u8 *dest, u8 value, u64 size); @@ -176,6 +179,8 @@ extern s32 un_memory_compare(u8 *left, u8 *right, u64 size); /* checks for ever /* ---- Generic list structure ---- */ +#define UN_LIST_STANDARD_CAPACITY UN_KB(1) + typedef struct { u64 count; u64 capacity; @@ -185,7 +190,7 @@ typedef struct { } List; extern List un_list_create(u64 start_capacity, u64 element_size, Allocator alloc); -extern void un_list_destroy(List *list); +extern void un_list_destroy(List *list, b32 delete_allocator); extern List un_list_clone(List *list, Allocator alloc); extern b32 un_list_append(List *list, void *data); /* Returns true if succeed. */ @@ -228,202 +233,304 @@ extern s64 un_string_index_of_last(String input, u8 value); extern String un_string_format(Allocator alloc, String buffer, ...); extern String un_string_vformat(Allocator alloc, String buffer, va_list args); +/* ---- wide strings API ---- */ + +extern wchar* un_wstring_from_string(String utf8_string, Allocator alloc); +extern wchar* un_wstring_from_cstring(u8 *utf8_string, Allocator alloc); + /* ---- math, and vecmath ---- */ -real un_m_lerpr(real a, real b, real t); +#if defined(UN_DOUBLE_PRECISION) +#define un_m_lerpr un_m_lerpd +#else +#define un_m_lerpr un_m_lerpf +#endif + f32 un_m_lerpf(f32 a, f32 b, f32 t); f64 un_m_lerpd(f64 a, f64 b, f64 t); /* 2d f32 */ -void un_m_add2f(f32 *v, f32 *a, f32 *b); -void un_m_sub2f(f32 *v, f32 *a, f32 *b); -void un_m_add_scalar2f(f32 *v, f32 *a, f32 scalar); -void un_m_sub_scalar2f(f32 *v, f32 *a, f32 scalar); -void un_m_mul_scalar2f(f32 *v, f32 *a, f32 scalar); -void un_m_div_scalar2f(f32 *v, f32 *a, f32 scalar); +extern void un_m_add2f(f32 *v, f32 *a, f32 *b); +extern void un_m_sub2f(f32 *v, f32 *a, f32 *b); +extern void un_m_add_scalar2f(f32 *v, f32 *a, f32 scalar); +extern void un_m_sub_scalar2f(f32 *v, f32 *a, f32 scalar); +extern void un_m_mul_scalar2f(f32 *v, f32 *a, f32 scalar); +extern void un_m_div_scalar2f(f32 *v, f32 *a, f32 scalar); -void un_m_dot2f(f32 *v, f32 *a, f32 *b); -void un_m_hadamard2f(f32 *v, f32 *a, f32 *b); -void un_m_project2f(f32 *v, f32 *a, f32 *onto); -void un_m_reflect2f(f32 *v, f32 *a, f32 *normal); -void un_m_cross2f(f32 *v, f32 *a); +extern void un_m_dot2f(f32 *v, f32 *a, f32 *b); +extern void un_m_hadamard2f(f32 *v, f32 *a, f32 *b); +extern void un_m_project2f(f32 *v, f32 *a, f32 *onto); +extern void un_m_reflect2f(f32 *v, f32 *a, f32 *normal); +extern void un_m_cross2f(f32 *v, f32 *a); -void un_m_normalize2f(f32 *v, f32 *a); -void un_m_magnitude2f(f32 *v, f32 *a); -void un_m_magnitude_sqr2f(f32 *v, f32 *a); -void un_m_distance2f(f32 *v, f32 *a, f32 *b); -void un_m_distance_sqr2f(f32 *v, f32 *a, f32 *b); +extern void un_m_normalize2f(f32 *v, f32 *a); +extern void un_m_magnitude2f(f32 *v, f32 *a); +extern void un_m_magnitude_sqr2f(f32 *v, f32 *a); +extern void un_m_distance2f(f32 *v, f32 *a, f32 *b); +extern void un_m_distance_sqr2f(f32 *v, f32 *a, f32 *b); /* 3d f32 */ -void un_m_add3f(f32 *v, f32 *a, f32 *b); -void un_m_sub3f(f32 *v, f32 *a, f32 *b); -void un_m_add_scalar3f(f32 *v, f32 *a, f32 scalar); -void un_m_sub_scalar3f(f32 *v, f32 *a, f32 scalar); -void un_m_mul_scalar3f(f32 *v, f32 *a, f32 scalar); -void un_m_div_scalar3f(f32 *v, f32 *a, f32 scalar); +extern void un_m_add3f(f32 *v, f32 *a, f32 *b); +extern void un_m_sub3f(f32 *v, f32 *a, f32 *b); +extern void un_m_add_scalar3f(f32 *v, f32 *a, f32 scalar); +extern void un_m_sub_scalar3f(f32 *v, f32 *a, f32 scalar); +extern void un_m_mul_scalar3f(f32 *v, f32 *a, f32 scalar); +extern void un_m_div_scalar3f(f32 *v, f32 *a, f32 scalar); -void un_m_dot3f(f32 *v, f32 *a, f32 *b); -void un_m_hadamard3f(f32 *v, f32 *a, f32 *b); -void un_m_project3f(f32 *v, f32 *a, f32 *onto); -void un_m_reflect3f(f32 *v, f32 *a, f32 *normal); -void un_m_cross3f(f32 *v, f32 *a, f32 *b); +extern void un_m_dot3f(f32 *v, f32 *a, f32 *b); +extern void un_m_hadamard3f(f32 *v, f32 *a, f32 *b); +extern void un_m_project3f(f32 *v, f32 *a, f32 *onto); +extern void un_m_reflect3f(f32 *v, f32 *a, f32 *normal); +extern void un_m_cross3f(f32 *v, f32 *a, f32 *b); -void un_m_normalize3f(f32 *v, f32 *a); -void un_m_magnitude3f(f32 *v, f32 *a); -void un_m_magnitude_sqr3f(f32 *v, f32 *a); -void un_m_distance3f(f32 *v, f32 *a, f32 *b); -void un_m_distance_sqr3f(f32 *v, f32 *a, f32 *b); +extern void un_m_normalize3f(f32 *v, f32 *a); +extern void un_m_magnitude3f(f32 *v, f32 *a); +extern void un_m_magnitude_sqr3f(f32 *v, f32 *a); +extern void un_m_distance3f(f32 *v, f32 *a, f32 *b); +extern void un_m_distance_sqr3f(f32 *v, f32 *a, f32 *b); /* 4d f32 */ -void un_m_add4f(f32 *v, f32 *a, f32 *b); -void un_m_sub4f(f32 *v, f32 *a, f32 *b); -void un_m_add_scalar4f(f32 *v, f32 *a, f32 scalar); -void un_m_sub_scalar4f(f32 *v, f32 *a, f32 scalar); -void un_m_mul_scalar4f(f32 *v, f32 *a, f32 scalar); -void un_m_div_scalar4f(f32 *v, f32 *a, f32 scalar); +extern void un_m_add4f(f32 *v, f32 *a, f32 *b); +extern void un_m_sub4f(f32 *v, f32 *a, f32 *b); +extern void un_m_add_scalar4f(f32 *v, f32 *a, f32 scalar); +extern void un_m_sub_scalar4f(f32 *v, f32 *a, f32 scalar); +extern void un_m_mul_scalar4f(f32 *v, f32 *a, f32 scalar); +extern void un_m_div_scalar4f(f32 *v, f32 *a, f32 scalar); -void un_m_dot4f(f32 *v, f32 *a, f32 *b); -void un_m_hadamard4f(f32 *v, f32 *a, f32 *b); -void un_m_project4f(f32 *v, f32 *a, f32 *onto); -void un_m_reflect4f(f32 *v, f32 *a, f32 *normal); +extern void un_m_dot4f(f32 *v, f32 *a, f32 *b); +extern void un_m_hadamard4f(f32 *v, f32 *a, f32 *b); +extern void un_m_project4f(f32 *v, f32 *a, f32 *onto); +extern void un_m_reflect4f(f32 *v, f32 *a, f32 *normal); -void un_m_normalize4f(f32 *v, f32 *a); -void un_m_magnitude4f(f32 *v, f32 *a); -void un_m_magnitude_sqr4f(f32 *v, f32 *a); -void un_m_distance4f(f32 *v, f32 *a, f32 *b); -void un_m_distance_sqr4f(f32 *v, f32 *a, f32 *b); +extern void un_m_normalize4f(f32 *v, f32 *a); +extern void un_m_magnitude4f(f32 *v, f32 *a); +extern void un_m_magnitude_sqr4f(f32 *v, f32 *a); +extern void un_m_distance4f(f32 *v, f32 *a, f32 *b); +extern void un_m_distance_sqr4f(f32 *v, f32 *a, f32 *b); /* 2d f64 */ -void un_m_add2d(f64 *v, f64 *a, f64 *b); -void un_m_sub2d(f64 *v, f64 *a, f64 *b); +extern void un_m_add2d(f64 *v, f64 *a, f64 *b); +extern void un_m_sub2d(f64 *v, f64 *a, f64 *b); -void un_m_add_scalar2d(f64 *v, f64 *a, f64 scalar); -void un_m_sub_scalar2d(f64 *v, f64 *a, f64 scalar); -void un_m_mul_scalar2d(f64 *v, f64 *a, f64 scalar); -void un_m_div_scalar2d(f64 *v, f64 *a, f64 scalar); +extern void un_m_add_scalar2d(f64 *v, f64 *a, f64 scalar); +extern void un_m_sub_scalar2d(f64 *v, f64 *a, f64 scalar); +extern void un_m_mul_scalar2d(f64 *v, f64 *a, f64 scalar); +extern void un_m_div_scalar2d(f64 *v, f64 *a, f64 scalar); -void un_m_dot2d(f64 *v, f64 *a, f64 *b); -void un_m_hadamard2d(f64 *v, f64 *a, f64 *b); -void un_m_project2d(f64 *v, f64 *a, f64 *onto); -void un_m_reflect2d(f64 *v, f64 *a, f64 *normal); -void un_m_cross2d(f64 *v, f64 *a); +extern void un_m_dot2d(f64 *v, f64 *a, f64 *b); +extern void un_m_hadamard2d(f64 *v, f64 *a, f64 *b); +extern void un_m_project2d(f64 *v, f64 *a, f64 *onto); +extern void un_m_reflect2d(f64 *v, f64 *a, f64 *normal); +extern void un_m_cross2d(f64 *v, f64 *a); -void un_m_normalize2d(f64 *v, f64 *a); -void un_m_magnitude2d(f64 *v, f64 *a); -void un_m_magnitude_sqr2d(f64 *v, f64 *a); -void un_m_distance2d(f64 *v, f64 *a, f64 *b); -void un_m_distance_sqr2d(f64 *v, f64 *a, f64 *b); +extern void un_m_normalize2d(f64 *v, f64 *a); +extern void un_m_magnitude2d(f64 *v, f64 *a); +extern void un_m_magnitude_sqr2d(f64 *v, f64 *a); +extern void un_m_distance2d(f64 *v, f64 *a, f64 *b); +extern void un_m_distance_sqr2d(f64 *v, f64 *a, f64 *b); /* 3d f64 */ -void un_m_add3d(f64 *v, f64 *a, f64 *b); -void un_m_sub3d(f64 *v, f64 *a, f64 *b); +extern void un_m_add3d(f64 *v, f64 *a, f64 *b); +extern void un_m_sub3d(f64 *v, f64 *a, f64 *b); -void un_m_add_scalar3d(f64 *v, f64 *a, f64 scalar); -void un_m_sub_scalar3d(f64 *v, f64 *a, f64 scalar); -void un_m_mul_scalar3d(f64 *v, f64 *a, f64 scalar); -void un_m_div_scalar3d(f64 *v, f64 *a, f64 scalar); +extern void un_m_add_scalar3d(f64 *v, f64 *a, f64 scalar); +extern void un_m_sub_scalar3d(f64 *v, f64 *a, f64 scalar); +extern void un_m_mul_scalar3d(f64 *v, f64 *a, f64 scalar); +extern void un_m_div_scalar3d(f64 *v, f64 *a, f64 scalar); -void un_m_dot3d(f64 *v, f64 *a, f64 *b); -void un_m_hadamard3d(f64 *v, f64 *a, f64 *b); -void un_m_project3d(f64 *v, f64 *a, f64 *onto); -void un_m_reflect3d(f64 *v, f64 *a, f64 *normal); -void un_m_cross3d(f64 *v, f64 *a, f64 *b); +extern void un_m_dot3d(f64 *v, f64 *a, f64 *b); +extern void un_m_hadamard3d(f64 *v, f64 *a, f64 *b); +extern void un_m_project3d(f64 *v, f64 *a, f64 *onto); +extern void un_m_reflect3d(f64 *v, f64 *a, f64 *normal); +extern void un_m_cross3d(f64 *v, f64 *a, f64 *b); -void un_m_normalize3d(f64 *v, f64 *a); -void un_m_magnitude3d(f64 *v, f64 *a); -void un_m_magnitude_sqr3d(f64 *v, f64 *a); -void un_m_distance3d(f64 *v, f64 *a, f64 *b); -void un_m_distance_sqr3d(f64 *v, f64 *a, f64 *b); +extern void un_m_normalize3d(f64 *v, f64 *a); +extern void un_m_magnitude3d(f64 *v, f64 *a); +extern void un_m_magnitude_sqr3d(f64 *v, f64 *a); +extern void un_m_distance3d(f64 *v, f64 *a, f64 *b); +extern void un_m_distance_sqr3d(f64 *v, f64 *a, f64 *b); /* 4d f64 */ -void un_m_add4d(f64 *v, f64 *a, f64 *b); -void un_m_sub4d(f64 *v, f64 *a, f64 *b); +extern void un_m_add4d(f64 *v, f64 *a, f64 *b); +extern void un_m_sub4d(f64 *v, f64 *a, f64 *b); + +extern void un_m_add_scalar4d(f64 *v, f64 *a, f64 scalar); +extern void un_m_sub_scalar4d(f64 *v, f64 *a, f64 scalar); +extern void un_m_mul_scalar4d(f64 *v, f64 *a, f64 scalar); +extern void un_m_div_scalar4d(f64 *v, f64 *a, f64 scalar); -void un_m_add_scalar4d(f64 *v, f64 *a, f64 scalar); -void un_m_sub_scalar4d(f64 *v, f64 *a, f64 scalar); -void un_m_mul_scalar4d(f64 *v, f64 *a, f64 scalar); -void un_m_div_scalar4d(f64 *v, f64 *a, f64 scalar); +extern void un_m_dot4d(f64 *v, f64 *a, f64 *b); +extern void un_m_hadamard4d(f64 *v, f64 *a, f64 *b); +extern void un_m_project4d(f64 *v, f64 *a, f64 *onto); +extern void un_m_reflect4d(f64 *v, f64 *a, f64 *normal); -void un_m_dot4d(f64 *v, f64 *a, f64 *b); -void un_m_hadamard4d(f64 *v, f64 *a, f64 *b); -void un_m_project4d(f64 *v, f64 *a, f64 *onto); -void un_m_reflect4d(f64 *v, f64 *a, f64 *normal); +extern void un_m_normalize4d(f64 *v, f64 *a); +extern void un_m_magnitude4d(f64 *v, f64 *a); +extern void un_m_magnitude_sqr4d(f64 *v, f64 *a); +extern void un_m_distance4d(f64 *v, f64 *a, f64 *b); +extern void un_m_distance_sqr4d(f64 *v, f64 *a, f64 *b); -void un_m_normalize4d(f64 *v, f64 *a); -void un_m_magnitude4d(f64 *v, f64 *a); -void un_m_magnitude_sqr4d(f64 *v, f64 *a); -void un_m_distance4d(f64 *v, f64 *a, f64 *b); -void un_m_distance_sqr4d(f64 *v, f64 *a, f64 *b); +#if defined(UN_DOUBLE_PRECISION) /* 2d real */ -void un_m_add2r(real *v, real *a, real *b); -void un_m_sub2r(real *v, real *a, real *b); +#define un_m_add2r un_m_add2d +#define un_m_sub2r un_m_sub2d -void un_m_add_scalar2r(real *v, real *a, real scalar); -void un_m_sub_scalar2r(real *v, real *a, real scalar); -void un_m_mul_scalar2r(real *v, real *a, real scalar); -void un_m_div_scalar2r(real *v, real *a, real scalar); +#define un_m_add_scalar2r un_m_add_scalar2d +#define un_m_sub_scalar2r un_m_sub_scalar2d +#define un_m_mul_scalar2r un_m_mul_scalar2d +#define un_m_div_scalar2r un_m_div_scalar2d -void un_m_dot2r(real *v, real *a, real *b); -void un_m_hadamard2r(real *v, real *a, real *b); -void un_m_project2r(real *v, real *a, real *onto); -void un_m_reflect2r(real *v, real *a, real *normal); -void un_m_cross2r(real *v, real *a); +#define un_m_dot2r un_m_dot2d +#define un_m_hadamard2r un_m_hadamard2d +#define un_m_project2r un_m_project2d +#define un_m_reflect2r un_m_reflect2d +#define un_m_cross2r un_m_cross2d -void un_m_normalize2r(real *v, real *a); -void un_m_magnitude2r(real *v, real *a); -void un_m_magnitude_sqr2r(real *v, real *a); -void un_m_distance2r(real *v, real *a, real *b); -void un_m_distance_sqr2r(real *v, real *a, real *b); +#define un_m_normalize2r un_m_normalize2d +#define un_m_magnitude2r un_m_magnitude2d +#define un_m_magnitude_sqr2r un_m_magnitude_sqr2d +#define un_m_distance2r un_m_distance2d +#define un_m_distance_sqr2r un_m_distance_sqr2d /* 3d real */ -void un_m_add3r(real *v, real *a, real *b); -void un_m_sub3r(real *v, real *a, real *b); +#define un_m_add3r un_m_add3d +#define un_m_sub3r un_m_sub3d -void un_m_add_scalar3r(real *v, real *a, real scalar); -void un_m_sub_scalar3r(real *v, real *a, real scalar); -void un_m_mul_scalar3r(real *v, real *a, real scalar); -void un_m_div_scalar3r(real *v, real *a, real scalar); +#define un_m_add_scalar3r un_m_add_scalar3d +#define un_m_sub_scalar3r un_m_sub_scalar3d +#define un_m_mul_scalar3r un_m_mul_scalar3d +#define un_m_div_scalar3r un_m_div_scalar3d -void un_m_dot3r(real *v, real *a, real *b); -void un_m_hadamard3r(real *v, real *a, real *b); -void un_m_project3r(real *v, real *a, real *onto); -void un_m_reflect3r(real *v, real *a, real *normal); -void un_m_cross3r(real *v, real *a, real *b); +#define un_m_dot3r un_m_dot3d +#define un_m_hadamard3r un_m_hadamard3d +#define un_m_project3r un_m_project3d +#define un_m_reflect3r un_m_reflect3d +#define un_m_cross3r un_m_cross3d -void un_m_normalize3r(real *v, real *a); -void un_m_magnitude3r(real *v, real *a); -void un_m_magnitude_sqr3r(real *v, real *a); -void un_m_distance3r(real *v, real *a, real *b); -void un_m_distance_sqr3r(real *v, real *a, real *b); +#define un_m_normalize3r un_m_normalize3d +#define un_m_magnitude3r un_m_magnitude3d +#define un_m_magnitude_sqr3r un_m_magnitude_sqr3d +#define un_m_distance3r un_m_distance3d +#define un_m_distance_sqr3r un_m_distance_sqr3d /* 4d real */ -void un_m_add4r(real *v, real *a, real *b); -void un_m_sub4r(real *v, real *a, real *b); +#define un_m_add4r un_m_add4d +#define un_m_sub4r un_m_sub4d -void un_m_add_scalar4r(real *v, real *a, real scalar); -void un_m_sub_scalar4r(real *v, real *a, real scalar); -void un_m_mul_scalar4r(real *v, real *a, real scalar); -void un_m_div_scalar4r(real *v, real *a, real scalar); +#define un_m_add_scalar4r un_m_add_scalar4d +#define un_m_sub_scalar4r un_m_sub_scalar4d +#define un_m_mul_scalar4r un_m_mul_scalar4d +#define un_m_div_scalar4r un_m_div_scalar4d -void un_m_dot4r(real *v, real *a, real *b); -void un_m_hadamard4r(real *v, real *a, real *b); -void un_m_project4r(real *v, real *a, real *onto); -void un_m_reflect4r(real *v, real *a, real *normal); +#define un_m_dot4r un_m_dot4d +#define un_m_hadamard4r un_m_hadamard4d +#define un_m_project4r un_m_project4d +#define un_m_reflect4r un_m_reflect4d -void un_m_normalize4r(real *v, real *a); -void un_m_magnitude4r(real *v, real *a); -void un_m_magnitude_sqr4r(real *v, real *a); -void un_m_distance4r(real *v, real *a, real *b); -void un_m_distance_sqr4r(real *v, real *a, real *b); +#define un_m_normalize4r un_m_normalize4d +#define un_m_magnitude4r un_m_magnitude4d +#define un_m_magnitude_sqr4r un_m_magnitude_sqr4d +#define un_m_distance4r un_m_distance4d +#define un_m_distance_sqr4r un_m_distance_sqr4d -/* ---- splines ---- */ +#else + +/* 2d real */ +#define un_m_add2r un_m_add2f +#define un_m_sub2r un_m_sub2f + +#define un_m_add_scalar2r un_m_add_scalar2f +#define un_m_sub_scalar2r un_m_sub_scalar2f +#define un_m_mul_scalar2r un_m_mul_scalar2f +#define un_m_div_scalar2r un_m_div_scalar2f + +#define un_m_dot2r un_m_dot2f +#define un_m_hadamard2r un_m_hadamard2f +#define un_m_project2r un_m_project2f +#define un_m_reflect2r un_m_reflect2f +#define un_m_cross2r un_m_cross2f + +#define un_m_normalize2r un_m_normalize2f +#define un_m_magnitude2r un_m_magnitude2f +#define un_m_magnitude_sqr2r un_m_magnitude_sqr2f +#define un_m_distance2r un_m_distance2f +#define un_m_distance_sqr2r un_m_distance_sqr2f + +/* 3d real */ +#define un_m_add3r un_m_add3f +#define un_m_sub3r un_m_sub3f + +#define un_m_add_scalar3r un_m_add_scalar3f +#define un_m_sub_scalar3r un_m_sub_scalar3f +#define un_m_mul_scalar3r un_m_mul_scalar3f +#define un_m_div_scalar3r un_m_div_scalar3f + +#define un_m_dot3r un_m_dot3f +#define un_m_hadamard3r un_m_hadamard3f +#define un_m_project3r un_m_project3f +#define un_m_reflect3r un_m_reflect3f +#define un_m_cross3r un_m_cross3f + +#define un_m_normalize3r un_m_normalize3f +#define un_m_magnitude3r un_m_magnitude3f +#define un_m_magnitude_sqr3r un_m_magnitude_sqr3f +#define un_m_distance3r un_m_distance3f +#define un_m_distance_sqr3r un_m_distance_sqr3f + +/* 4d real */ +#define un_m_add4r un_m_add4f +#define un_m_sub4r un_m_sub4f + +#define un_m_add_scalar4r un_m_add_scalar4f +#define un_m_sub_scalar4r un_m_sub_scalar4f +#define un_m_mul_scalar4r un_m_mul_scalar4f +#define un_m_div_scalar4r un_m_div_scalar4f -void un_m_bezierr(real *v, real a, real q0, real q1, real b, real t); -void un_m_bezier2r(real *v, real *a, real *q0, real *q1, real *b, real t); -void un_m_bezier3r(real *v, real *a, real *q0, real *q1, real *b, real t); -void un_m_bezier4r(real *v, real *a, real *q0, real *q1, real *b, real t); +#define un_m_dot4r un_m_dot4f +#define un_m_hadamard4r un_m_hadamard4f +#define un_m_project4r un_m_project4f +#define un_m_reflect4r un_m_reflect4f + +#define un_m_normalize4r un_m_normalize4f +#define un_m_magnitude4r un_m_magnitude4f +#define un_m_magnitude_sqr4r un_m_magnitude_sqr4f +#define un_m_distance4r un_m_distance4f +#define un_m_distance_sqr4r un_m_distance_sqr4f + +#endif // UN_DOUBLE_PRECISION + +/* ---- complex ---- */ + +#define un_m_complex_addf un_m_add2f +#define un_m_complex_subf un_m_sub2f +extern void un_m_complex_divf(f32 *v, f32 *a, f32 *b); +extern void un_m_complex_mulf(f32 *v, f32 *a, f32 *b); + +#define un_m_complex_addd un_m_add2d +#define un_m_complex_subd un_m_sub2d +extern void un_m_complex_divd(f64 *v, f64 *a, f64 *b); +extern void un_m_complex_muld(f64 *v, f64 *a, f64 *b); + +#define un_m_complex_magnitudef un_m_magnitude2f +#define un_m_complex_magnituded un_m_magnitude2d + +#if defined(UN_DOUBLE_PRECISION) +#define un_m_complex_addr un_m_complex_addd +#define un_m_complex_subr un_m_complex_subd +#define un_m_complex_divr un_m_complex_divd +#define un_m_complex_mulr un_m_complex_muld +#define un_m_complex_magnituder un_m_complex_magnituded +#else +#define un_m_complex_addr un_m_complex_addf +#define un_m_complex_subr un_m_complex_subf +#define un_m_complex_divr un_m_complex_divf +#define un_m_complex_mulr un_m_complex_mulf +#define un_m_complex_magnituder un_m_complex_magnitudef +#endif // UN_DOUBLE_PRECISION + +/* ---- splines ---- */ void un_m_bezierf(f32 *v, f32 a, f32 q0, f32 q1, f32 b, f32 t); void un_m_bezier2f(f32 *v, f32 *a, f32 *q0, f32 *q1, f32 *b, f32 t); @@ -435,28 +542,60 @@ void un_m_bezier2d(f64 *v, f64 *a, f64 *q0, f64 *q1, f64 *b, f64 t); void un_m_bezier3d(f64 *v, f64 *a, f64 *q0, f64 *q1, f64 *b, f64 t); void un_m_bezier4d(f64 *v, f64 *a, f64 *q0, f64 *q1, f64 *b, f64 t); +#if defined(UN_DOUBLE_PRECISION) +#define un_m_bezierr un_m_bezierd +#define un_m_bezier2r un_m_bezier2d +#define un_m_bezier3r un_m_bezier3d +#define un_m_bezier4r un_m_bezier4d +#else +#define un_m_bezierr un_m_bezierf +#define un_m_bezier2r un_m_bezier2f +#define un_m_bezier3r un_m_bezier3f +#define un_m_bezier4r un_m_bezier4f +#endif // UN_DOUBLE_PRECISION + /* ---- easing ---- */ -real un_m_ease_isiner(real t); -real un_m_ease_iosiner(real t); -real un_m_ease_osiner(real t); -real un_m_ease_iquadr(real t); -real un_m_ease_ioquadr(real t); -real un_m_ease_oquadr(real t); +extern f32 un_m_ease_isinef(f32 t); +extern f32 un_m_ease_iosinef(f32 t); +extern f32 un_m_ease_osinef(f32 t); +extern f32 un_m_ease_iquadf(f32 t); +extern f32 un_m_ease_ioquadf(f32 t); +extern f32 un_m_ease_oquadf(f32 t); + +extern f64 un_m_ease_isined(f64 t); +extern f64 un_m_ease_iosined(f64 t); +extern f64 un_m_ease_osined(f64 t); +extern f64 un_m_ease_iquadd(f64 t); +extern f64 un_m_ease_ioquadd(f64 t); +extern f64 un_m_ease_oquadd(f64 t); + +#if defined(UN_DOUBLE_PRECISION) +#define un_m_ease_isiner un_m_ease_isined +#define un_m_ease_iosiner un_m_ease_iosined +#define un_m_ease_osiner un_m_ease_osined +#define un_m_ease_iquadr un_m_ease_iquadd +#define un_m_ease_ioquadr un_m_ease_ioquadd +#define un_m_ease_oquadr un_m_ease_oquadd +#else +#define un_m_ease_isiner un_m_ease_isinef +#define un_m_ease_iosiner un_m_ease_iosinef +#define un_m_ease_osiner un_m_ease_osinef +#define un_m_ease_iquadr un_m_ease_iquadf +#define un_m_ease_ioquadr un_m_ease_ioquadf +#define un_m_ease_oquadr un_m_ease_oquadf +#endif // UN_DOUBLE_PRECISION + +/* --- matrix ---- + * Convention of matrices! + * column-major matrices and all matrices are 4x4. + */ -f32 un_m_ease_isinef(f32 t); -f32 un_m_ease_iosinef(f32 t); -f32 un_m_ease_osinef(f32 t); -f32 un_m_ease_iquadf(f32 t); -f32 un_m_ease_ioquadf(f32 t); -f32 un_m_ease_oquadf(f32 t); +#define UN_MATRIX_SIZE (16) +#define UN_MATRIX_STRIPE (4) -f64 un_m_ease_isined(f64 t); -f64 un_m_ease_iosined(f64 t); -f64 un_m_ease_osined(f64 t); -f64 un_m_ease_iquadd(f64 t); -f64 un_m_ease_ioquadd(f64 t); -f64 un_m_ease_oquadd(f64 t); +extern void un_m_mat_mulf(f32 *v, f32 *left, f32 *right); +extern void un_m_mat_identityf(f32 *v); #if defined(__cplusplus) } |