aboutsummaryrefslogtreecommitdiff
path: root/src/ungrateful.h
diff options
context:
space:
mode:
authorbonmas14 <bonmas14@gmail.com>2025-08-23 01:28:41 +0300
committerbonmas14 <bonmas14@gmail.com>2025-08-23 01:28:41 +0300
commit8ebdc95621bc61fdf3c98cd7ae4ddca67398df23 (patch)
tree205413ed09ac001e37267889d429a363c37008f2 /src/ungrateful.h
parentc96c355b360f18f982459e1a866dcbf5864efdb8 (diff)
downloadungrateful-8ebdc95621bc61fdf3c98cd7ae4ddca67398df23.tar.gz
ungrateful-8ebdc95621bc61fdf3c98cd7ae4ddca67398df23.zip
Ungrateful changes, added more stuffHEADmain
Diffstat (limited to 'src/ungrateful.h')
-rw-r--r--src/ungrateful.h497
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)
}