diff --git a/base/sources/backends/direct3d12_gpu.c b/base/sources/backends/direct3d12_gpu.c index a55d3eb3..7074da0a 100644 --- a/base/sources/backends/direct3d12_gpu.c +++ b/base/sources/backends/direct3d12_gpu.c @@ -1139,7 +1139,7 @@ char *gpu_device_name() { } typedef struct inst { - iron_matrix4x4_t m; + mat4_t m; int i; } inst_t; @@ -1344,7 +1344,7 @@ void gpu_raytrace_acceleration_structure_init(gpu_acceleration_structure_t *acce dxr_instances_count = 0; } -void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform) { +void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, mat4_t transform) { int vb_i = -1; for (int i = 0; i < dxr_vb_count; ++i) { if (vb == dxr_vb[i]) { diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index fddde4fc..ab3364bf 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -657,7 +657,7 @@ char *gpu_device_name() { } typedef struct inst { - iron_matrix4x4_t m; + mat4_t m; int i; } inst_t; @@ -748,7 +748,7 @@ void gpu_raytrace_acceleration_structure_init(gpu_acceleration_structure_t *acce instances_count = 0; } -void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb, gpu_buffer_t *_ib, iron_matrix4x4_t _transform) { +void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb, gpu_buffer_t *_ib, mat4_t _transform) { int vb_i = -1; for (int i = 0; i < vb_count; ++i) { diff --git a/base/sources/backends/vulkan_gpu.c b/base/sources/backends/vulkan_gpu.c index 4f9b898e..d3106690 100644 --- a/base/sources/backends/vulkan_gpu.c +++ b/base/sources/backends/vulkan_gpu.c @@ -1923,7 +1923,7 @@ char *gpu_device_name() { } typedef struct inst { - iron_matrix4x4_t m; + mat4_t m; int i; } inst_t; @@ -2104,7 +2104,7 @@ void gpu_raytrace_acceleration_structure_init(gpu_acceleration_structure_t *acce instances_count = 0; } -void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb, gpu_buffer_t *_ib, iron_matrix4x4_t _transform) { +void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb, gpu_buffer_t *_ib, mat4_t _transform) { int vb_i = -1; for (int i = 0; i < vb_count; ++i) { if (_vb == vb[i]) { diff --git a/base/sources/backends/webgpu_gpu.c b/base/sources/backends/webgpu_gpu.c index 2e7e61b6..b516c64c 100644 --- a/base/sources/backends/webgpu_gpu.c +++ b/base/sources/backends/webgpu_gpu.c @@ -816,7 +816,7 @@ bool gpu_raytrace_supported(void) { return false; } void gpu_raytrace_pipeline_init(gpu_raytrace_pipeline_t *pipeline, void *shader, int shader_size, gpu_buffer_t *constant_buffer) {} void gpu_raytrace_pipeline_destroy(gpu_raytrace_pipeline_t *pipeline) {} void gpu_raytrace_acceleration_structure_init(gpu_acceleration_structure_t *accel) {} -void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform) {} +void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, mat4_t transform) {} void gpu_raytrace_acceleration_structure_build(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb_full, gpu_buffer_t *_ib_full) {} void gpu_raytrace_acceleration_structure_destroy(gpu_acceleration_structure_t *accel) {} void gpu_raytrace_set_textures(gpu_texture_t *texpaint0, gpu_texture_t *texpaint1, gpu_texture_t *texpaint2, gpu_texture_t *texenv, gpu_texture_t *texsobol, diff --git a/base/sources/engine.c b/base/sources/engine.c index 5eac33e8..bd9e2473 100644 --- a/base/sources/engine.c +++ b/base/sources/engine.c @@ -1403,7 +1403,7 @@ bool uniforms_set_context_const(i32 location, shader_const_t *c) { return false; } - gpu_set_matrix4(location, m); + gpu_set_mat4(location, m); return true; } else if (string_equals(c->type, "vec4")) { @@ -1654,14 +1654,14 @@ void uniforms_set_obj_const(object_t *obj, i32 loc, shader_const_t *c) { if (mat4_isnan(m)) { return; } - gpu_set_matrix4(loc, m); + gpu_set_mat4(loc, m); } else if (string_equals(c->type, "mat3")) { mat3_t m = mat3_nan(); if (string_equals(c->link, "_normal_matrix")) { mat4_t m4 = mat4_inv(obj->transform->world); - m4 = mat4_transpose3x3(m4); + m4 = mat4_transpose3(m4); m = mat3_set_from4(m4); } else if (string_equals(c->link, "_view_matrix3")) { @@ -1671,7 +1671,7 @@ void uniforms_set_obj_const(object_t *obj, i32 loc, shader_const_t *c) { if (mat3_isnan(m)) { return; } - gpu_set_matrix3(loc, m); + gpu_set_mat3(loc, m); } else if (string_equals(c->type, "vec4")) { vec4_t v = vec4_nan(); @@ -2451,21 +2451,21 @@ gpu_texture_t *gpu_create_render_target(i32 width, i32 height, i32 format); int iron_window_width(void); int iron_window_height(void); -void (*render_path_commands)(void) = NULL; -any_map_t *render_path_render_targets = NULL; -i32 render_path_current_w = 0; -i32 render_path_current_h = 0; -f32 _render_path_frame_time = 0.0; -i32 _render_path_frame = 0; -render_target_t *_render_path_current_target = NULL; -gpu_texture_t *_render_path_current_image = NULL; -bool _render_path_paused = false; -i32 _render_path_last_w = 0; -i32 _render_path_last_h = 0; -string_array_t *_render_path_bind_params = NULL; -f32 _render_path_last_frame_time = 0.0; -i32 _render_path_loading = 0; -any_map_t *_render_path_cached_shader_contexts = NULL; +void (*render_path_commands)(void) = NULL; +any_map_t *render_path_render_targets = NULL; +i32 render_path_current_w = 0; +i32 render_path_current_h = 0; +f32 _render_path_frame_time = 0.0; +i32 _render_path_frame = 0; +render_target_t *_render_path_current_target = NULL; +gpu_texture_t *_render_path_current_image = NULL; +bool _render_path_paused = false; +i32 _render_path_last_w = 0; +i32 _render_path_last_h = 0; +string_array_t *_render_path_bind_params = NULL; +f32 _render_path_last_frame_time = 0.0; +i32 _render_path_loading = 0; +any_map_t *_render_path_cached_shader_contexts = NULL; bool render_path_ready(void) { return _render_path_loading == 0; diff --git a/base/sources/engine.h b/base/sources/engine.h index eecef662..62503e58 100644 --- a/base/sources/engine.h +++ b/base/sources/engine.h @@ -7,15 +7,11 @@ #include "iron_gc.h" #include "iron_gpu.h" #include "iron_map.h" -#include "iron_mat3.h" -#include "iron_mat4.h" +#include "iron_math.h" #include "iron_path.h" -#include "iron_quat.h" #include "iron_string.h" #include "iron_sys.h" #include "iron_system.h" -#include "iron_vec2.h" -#include "iron_vec4.h" #include #include diff --git a/base/sources/iron.h b/base/sources/iron.h index 75cb5c68..3c18e61b 100644 --- a/base/sources/iron.h +++ b/base/sources/iron.h @@ -11,10 +11,8 @@ #include "iron_gpu.h" #include "iron_json.h" #include "iron_map.h" -#include "iron_mat3.h" -#include "iron_mat4.h" +#include "iron_math.h" #include "iron_obj.h" -#include "iron_quat.h" #include "iron_string.h" #include "iron_system.h" #include "iron_thread.h" @@ -22,9 +20,6 @@ #include "iron_eval.h" #include "iron_ui.h" #include "iron_ui_nodes.h" -#include "iron_vec2.h" -#include "iron_vec3.h" -#include "iron_vec4.h" #include "const_data.h" #include #include diff --git a/base/sources/iron_draw.c b/base/sources/iron_draw.c index 3938c839..eeccf8ba 100644 --- a/base/sources/iron_draw.c +++ b/base/sources/iron_draw.c @@ -7,7 +7,6 @@ #include "iron_simd.h" #include "iron_string.h" #include "iron_system.h" -#include "iron_vec2.h" #include #define MATH_PI 3.14159265358979323846 @@ -16,7 +15,7 @@ draw_font_t *draw_font = NULL; int draw_font_size; gpu_texture_t *_draw_current = NULL; -static iron_matrix3x3_t draw_transform; +static mat3_t draw_transform; static uint32_t draw_color = 0; static gpu_pipeline_t *draw_custom_pipeline = NULL; @@ -233,7 +232,7 @@ void draw_scaled_sub_image(gpu_texture_t *tex, float sx, float sy, float sw, flo } else { gpu_set_pipeline(draw_custom_pipeline != NULL ? draw_custom_pipeline : &image_transform_pipeline); - gpu_set_matrix3(image_transform_w_loc, draw_transform); + gpu_set_mat3(image_transform_w_loc, draw_transform); } gpu_set_vertex_buffer(&rect_vertex_buffer); gpu_set_index_buffer(&rect_index_buffer); @@ -288,12 +287,12 @@ void draw_rect(float x, float y, float width, float height, float strength) { } void draw_line(float x0, float y0, float x1, float y1, float strength) { - iron_vector2_t vec; + vec2_t vec; if (y1 == y0) { - vec = (iron_vector2_t){0.0f, -1.0f}; + vec = (vec2_t){0.0f, -1.0f}; } else { - vec = (iron_vector2_t){1.0f, -(x1 - x0) / (y1 - y0)}; + vec = (vec2_t){1.0f, -(x1 - x0) / (y1 - y0)}; } float current_length = sqrtf(vec.x * vec.x + vec.y * vec.y); @@ -303,10 +302,10 @@ void draw_line(float x0, float y0, float x1, float y1, float strength) { vec.y *= mul; } - iron_vector2_t p0 = (iron_vector2_t){x0 + 0.5f * vec.x, y0 + 0.5f * vec.y}; - iron_vector2_t p1 = (iron_vector2_t){x1 + 0.5f * vec.x, y1 + 0.5f * vec.y}; - iron_vector2_t p2 = (iron_vector2_t){p0.x - vec.x, p0.y - vec.y}; - iron_vector2_t p3 = (iron_vector2_t){p1.x - vec.x, p1.y - vec.y}; + vec2_t p0 = (vec2_t){x0 + 0.5f * vec.x, y0 + 0.5f * vec.y}; + vec2_t p1 = (vec2_t){x1 + 0.5f * vec.x, y1 + 0.5f * vec.y}; + vec2_t p2 = (vec2_t){p0.x - vec.x, p0.y - vec.y}; + vec2_t p3 = (vec2_t){p1.x - vec.x, p1.y - vec.y}; draw_filled_triangle(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); draw_filled_triangle(p2.x, p2.y, p1.x, p1.y, p3.x, p3.y); } @@ -741,7 +740,7 @@ void draw_inner_line(float x1, float y1, float x2, float y2, float strength) { if (y2 == y1) { side = x2 - x1 > 0 ? 1 : 0; } - iron_vector2_t vec; + vec2_t vec; if (y2 == y1) { vec = vec2_create(0, -1); } @@ -749,10 +748,10 @@ void draw_inner_line(float x1, float y1, float x2, float y2, float strength) { vec = vec2_create(1, -(x2 - x1) / (y2 - y1)); } vec = vec2_set_len(vec, strength); - iron_vector2_t p1 = {x1 + side * vec.x, y1 + side * vec.y}; - iron_vector2_t p2 = {x2 + side * vec.x, y2 + side * vec.y}; - iron_vector2_t p3 = vec2_sub(p1, vec); - iron_vector2_t p4 = vec2_sub(p2, vec); + vec2_t p1 = {x1 + side * vec.x, y1 + side * vec.y}; + vec2_t p2 = {x2 + side * vec.x, y2 + side * vec.y}; + vec2_t p3 = vec2_sub(p1, vec); + vec2_t p4 = vec2_sub(p2, vec); draw_filled_triangle(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); draw_filled_triangle(p3.x, p3.y, p2.x, p2.y, p4.x, p4.y); } diff --git a/base/sources/iron_draw.h b/base/sources/iron_draw.h index 93b479bd..54b22d96 100644 --- a/base/sources/iron_draw.h +++ b/base/sources/iron_draw.h @@ -7,7 +7,6 @@ #include "iron_array.h" #include "iron_gpu.h" -#include "iron_mat3.h" #include "iron_math.h" #include #include diff --git a/base/sources/iron_gpu.c b/base/sources/iron_gpu.c index 32b564b3..bebf9251 100644 --- a/base/sources/iron_gpu.c +++ b/base/sources/iron_gpu.c @@ -1,5 +1,6 @@ #include "iron_gpu.h" #include "iron_system.h" +#include "iron_math.h" #include static gpu_buffer_t constant_buffer; @@ -207,43 +208,41 @@ void gpu_set_bool(int location, bool value) { ints[0] = value ? 1 : 0; } -static void gpu_internal_set_matrix3(int offset, iron_matrix3x3_t *value) { +static void gpu_internal_set_mat3(int offset, mat3_t *value) { float *floats = (float *)(&constant_buffer.data[offset]); for (int y = 0; y < 3; ++y) { for (int x = 0; x < 3; ++x) { - floats[x + y * 4] = iron_matrix3x3_get(value, x, y); + floats[x + y * 4] = value->m[x * 3 + y]; } } } -static void gpu_internal_set_matrix4(int offset, iron_matrix4x4_t *value) { +static void gpu_internal_set_mat4(int offset, mat4_t *value) { float *floats = (float *)(&constant_buffer.data[offset]); for (int y = 0; y < 4; ++y) { for (int x = 0; x < 4; ++x) { - floats[x + y * 4] = iron_matrix4x4_get(value, x, y); + floats[x + y * 4] = value->m[x * 4 + y]; } } } -void gpu_set_matrix3(int location, iron_matrix3x3_t value) { +void gpu_set_mat3(int location, mat3_t value) { if (gpu_transpose_mat) { - iron_matrix3x3_t m = value; - iron_matrix3x3_transpose(&m); - gpu_internal_set_matrix3(location, &m); + mat3_t m = mat3_transpose(value); + gpu_internal_set_mat3(location, &m); } else { - gpu_internal_set_matrix3(location, &value); + gpu_internal_set_mat3(location, &value); } } -void gpu_set_matrix4(int location, iron_matrix4x4_t value) { +void gpu_set_mat4(int location, mat4_t value) { if (gpu_transpose_mat) { - iron_matrix4x4_t m = value; - iron_matrix4x4_transpose(&m); - gpu_internal_set_matrix4(location, &m); + mat4_t m = mat4_transpose(value); + gpu_internal_set_mat4(location, &m); } else { - gpu_internal_set_matrix4(location, &value); + gpu_internal_set_mat4(location, &value); } } @@ -399,7 +398,7 @@ void _gpu_raytrace_as_init() { gpu_raytrace_acceleration_structure_init(&rt_accel); } -void _gpu_raytrace_as_add(struct gpu_buffer *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform) { +void _gpu_raytrace_as_add(struct gpu_buffer *vb, gpu_buffer_t *ib, mat4_t transform) { gpu_raytrace_acceleration_structure_add(&rt_accel, vb, ib, transform); } diff --git a/base/sources/iron_gpu.h b/base/sources/iron_gpu.h index a25672e8..8dee32f3 100644 --- a/base/sources/iron_gpu.h +++ b/base/sources/iron_gpu.h @@ -185,8 +185,8 @@ void gpu_set_float3(int location, float value1, float value2, float value3); void gpu_set_float4(int location, float value1, float value2, float value3, float value4); void gpu_set_floats(int location, f32_array_t *values); void gpu_set_bool(int location, bool value); -void gpu_set_matrix3(int location, iron_matrix3x3_t value); -void gpu_set_matrix4(int location, iron_matrix4x4_t value); +void gpu_set_mat3(int location, mat3_t value); +void gpu_set_mat4(int location, mat4_t value); void gpu_vertex_structure_add(gpu_vertex_structure_t *structure, const char *name, gpu_vertex_data_t data); void gpu_vertex_struct_add(gpu_vertex_structure_t *raw, char *name, gpu_vertex_data_t data); @@ -232,7 +232,7 @@ bool gpu_raytrace_supported(void); void gpu_raytrace_pipeline_init(gpu_raytrace_pipeline_t *pipeline, void *shader, int shader_size, gpu_buffer_t *constant_buffer); void gpu_raytrace_pipeline_destroy(gpu_raytrace_pipeline_t *pipeline); void gpu_raytrace_acceleration_structure_init(gpu_acceleration_structure_t *accel); -void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform); +void gpu_raytrace_acceleration_structure_add(gpu_acceleration_structure_t *accel, gpu_buffer_t *vb, gpu_buffer_t *ib, mat4_t transform); void gpu_raytrace_acceleration_structure_build(gpu_acceleration_structure_t *accel, gpu_buffer_t *_vb_full, gpu_buffer_t *_ib_full); void gpu_raytrace_acceleration_structure_destroy(gpu_acceleration_structure_t *accel); void gpu_raytrace_set_textures(gpu_texture_t *texpaint0, gpu_texture_t *texpaint1, gpu_texture_t *texpaint2, gpu_texture_t *texenv, gpu_texture_t *texsobol, @@ -244,7 +244,7 @@ void gpu_raytrace_dispatch_rays(); void _gpu_raytrace_init(buffer_t *shader); void _gpu_raytrace_as_init(); -void _gpu_raytrace_as_add(gpu_buffer_t *vb, gpu_buffer_t *ib, iron_matrix4x4_t transform); +void _gpu_raytrace_as_add(gpu_buffer_t *vb, gpu_buffer_t *ib, mat4_t transform); void _gpu_raytrace_as_build(gpu_buffer_t *vb_full, gpu_buffer_t *ib_full); void gpu_raytrace_set_textures(gpu_texture_t *tex0, gpu_texture_t *tex1, gpu_texture_t *tex2, gpu_texture_t *texenv, gpu_texture_t *texsobol, gpu_texture_t *texscramble, gpu_texture_t *texrank); diff --git a/base/sources/iron_mat3.c b/base/sources/iron_mat3.c deleted file mode 100644 index d910a707..00000000 --- a/base/sources/iron_mat3.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "iron_mat3.h" - -#include "iron_math.h" -#include - -mat3_t mat3_create(float _00, float _10, float _20, float _01, float _11, float _21, float _02, float _12, float _22) { - mat3_t m; - m.m[0] = _00; - m.m[1] = _01; - m.m[2] = _02; - m.m[3] = _10; - m.m[4] = _11; - m.m[5] = _12; - m.m[6] = _20; - m.m[7] = _21; - m.m[8] = _22; - return m; -} - -mat3_t mat3_identity() { - return mat3_create(1, 0, 0, 0, 1, 0, 0, 0, 1); -} - -mat3_t mat3_translation(float x, float y) { - return mat3_create(1, 0, x, 0, 1, y, 0, 0, 1); -} - -mat3_t mat3_rotation(float alpha) { - return mat3_create(cosf(alpha), -sinf(alpha), 0, sinf(alpha), cosf(alpha), 0, 0, 0, 1); -} - -mat3_t mat3_scale(mat3_t m, vec4_t v) { - m.m[0] *= v.x; - m.m[1] *= v.x; - m.m[2] *= v.x; - m.m[3] *= v.y; - m.m[4] *= v.y; - m.m[5] *= v.y; - m.m[6] *= v.z; - m.m[7] *= v.z; - m.m[8] *= v.z; - return m; -} - -mat3_t mat3_set_from4(mat4_t m4) { - mat3_t m; - m.m[0] = m4.m[0]; - m.m[1] = m4.m[1]; - m.m[2] = m4.m[2]; - m.m[3] = m4.m[4]; - m.m[4] = m4.m[5]; - m.m[5] = m4.m[6]; - m.m[6] = m4.m[8]; - m.m[7] = m4.m[9]; - m.m[8] = m4.m[10]; - return m; -} - -mat3_t mat3_multmat(mat3_t a, mat3_t b) { - return mat3_create(a.m[0] * b.m[0] + a.m[3] * b.m[1] + a.m[6] * b.m[2], a.m[0] * b.m[3] + a.m[3] * b.m[4] + a.m[6] * b.m[5], - a.m[0] * b.m[6] + a.m[3] * b.m[7] + a.m[6] * b.m[8], a.m[1] * b.m[0] + a.m[4] * b.m[1] + a.m[7] * b.m[2], - a.m[1] * b.m[3] + a.m[4] * b.m[4] + a.m[7] * b.m[5], a.m[1] * b.m[6] + a.m[4] * b.m[7] + a.m[7] * b.m[8], - a.m[2] * b.m[0] + a.m[5] * b.m[1] + a.m[8] * b.m[2], a.m[2] * b.m[3] + a.m[5] * b.m[4] + a.m[8] * b.m[5], - a.m[2] * b.m[6] + a.m[5] * b.m[7] + a.m[8] * b.m[8]); -} - -mat3_t mat3_nan() { - mat3_t m; - m.m[0] = NAN; - return m; -} - -bool mat3_isnan(mat3_t m) { - return isnan(m.m[0]); -} diff --git a/base/sources/iron_mat3.h b/base/sources/iron_mat3.h deleted file mode 100644 index d26e9408..00000000 --- a/base/sources/iron_mat3.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "iron_mat4.h" -#include "iron_math.h" - -mat3_t mat3_create(float _00, float _10, float _20, float _01, float _11, float _21, float _02, float _12, float _22); -mat3_t mat3_identity(); -mat3_t mat3_translation(float x, float y); -mat3_t mat3_rotation(float alpha); -mat3_t mat3_scale(mat3_t m, vec4_t v); -mat3_t mat3_set_from4(mat4_t m4); -mat3_t mat3_multmat(mat3_t a, mat3_t b); -mat3_t mat3_nan(); -bool mat3_isnan(mat3_t m); diff --git a/base/sources/iron_mat4.c b/base/sources/iron_mat4.c deleted file mode 100644 index f0d69c98..00000000 --- a/base/sources/iron_mat4.c +++ /dev/null @@ -1,520 +0,0 @@ -#include "iron_mat4.h" - -#include "iron_gc.h" -#include - -mat4_t mat4_create(float _00, float _10, float _20, float _30, float _01, float _11, float _21, float _31, float _02, float _12, float _22, float _32, - float _03, float _13, float _23, float _33) { - mat4_t m; - m.m[0] = _00; - m.m[1] = _01; - m.m[2] = _02; - m.m[3] = _03; - m.m[4] = _10; - m.m[5] = _11; - m.m[6] = _12; - m.m[7] = _13; - m.m[8] = _20; - m.m[9] = _21; - m.m[10] = _22; - m.m[11] = _23; - m.m[12] = _30; - m.m[13] = _31; - m.m[14] = _32; - m.m[15] = _33; - return m; -} - -mat4_t mat4_identity() { - return mat4_create(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); -} - -mat4_t mat4_from_f32_array(f32_array_t *a, int offset) { - return mat4_create(a->buffer[0 + offset], a->buffer[1 + offset], a->buffer[2 + offset], a->buffer[3 + offset], a->buffer[4 + offset], a->buffer[5 + offset], - a->buffer[6 + offset], a->buffer[7 + offset], a->buffer[8 + offset], a->buffer[9 + offset], a->buffer[10 + offset], - a->buffer[11 + offset], a->buffer[12 + offset], a->buffer[13 + offset], a->buffer[14 + offset], a->buffer[15 + offset]); -} - -mat4_t mat4_persp(float fov_y, float aspect, float zn, float zf) { - float uh = 1.0 / tanf(fov_y / 2); - float uw = uh / aspect; - return mat4_create(uw, 0, 0, 0, 0, uh, 0, 0, 0, 0, (zf + zn) / (zn - zf), 2 * zf * zn / (zn - zf), 0, 0, -1, 0); -} - -mat4_t mat4_ortho(float left, float right, float bottom, float top, float znear, float zfar) { - float rl = right - left; - float tb = top - bottom; - float fn = zfar - znear; - float tx = -(right + left) / (rl); - float ty = -(top + bottom) / (tb); - float tz = -(zfar + znear) / (fn); - return mat4_create(2 / rl, 0, 0, tx, 0, 2 / tb, 0, ty, 0, 0, -2 / fn, tz, 0, 0, 0, 1); -} - -mat4_t mat4_rot_z(float alpha) { - float ca = cosf(alpha); - float sa = sinf(alpha); - return mat4_create(ca, -sa, 0, 0, sa, ca, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); -} - -mat4_t mat4_compose(vec4_t loc, quat_t rot, vec4_t scl) { - mat4_t m = mat4_from_quat(rot); - m = mat4_scale(m, scl); - m = mat4_set_loc(m, loc); - return m; -} - -mat4_decomposed_t *mat4_decompose(mat4_t m) { - vec4_t loc; - quat_t rot; - vec4_t scl; - loc.x = m.m[12]; - loc.y = m.m[13]; - loc.z = m.m[14]; - scl.x = vec4_len(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); - scl.y = vec4_len(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); - scl.z = vec4_len(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); - if (mat4_determinant(m) < 0.0) { - scl.x = -scl.x; - } - float invs = 1.0 / scl.x; // Scale the rotation part - m.m[0] *= invs; - m.m[1] *= invs; - m.m[2] *= invs; - invs = 1.0 / scl.y; - m.m[4] *= invs; - m.m[5] *= invs; - m.m[6] *= invs; - invs = 1.0 / scl.z; - m.m[8] *= invs; - m.m[9] *= invs; - m.m[10] *= invs; - rot = quat_from_rot_mat(m); - - mat4_decomposed_t *dec = gc_alloc(sizeof(mat4_decomposed_t)); - dec->loc = loc; - dec->rot = rot; - dec->scl = scl; - return dec; -} - -mat4_t mat4_set_loc(mat4_t m, vec4_t v) { - m.m[12] = v.x; - m.m[13] = v.y; - m.m[14] = v.z; - return m; -} - -mat4_t mat4_from_quat(quat_t q) { - float x2 = q.x + q.x; - float y2 = q.y + q.y; - float z2 = q.z + q.z; - float xx = q.x * x2; - float xy = q.x * y2; - float xz = q.x * z2; - float yy = q.y * y2; - float yz = q.y * z2; - float zz = q.z * z2; - float wx = q.w * x2; - float wy = q.w * y2; - float wz = q.w * z2; - - mat4_t m; - m.m[0] = 1.0 - (yy + zz); - m.m[4] = xy - wz; - m.m[8] = xz + wy; - - m.m[1] = xy + wz; - m.m[5] = 1.0 - (xx + zz); - m.m[9] = yz - wx; - - m.m[2] = xz - wy; - m.m[6] = yz + wx; - m.m[10] = 1.0 - (xx + yy); - - m.m[3] = 0.0; - m.m[7] = 0.0; - m.m[11] = 0.0; - m.m[12] = 0.0; - m.m[13] = 0.0; - m.m[14] = 0.0; - m.m[15] = 1.0; - - return m; -} - -mat4_t mat4_init_translate(float x, float y, float z) { - mat4_t m; - m.m[0] = 1.0; - m.m[1] = 0.0; - m.m[2] = 0.0; - m.m[3] = 0.0; - m.m[4] = 0.0; - m.m[5] = 1.0; - m.m[6] = 0.0; - m.m[7] = 0.0; - m.m[8] = 0.0; - m.m[9] = 0.0; - m.m[10] = 1.0; - m.m[11] = 0.0; - m.m[12] = x; - m.m[13] = y; - m.m[14] = z; - m.m[15] = 1.0; - return m; -} - -mat4_t mat4_translate(mat4_t m, float x, float y, float z) { - m.m[0] += x * m.m[3]; - m.m[1] += y * m.m[3]; - m.m[2] += z * m.m[3]; - m.m[4] += x * m.m[7]; - m.m[5] += y * m.m[7]; - m.m[6] += z * m.m[7]; - m.m[8] += x * m.m[11]; - m.m[9] += y * m.m[11]; - m.m[10] += z * m.m[11]; - m.m[12] += x * m.m[15]; - m.m[13] += y * m.m[15]; - m.m[14] += z * m.m[15]; - return m; -} - -mat4_t mat4_scale(mat4_t m, vec4_t v) { - m.m[0] *= v.x; - m.m[1] *= v.x; - m.m[2] *= v.x; - m.m[3] *= v.x; - m.m[4] *= v.y; - m.m[5] *= v.y; - m.m[6] *= v.y; - m.m[7] *= v.y; - m.m[8] *= v.z; - m.m[9] *= v.z; - m.m[10] *= v.z; - m.m[11] *= v.z; - return m; -} - -mat4_t mat4_mult_mat3x4(mat4_t a, mat4_t b) { - float a00 = a.m[0]; - float a01 = a.m[1]; - float a02 = a.m[2]; - float a03 = a.m[3]; - float a10 = a.m[4]; - float a11 = a.m[5]; - float a12 = a.m[6]; - float a13 = a.m[7]; - float a20 = a.m[8]; - float a21 = a.m[9]; - float a22 = a.m[10]; - float a23 = a.m[11]; - float a30 = a.m[12]; - float a31 = a.m[13]; - float a32 = a.m[14]; - float a33 = a.m[15]; - - float b0 = b.m[0]; - float b1 = b.m[4]; - float b2 = b.m[8]; - float b3 = b.m[12]; - - mat4_t m; - m.m[0] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - m.m[4] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - m.m[8] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - m.m[12] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - b0 = b.m[1]; - b1 = b.m[5]; - b2 = b.m[9]; - b3 = b.m[13]; - m.m[1] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - m.m[5] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - m.m[9] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - m.m[13] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - b0 = b.m[2]; - b1 = b.m[6]; - b2 = b.m[10]; - b3 = b.m[14]; - m.m[2] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - m.m[6] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - m.m[10] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - m.m[14] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - m.m[3] = 0; - m.m[7] = 0; - m.m[11] = 0; - m.m[15] = 1; - return m; -} - -mat4_t mat4_mult_mat(mat4_t a, mat4_t b) { - float a00 = a.m[0]; - float a01 = a.m[1]; - float a02 = a.m[2]; - float a03 = a.m[3]; - float a10 = a.m[4]; - float a11 = a.m[5]; - float a12 = a.m[6]; - float a13 = a.m[7]; - float a20 = a.m[8]; - float a21 = a.m[9]; - float a22 = a.m[10]; - float a23 = a.m[11]; - float a30 = a.m[12]; - float a31 = a.m[13]; - float a32 = a.m[14]; - float a33 = a.m[15]; - - float b0 = b.m[0]; - float b1 = b.m[4]; - float b2 = b.m[8]; - float b3 = b.m[12]; - a.m[0] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - a.m[4] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - a.m[8] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - a.m[12] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - b0 = b.m[1]; - b1 = b.m[5]; - b2 = b.m[9]; - b3 = b.m[13]; - a.m[1] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - a.m[5] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - a.m[9] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - a.m[13] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - b0 = b.m[2]; - b1 = b.m[6]; - b2 = b.m[10]; - b3 = b.m[14]; - a.m[2] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - a.m[6] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - a.m[10] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - a.m[14] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - b0 = b.m[3]; - b1 = b.m[7]; - b2 = b.m[11]; - b3 = b.m[15]; - a.m[3] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; - a.m[7] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; - a.m[11] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; - a.m[15] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; - - return a; -} - -mat4_t mat4_inv(mat4_t a) { - float a00 = a.m[0]; - float a01 = a.m[1]; - float a02 = a.m[2]; - float a03 = a.m[3]; - float a10 = a.m[4]; - float a11 = a.m[5]; - float a12 = a.m[6]; - float a13 = a.m[7]; - float a20 = a.m[8]; - float a21 = a.m[9]; - float a22 = a.m[10]; - float a23 = a.m[11]; - float a30 = a.m[12]; - float a31 = a.m[13]; - float a32 = a.m[14]; - float a33 = a.m[15]; - float b00 = a00 * a11 - a01 * a10; - float b01 = a00 * a12 - a02 * a10; - float b02 = a00 * a13 - a03 * a10; - float b03 = a01 * a12 - a02 * a11; - float b04 = a01 * a13 - a03 * a11; - float b05 = a02 * a13 - a03 * a12; - float b06 = a20 * a31 - a21 * a30; - float b07 = a20 * a32 - a22 * a30; - float b08 = a20 * a33 - a23 * a30; - float b09 = a21 * a32 - a22 * a31; - float b10 = a21 * a33 - a23 * a31; - float b11 = a22 * a33 - a23 * a32; - - float det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - if (det == 0.0) { - return mat4_identity(); - } - det = 1.0 / det; - - mat4_t m; - m.m[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; - m.m[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - m.m[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - m.m[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; - m.m[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - m.m[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - m.m[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - m.m[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; - m.m[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - m.m[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - m.m[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - m.m[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; - m.m[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; - m.m[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; - m.m[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; - m.m[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; - - return m; -} - -mat4_t mat4_transpose(mat4_t m) { - float f = m.m[1]; - m.m[1] = m.m[4]; - m.m[4] = f; - - f = m.m[2]; - m.m[2] = m.m[8]; - m.m[8] = f; - - f = m.m[3]; - m.m[3] = m.m[12]; - m.m[12] = f; - - f = m.m[6]; - m.m[6] = m.m[9]; - m.m[9] = f; - - f = m.m[7]; - m.m[7] = m.m[13]; - m.m[13] = f; - - f = m.m[11]; - m.m[11] = m.m[14]; - m.m[14] = f; - - return m; -} - -mat4_t mat4_transpose3x3(mat4_t m) { - float f = m.m[1]; - m.m[1] = m.m[4]; - m.m[4] = f; - - f = m.m[2]; - m.m[2] = m.m[8]; - m.m[8] = f; - - f = m.m[6]; - m.m[6] = m.m[9]; - m.m[9] = f; - - return m; -} - -mat4_t mat4_clone(mat4_t m) { - return mat4_create(m.m[0], m.m[4], m.m[8], m.m[12], m.m[1], m.m[5], m.m[9], m.m[13], m.m[2], m.m[6], m.m[10], m.m[14], m.m[3], m.m[7], m.m[11], m.m[15]); -} - -vec4_t mat4_get_loc(mat4_t m) { - return vec4_create(m.m[12], m.m[13], m.m[14], m.m[15]); -} - -vec4_t mat4_get_scale(mat4_t m) { - return vec4_create(sqrtf(m.m[0] * m.m[0] + m.m[4] * m.m[4] + m.m[8] * m.m[8]), sqrtf(m.m[1] * m.m[1] + m.m[5] * m.m[5] + m.m[9] * m.m[9]), - sqrtf(m.m[2] * m.m[2] + m.m[6] * m.m[6] + m.m[10] * m.m[10]), 1.0); -} - -mat4_t mat4_mult(mat4_t m, float s) { - m.m[0] *= s; - m.m[1] *= s; - m.m[2] *= s; - m.m[3] *= s; - m.m[4] *= s; - m.m[5] *= s; - m.m[6] *= s; - m.m[7] *= s; - m.m[8] *= s; - m.m[9] *= s; - m.m[10] *= s; - m.m[11] *= s; - m.m[12] *= s; - m.m[13] *= s; - m.m[14] *= s; - m.m[15] *= s; - return m; -} - -mat4_t mat4_to_rot(mat4_t m) { - float scale = 1.0 / vec4_len(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); - m.m[0] = m.m[0] * scale; - m.m[1] = m.m[1] * scale; - m.m[2] = m.m[2] * scale; - scale = 1.0 / vec4_len(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); - m.m[4] = m.m[4] * scale; - m.m[5] = m.m[5] * scale; - m.m[6] = m.m[6] * scale; - scale = 1.0 / vec4_len(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); - m.m[8] = m.m[8] * scale; - m.m[9] = m.m[9] * scale; - m.m[10] = m.m[10] * scale; - m.m[3] = 0.0; - m.m[7] = 0.0; - m.m[11] = 0.0; - m.m[12] = 0.0; - m.m[13] = 0.0; - m.m[14] = 0.0; - m.m[15] = 1.0; - return m; -} - -vec4_t mat4_right(mat4_t m) { - return vec4_norm(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); -} - -vec4_t mat4_look(mat4_t m) { - return vec4_norm(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); -} - -vec4_t mat4_up(mat4_t m) { - return vec4_norm(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); -} - -f32_array_t *mat4_to_f32_array(mat4_t m) { - f32_array_t *a = f32_array_create(16); - a->buffer[0] = m.m[0]; - a->buffer[1] = m.m[4]; - a->buffer[2] = m.m[8]; - a->buffer[3] = m.m[12]; - a->buffer[4] = m.m[1]; - a->buffer[5] = m.m[5]; - a->buffer[6] = m.m[9]; - a->buffer[7] = m.m[13]; - a->buffer[8] = m.m[2]; - a->buffer[9] = m.m[6]; - a->buffer[10] = m.m[10]; - a->buffer[11] = m.m[14]; - a->buffer[12] = m.m[3]; - a->buffer[13] = m.m[7]; - a->buffer[14] = m.m[11]; - a->buffer[15] = m.m[15]; - return a; -} - -float mat4_cofactor(float m0, float m1, float m2, float m3, float m4, float m5, float m6, float m7, float m8) { - return m0 * (m4 * m8 - m5 * m7) - m1 * (m3 * m8 - m5 * m6) + m2 * (m3 * m7 - m4 * m6); -} - -float mat4_determinant(mat4_t m) { - float c00 = mat4_cofactor(m.m[5], m.m[9], m.m[13], m.m[6], m.m[10], m.m[14], m.m[7], m.m[11], m.m[15]); - float c01 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[6], m.m[10], m.m[14], m.m[7], m.m[11], m.m[15]); - float c02 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[5], m.m[9], m.m[13], m.m[7], m.m[11], m.m[15]); - float c03 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[5], m.m[9], m.m[13], m.m[6], m.m[10], m.m[14]); - return m.m[0] * c00 - m.m[1] * c01 + m.m[2] * c02 - m.m[3] * c03; -} - -mat4_t mat4_nan() { - mat4_t m; - m.m[0] = NAN; - return m; -} - -bool mat4_isnan(mat4_t m) { - return isnan(m.m[0]); -} diff --git a/base/sources/iron_mat4.h b/base/sources/iron_mat4.h deleted file mode 100644 index e77799a6..00000000 --- a/base/sources/iron_mat4.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include "iron_array.h" -#include "iron_quat.h" -#include "iron_vec4.h" -#include "iron_math.h" - -typedef struct mat4_decomposed { - vec4_t loc; - quat_t rot; - vec4_t scl; -} mat4_decomposed_t; - -mat4_t mat4_create(float _00, float _10, float _20, float _30, float _01, float _11, float _21, float _31, float _02, float _12, float _22, float _32, - float _03, float _13, float _23, float _33); -mat4_t mat4_identity(); -mat4_t mat4_from_f32_array(f32_array_t *a, int offset); -mat4_t mat4_persp(float fov_y, float aspect, float zn, float zf); -mat4_t mat4_ortho(float left, float right, float bottom, float top, float znear, float zfar); -mat4_t mat4_rot_z(float alpha); -mat4_t mat4_compose(vec4_t loc, quat_t rot, vec4_t scl); -mat4_decomposed_t *mat4_decompose(mat4_t m); -mat4_t mat4_set_loc(mat4_t m, vec4_t v); -mat4_t mat4_from_quat(quat_t q); -mat4_t mat4_init_translate(float x, float y, float z); -mat4_t mat4_translate(mat4_t m, float x, float y, float z); -mat4_t mat4_scale(mat4_t m, vec4_t v); -mat4_t mat4_mult_mat3x4(mat4_t a, mat4_t b); -mat4_t mat4_mult_mat(mat4_t a, mat4_t b); -mat4_t mat4_inv(mat4_t a); -mat4_t mat4_transpose(mat4_t m); -mat4_t mat4_transpose3x3(mat4_t m); -mat4_t mat4_clone(mat4_t m); -vec4_t mat4_get_loc(mat4_t m); -vec4_t mat4_get_scale(mat4_t m); -mat4_t mat4_mult(mat4_t m, float s); -mat4_t mat4_to_rot(mat4_t m); -vec4_t mat4_right(mat4_t m); -vec4_t mat4_look(mat4_t m); -vec4_t mat4_up(mat4_t m); -f32_array_t *mat4_to_f32_array(mat4_t m); -float mat4_cofactor(float m0, float m1, float m2, float m3, float m4, float m5, float m6, float m7, float m8); -float mat4_determinant(mat4_t m); -mat4_t mat4_nan(); -bool mat4_isnan(mat4_t m); - -#define mat4nan (mat4_nan()) diff --git a/base/sources/iron_math.c b/base/sources/iron_math.c index 5ef2080f..a698772f 100644 --- a/base/sources/iron_math.c +++ b/base/sources/iron_math.c @@ -1,180 +1,11 @@ #include "iron_math.h" +#include "iron_gc.h" #include #include #include #include -float iron_cot(float x) { - return cosf(x) / sinf(x); -} - -float iron_round(float value) { - return floorf(value + 0.5f); -} - -float iron_abs(float value) { - return value < 0 ? -value : value; -} - -float iron_min(float a, float b) { - return a > b ? b : a; -} - -float iron_max(float a, float b) { - return a > b ? a : b; -} - -int iron_mini(int a, int b) { - return a > b ? b : a; -} - -int iron_maxi(int a, int b) { - return a > b ? a : b; -} - -float iron_clamp(float value, float minValue, float maxValue) { - return iron_max(minValue, iron_min(maxValue, value)); -} - -float iron_matrix3x3_get(iron_matrix3x3_t *matrix, int x, int y) { - return matrix->m[x * 3 + y]; -} - -void iron_matrix3x3_set(iron_matrix3x3_t *matrix, int x, int y, float value) { - matrix->m[x * 3 + y] = value; -} - -void iron_matrix3x3_transpose(iron_matrix3x3_t *matrix) { - iron_matrix3x3_t transposed; - for (int y = 0; y < 3; ++y) { - for (int x = 0; x < 3; ++x) { - iron_matrix3x3_set(&transposed, x, y, iron_matrix3x3_get(matrix, y, x)); - } - } - memcpy(matrix->m, transposed.m, sizeof(transposed.m)); -} - -iron_matrix3x3_t iron_matrix3x3_identity(void) { - iron_matrix3x3_t m; - memset(m.m, 0, sizeof(m.m)); - for (unsigned x = 0; x < 3; ++x) { - iron_matrix3x3_set(&m, x, x, 1.0f); - } - return m; -} - -iron_matrix3x3_t iron_matrix3x3_rotation_x(float alpha) { - iron_matrix3x3_t m = iron_matrix3x3_identity(); - float ca = cosf(alpha); - float sa = sinf(alpha); - iron_matrix3x3_set(&m, 1, 1, ca); - iron_matrix3x3_set(&m, 2, 1, -sa); - iron_matrix3x3_set(&m, 1, 2, sa); - iron_matrix3x3_set(&m, 2, 2, ca); - return m; -} - -iron_matrix3x3_t iron_matrix3x3_rotation_y(float alpha) { - iron_matrix3x3_t m = iron_matrix3x3_identity(); - float ca = cosf(alpha); - float sa = sinf(alpha); - iron_matrix3x3_set(&m, 0, 0, ca); - iron_matrix3x3_set(&m, 2, 0, sa); - iron_matrix3x3_set(&m, 0, 2, -sa); - iron_matrix3x3_set(&m, 2, 2, ca); - return m; -} - -iron_matrix3x3_t iron_matrix3x3_rotation_z(float alpha) { - iron_matrix3x3_t m = iron_matrix3x3_identity(); - float ca = cosf(alpha); - float sa = sinf(alpha); - iron_matrix3x3_set(&m, 0, 0, ca); - iron_matrix3x3_set(&m, 1, 0, -sa); - iron_matrix3x3_set(&m, 0, 1, sa); - iron_matrix3x3_set(&m, 1, 1, ca); - return m; -} - -iron_matrix3x3_t iron_matrix3x3_translation(float x, float y) { - iron_matrix3x3_t m = iron_matrix3x3_identity(); - iron_matrix3x3_set(&m, 2, 0, x); - iron_matrix3x3_set(&m, 2, 1, y); - return m; -} - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wconditional-uninitialized" -#endif - -iron_matrix3x3_t iron_matrix3x3_multiply(iron_matrix3x3_t *a, iron_matrix3x3_t *b) { - iron_matrix3x3_t result; - for (unsigned x = 0; x < 3; ++x) { - for (unsigned y = 0; y < 3; ++y) { - float t = iron_matrix3x3_get(a, 0, y) * iron_matrix3x3_get(b, x, 0); - for (unsigned i = 1; i < 3; ++i) { - t += iron_matrix3x3_get(a, i, y) * iron_matrix3x3_get(b, x, i); - } - iron_matrix3x3_set(&result, x, y, t); - } - } - return result; -} - -static float vector3_get(iron_vector3_t vec, int index) { - float *values = (float *)&vec; - return values[index]; -} - -static void vector3_set(iron_vector3_t *vec, int index, float value) { - float *values = (float *)vec; - values[index] = value; -} - -iron_vector3_t iron_matrix3x3_multiply_vector(iron_matrix3x3_t *a, iron_vector3_t b) { - iron_vector3_t product; - for (unsigned y = 0; y < 3; ++y) { - float t = 0; - for (unsigned x = 0; x < 3; ++x) { - t += iron_matrix3x3_get(a, x, y) * vector3_get(b, x); - } - vector3_set(&product, y, t); - } - return product; -} - -float iron_matrix4x4_get(iron_matrix4x4_t *matrix, int x, int y) { - return matrix->m[x * 4 + y]; -} - -void iron_matrix4x4_set(iron_matrix4x4_t *matrix, int x, int y, float value) { - matrix->m[x * 4 + y] = value; -} - -void iron_matrix4x4_transpose(iron_matrix4x4_t *matrix) { - iron_matrix4x4_t transposed; - for (int y = 0; y < 4; ++y) { - for (int x = 0; x < 4; ++x) { - iron_matrix4x4_set(&transposed, x, y, iron_matrix4x4_get(matrix, y, x)); - } - } - memcpy(matrix->m, transposed.m, sizeof(transposed.m)); -} - -iron_matrix4x4_t iron_matrix4x4_multiply(iron_matrix4x4_t *a, iron_matrix4x4_t *b) { - iron_matrix4x4_t result; - for (unsigned x = 0; x < 4; ++x) - for (unsigned y = 0; y < 4; ++y) { - float t = iron_matrix4x4_get(a, 0, y) * iron_matrix4x4_get(b, x, 0); - for (unsigned i = 1; i < 4; ++i) { - t += iron_matrix4x4_get(a, i, y) * iron_matrix4x4_get(b, x, i); - } - iron_matrix4x4_set(&result, x, y, t); - } - return result; -} - void iron_color_components(uint32_t color, float *red, float *green, float *blue, float *alpha) { *alpha = ((color & 0xff000000) >> 24) / 255.0f; *red = ((color & 0x00ff0000) >> 16) / 255.0f; @@ -237,3 +68,1078 @@ uint32_t iron_hash_djb2(unsigned char *str) { } return hash; } + +// ██╗ ██╗███████╗ ██████╗██████╗ +// ██║ ██║██╔════╝██╔════╝╚════██╗ +// ██║ ██║█████╗ ██║ █████╔╝ +// ╚██╗ ██╔╝██╔══╝ ██║ ██╔═══╝ +// ╚████╔╝ ███████╗╚██████╗███████╗ +// ╚═══╝ ╚══════╝ ╚═════╝╚══════╝ + +vec2_t vec2_create(float x, float y) { + vec2_t v; + v.x = x; + v.y = y; + return v; +} + +float vec2_len(vec2_t v) { + return sqrtf(v.x * v.x + v.y * v.y); +} + +vec2_t vec2_set_len(vec2_t v, float length) { + float current_length = vec2_len(v); + if (current_length == 0) { + return v; + } + float mul = length / current_length; + v.x *= mul; + v.y *= mul; + return v; +} + +vec2_t vec2_mult(vec2_t v, float f) { + v.x *= f; + v.y *= f; + return v; +} + +vec2_t vec2_add(vec2_t a, vec2_t b) { + a.x += b.x; + a.y += b.y; + return a; +} + +vec2_t vec2_sub(vec2_t a, vec2_t b) { + a.x -= b.x; + a.y -= b.y; + return a; +} + +float vec2_cross(vec2_t a, vec2_t b) { + return a.x * b.y - a.y * b.x; +} + +vec2_t vec2_norm(vec2_t v) { + float n = vec2_len(v); + if (n > 0.0) { + float inv_n = 1.0f / n; + v.x *= inv_n; + v.y *= inv_n; + } + return v; +} + +float vec2_dot(vec2_t a, vec2_t b) { + return a.x * b.x + a.y * b.y; +} + +vec2_t vec2_nan() { + vec2_t v; + v.x = NAN; + return v; +} + +bool vec2_isnan(vec2_t v) { + return isnan(v.x); +} + +// ██╗ ██╗███████╗ ██████╗██╗ ██╗ +// ██║ ██║██╔════╝██╔════╝██║ ██║ +// ██║ ██║█████╗ ██║ ███████║ +// ╚██╗ ██╔╝██╔══╝ ██║ ╚════██║ +// ╚████╔╝ ███████╗╚██████╗ ██║ +// ╚═══╝ ╚══════╝ ╚═════╝ ╚═╝ + +vec4_t vec4_create(float x, float y, float z, float w) { + vec4_t v; + v.x = x; + v.y = y; + v.z = z; + v.w = w; + return v; +} + +vec4_t vec4_cross(vec4_t a, vec4_t b) { + vec4_t v; + v.x = a.y * b.z - a.z * b.y; + v.y = a.z * b.x - a.x * b.z; + v.z = a.x * b.y - a.y * b.x; + return v; +} + +vec4_t vec4_add(vec4_t a, vec4_t b) { + a.x += b.x; + a.y += b.y; + a.z += b.z; + a.w += b.w; + return a; +} + +vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w) { + a.x += x; + a.y += y; + a.z += z; + a.w += w; + return a; +} + +vec4_t vec4_norm(vec4_t a) { + float n = vec4_len(a); + if (n > 0.0) { + float inv_n = 1.0f / n; + a.x *= inv_n; + a.y *= inv_n; + a.z *= inv_n; + } + return a; +} + +vec4_t vec4_mult(vec4_t a, float f) { + a.x *= f; + a.y *= f; + a.z *= f; + a.w *= f; + return a; +} + +float vec4_dot(vec4_t a, vec4_t b) { + return a.x * b.x + a.y * b.y + a.z * b.z; +} + +vec4_t vec4_clone(vec4_t v) { + return v; +} + +vec4_t vec4_lerp(vec4_t from, vec4_t to, float s) { + vec4_t v; + v.x = from.x + (to.x - from.x) * s; + v.y = from.y + (to.y - from.y) * s; + v.z = from.z + (to.z - from.z) * s; + return v; +} + +vec4_t vec4_apply_proj(vec4_t a, mat4_t m) { + vec4_t v; + float d = 1.0 / (m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15]); // Perspective divide + v.x = (m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]) * d; + v.y = (m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]) * d; + v.z = (m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]) * d; + return v; +} + +vec4_t vec4_apply_mat(vec4_t a, mat4_t m) { + vec4_t v; + v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]; + v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]; + v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]; + return v; +} + +vec4_t vec4_apply_mat4(vec4_t a, mat4_t m) { + vec4_t v; + v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12] * a.w; + v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13] * a.w; + v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14] * a.w; + v.w = m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15] * a.w; + return v; +} + +vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle) { + quat_t q = quat_from_axis_angle(axis, angle); + return vec4_apply_quat(a, q); +} + +vec4_t vec4_apply_quat(vec4_t a, quat_t q) { + vec4_t v; + float ix = q.w * a.x + q.y * a.z - q.z * a.y; + float iy = q.w * a.y + q.z * a.x - q.x * a.z; + float iz = q.w * a.z + q.x * a.y - q.y * a.x; + float iw = -q.x * a.x - q.y * a.y - q.z * a.z; + v.x = ix * q.w + iw * -q.x + iy * -q.z - iz * -q.y; + v.y = iy * q.w + iw * -q.y + iz * -q.x - ix * -q.z; + v.z = iz * q.w + iw * -q.z + ix * -q.y - iy * -q.x; + return v; +} + +bool vec4_equals(vec4_t a, vec4_t b) { + return a.x == b.x && a.y == b.y && a.z == b.z; +} + +bool vec4_almost_equals(vec4_t a, vec4_t b, float prec) { + return fabs(a.x - b.x) < prec && fabs(a.y - b.y) < prec && fabs(a.z - b.z) < prec; +} + +float vec4_len(vec4_t a) { + return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z); +} + +vec4_t vec4_sub(vec4_t a, vec4_t b) { + a.x -= b.x; + a.y -= b.y; + a.z -= b.z; + return a; +} + +vec4_t vec4_exp(vec4_t a) { + a.x = expf(a.x); + a.y = expf(a.y); + a.z = expf(a.z); + return a; +} + +float vec4_dist(vec4_t v1, vec4_t v2) { + return vec4_fdist(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z); +} + +float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z) { + float vx = v1x - v2x; + float vy = v1y - v2y; + float vz = v1z - v2z; + return sqrtf(vx * vx + vy * vy + vz * vz); +} + +vec4_t vec4_reflect(vec4_t a, vec4_t n) { + float d = 2 * vec4_dot(a, n); + a.x -= d * n.x; + a.y -= d * n.y; + a.z -= d * n.z; + return a; +} + +vec4_t vec4_clamp(vec4_t a, float min, float max) { + float l = vec4_len(a); + if (l < min) { + return vec4_mult(vec4_norm(a), min); + } + else if (l > max) { + return vec4_mult(vec4_norm(a), max); + } + return a; +} + +vec4_t vec4_x_axis() { + return vec4_create(1.0, 0.0, 0.0, 1.0); +} + +vec4_t vec4_y_axis() { + return vec4_create(0.0, 1.0, 0.0, 1.0); +} + +vec4_t vec4_z_axis() { + return vec4_create(0.0, 0.0, 1.0, 1.0); +} + +vec4_t vec4_nan() { + vec4_t v; + v.x = NAN; + return v; +} + +bool vec4_isnan(vec4_t v) { + return isnan(v.x); +} + +// ██████╗ ██╗ ██╗ █████╗ ████████╗ +// ██╔═══██╗██║ ██║██╔══██╗╚══██╔══╝ +// ██║ ██║██║ ██║███████║ ██║ +// ██║▄▄ ██║██║ ██║██╔══██║ ██║ +// ╚██████╔╝╚██████╔╝██║ ██║ ██║ +// ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ + +quat_t quat_create(float x, float y, float z, float w) { + quat_t q; + q.x = x; + q.y = y; + q.z = z; + q.w = w; + return q; +} + +quat_t quat_from_axis_angle(vec4_t axis, float angle) { + float s = sinf(angle * 0.5); + quat_t q; + q.x = axis.x * s; + q.y = axis.y * s; + q.z = axis.z * s; + q.w = cosf(angle * 0.5); + return quat_norm(q); +} + +quat_t quat_from_mat(mat4_t m) { + m = mat4_to_rot(m); + return quat_from_rot_mat(m); +} + +quat_t quat_from_rot_mat(mat4_t m) { + // Assumes the upper 3x3 is a pure rotation matrix + float m11 = m.m[0]; + float m12 = m.m[4]; + float m13 = m.m[8]; + float m21 = m.m[1]; + float m22 = m.m[5]; + float m23 = m.m[9]; + float m31 = m.m[2]; + float m32 = m.m[6]; + float m33 = m.m[10]; + float tr = m11 + m22 + m33; + float s = 0.0; + quat_t q; + + if (tr > 0) { + s = 0.5 / sqrtf(tr + 1.0); + q.w = 0.25 / s; + q.x = (m32 - m23) * s; + q.y = (m13 - m31) * s; + q.z = (m21 - m12) * s; + } + else if (m11 > m22 && m11 > m33) { + s = 2.0 * sqrtf(1.0 + m11 - m22 - m33); + q.w = (m32 - m23) / s; + q.x = 0.25 * s; + q.y = (m12 + m21) / s; + q.z = (m13 + m31) / s; + } + else if (m22 > m33) { + s = 2.0 * sqrtf(1.0 + m22 - m11 - m33); + q.w = (m13 - m31) / s; + q.x = (m12 + m21) / s; + q.y = 0.25 * s; + q.z = (m23 + m32) / s; + } + else { + s = 2.0 * sqrtf(1.0 + m33 - m11 - m22); + q.w = (m21 - m12) / s; + q.x = (m13 + m31) / s; + q.y = (m23 + m32) / s; + q.z = 0.25 * s; + } + return q; +} + +quat_t quat_mult(quat_t a, quat_t b) { + quat_t q; + q.x = a.x * b.w + a.w * b.x + a.y * b.z - a.z * b.y; + q.y = a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x; + q.z = a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w; + q.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z; + return q; +} + +quat_t quat_norm(quat_t q) { + float l = sqrtf(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); + if (l == 0.0) { + q.x = 0; + q.y = 0; + q.z = 0; + q.w = 0; + } + else { + l = 1.0 / l; + q.x *= l; + q.y *= l; + q.z *= l; + q.w *= l; + } + return q; +} + +quat_t quat_clone(quat_t q) { + return q; +} + +vec4_t quat_get_euler(quat_t q) { + float a = -2 * (q.x * q.z - q.w * q.y); + float b = q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z; + float c = 2 * (q.x * q.y + q.w * q.z); + float d = -2 * (q.y * q.z - q.w * q.x); + float e = q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z; + return vec4_create(atan2f(d, e), atan2f(a, b), asinf(c), 1.0); +} + +quat_t quat_from_euler(float x, float y, float z) { + float f = x / 2; + float c1 = cosf(f); + float s1 = sinf(f); + f = y / 2; + float c2 = cosf(f); + float s2 = sinf(f); + f = z / 2; + float c3 = cosf(f); + float s3 = sinf(f); + // YZX + quat_t q; + q.x = s1 * c2 * c3 + c1 * s2 * s3; + q.y = c1 * s2 * c3 + s1 * c2 * s3; + q.z = c1 * c2 * s3 - s1 * s2 * c3; + q.w = c1 * c2 * c3 - s1 * s2 * s3; + return q; +} + +quat_t quat_lerp(quat_t from, quat_t to, float s) { + float dot = quat_dot(from, to); + if (dot < 0.0) { + from.x = -from.x; + from.y = -from.y; + from.z = -from.z; + from.w = -from.w; + } + from.x += (to.x - from.x) * s; + from.y += (to.y - from.y) * s; + from.z += (to.z - from.z) * s; + from.w += (to.w - from.w) * s; + return quat_norm(from); +} + +float quat_dot(quat_t a, quat_t b) { + return (a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w); +} + +quat_t quat_from_to(vec4_t v0, vec4_t v1) { + // Rotation formed by direction vectors + // v0 and v1 should be normalized first + float dot = vec4_dot(v0, v1); + if (dot < -0.999999) { + vec4_t a = vec4_cross(vec4_x_axis(), v0); + if (vec4_len(a) < 0.000001) { + a = vec4_cross(vec4_y_axis(), v0); + } + a = vec4_norm(a); + return quat_from_axis_angle(a, IRON_PI); + } + else if (dot > 0.999999) { + return quat_create(0, 0, 0, 1); + } + else { + vec4_t a = vec4_cross(v0, v1); + quat_t q = quat_create(a.x, a.y, a.z, 1.0 + dot); + return quat_norm(q); + } +} + +quat_t quat_inv(quat_t q) { + float l = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + l = -1.0 / l; + q.x = q.x * l; + q.y = q.y * l; + q.z = q.z * l; + q.w = -q.w * l; + return q; +} + +// ███╗ ███╗ █████╗ ████████╗██████╗ +// ████╗ ████║██╔══██╗╚══██╔══╝╚════██╗ +// ██╔████╔██║███████║ ██║ █████╔╝ +// ██║╚██╔╝██║██╔══██║ ██║ ╚═══██╗ +// ██║ ╚═╝ ██║██║ ██║ ██║ ██████╔╝ +// ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ + +mat3_t mat3_create(float _00, float _10, float _20, float _01, float _11, float _21, float _02, float _12, float _22) { + mat3_t m; + m.m[0] = _00; + m.m[1] = _01; + m.m[2] = _02; + m.m[3] = _10; + m.m[4] = _11; + m.m[5] = _12; + m.m[6] = _20; + m.m[7] = _21; + m.m[8] = _22; + return m; +} + +mat3_t mat3_identity() { + return mat3_create(1, 0, 0, 0, 1, 0, 0, 0, 1); +} + +mat3_t mat3_translation(float x, float y) { + return mat3_create(1, 0, x, 0, 1, y, 0, 0, 1); +} + +mat3_t mat3_rotation(float alpha) { + return mat3_create(cosf(alpha), -sinf(alpha), 0, sinf(alpha), cosf(alpha), 0, 0, 0, 1); +} + +mat3_t mat3_scale(mat3_t m, vec4_t v) { + m.m[0] *= v.x; + m.m[1] *= v.x; + m.m[2] *= v.x; + m.m[3] *= v.y; + m.m[4] *= v.y; + m.m[5] *= v.y; + m.m[6] *= v.z; + m.m[7] *= v.z; + m.m[8] *= v.z; + return m; +} + +mat3_t mat3_set_from4(mat4_t m4) { + mat3_t m; + m.m[0] = m4.m[0]; + m.m[1] = m4.m[1]; + m.m[2] = m4.m[2]; + m.m[3] = m4.m[4]; + m.m[4] = m4.m[5]; + m.m[5] = m4.m[6]; + m.m[6] = m4.m[8]; + m.m[7] = m4.m[9]; + m.m[8] = m4.m[10]; + return m; +} + +mat3_t mat3_multmat(mat3_t a, mat3_t b) { + return mat3_create(a.m[0] * b.m[0] + a.m[3] * b.m[1] + a.m[6] * b.m[2], a.m[0] * b.m[3] + a.m[3] * b.m[4] + a.m[6] * b.m[5], + a.m[0] * b.m[6] + a.m[3] * b.m[7] + a.m[6] * b.m[8], a.m[1] * b.m[0] + a.m[4] * b.m[1] + a.m[7] * b.m[2], + a.m[1] * b.m[3] + a.m[4] * b.m[4] + a.m[7] * b.m[5], a.m[1] * b.m[6] + a.m[4] * b.m[7] + a.m[7] * b.m[8], + a.m[2] * b.m[0] + a.m[5] * b.m[1] + a.m[8] * b.m[2], a.m[2] * b.m[3] + a.m[5] * b.m[4] + a.m[8] * b.m[5], + a.m[2] * b.m[6] + a.m[5] * b.m[7] + a.m[8] * b.m[8]); +} + +mat3_t mat3_transpose(mat3_t m) { + float f = m.m[1]; + m.m[1] = m.m[3]; + m.m[3] = f; + + f = m.m[2]; + m.m[2] = m.m[6]; + m.m[6] = f; + + f = m.m[5]; + m.m[5] = m.m[7]; + m.m[7] = f; + + return m; +} + +mat3_t mat3_nan() { + mat3_t m; + m.m[0] = NAN; + return m; +} + +bool mat3_isnan(mat3_t m) { + return isnan(m.m[0]); +} + +// ███╗ ███╗ █████╗ ████████╗██╗ ██╗ +// ████╗ ████║██╔══██╗╚══██╔══╝██║ ██║ +// ██╔████╔██║███████║ ██║ ███████║ +// ██║╚██╔╝██║██╔══██║ ██║ ╚════██║ +// ██║ ╚═╝ ██║██║ ██║ ██║ ██║ +// ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ + +mat4_t mat4_create(float _00, float _10, float _20, float _30, float _01, float _11, float _21, float _31, float _02, float _12, float _22, float _32, + float _03, float _13, float _23, float _33) { + mat4_t m; + m.m[0] = _00; + m.m[1] = _01; + m.m[2] = _02; + m.m[3] = _03; + m.m[4] = _10; + m.m[5] = _11; + m.m[6] = _12; + m.m[7] = _13; + m.m[8] = _20; + m.m[9] = _21; + m.m[10] = _22; + m.m[11] = _23; + m.m[12] = _30; + m.m[13] = _31; + m.m[14] = _32; + m.m[15] = _33; + return m; +} + +mat4_t mat4_identity() { + return mat4_create(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); +} + +mat4_t mat4_from_f32_array(f32_array_t *a, int offset) { + return mat4_create(a->buffer[0 + offset], a->buffer[1 + offset], a->buffer[2 + offset], a->buffer[3 + offset], a->buffer[4 + offset], a->buffer[5 + offset], + a->buffer[6 + offset], a->buffer[7 + offset], a->buffer[8 + offset], a->buffer[9 + offset], a->buffer[10 + offset], + a->buffer[11 + offset], a->buffer[12 + offset], a->buffer[13 + offset], a->buffer[14 + offset], a->buffer[15 + offset]); +} + +mat4_t mat4_persp(float fov_y, float aspect, float zn, float zf) { + float uh = 1.0 / tanf(fov_y / 2); + float uw = uh / aspect; + return mat4_create(uw, 0, 0, 0, 0, uh, 0, 0, 0, 0, (zf + zn) / (zn - zf), 2 * zf * zn / (zn - zf), 0, 0, -1, 0); +} + +mat4_t mat4_ortho(float left, float right, float bottom, float top, float znear, float zfar) { + float rl = right - left; + float tb = top - bottom; + float fn = zfar - znear; + float tx = -(right + left) / (rl); + float ty = -(top + bottom) / (tb); + float tz = -(zfar + znear) / (fn); + return mat4_create(2 / rl, 0, 0, tx, 0, 2 / tb, 0, ty, 0, 0, -2 / fn, tz, 0, 0, 0, 1); +} + +mat4_t mat4_rot_z(float alpha) { + float ca = cosf(alpha); + float sa = sinf(alpha); + return mat4_create(ca, -sa, 0, 0, sa, ca, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); +} + +mat4_t mat4_compose(vec4_t loc, quat_t rot, vec4_t scl) { + mat4_t m = mat4_from_quat(rot); + m = mat4_scale(m, scl); + m = mat4_set_loc(m, loc); + return m; +} + +mat4_decomposed_t *mat4_decompose(mat4_t m) { + vec4_t loc; + quat_t rot; + vec4_t scl; + loc.x = m.m[12]; + loc.y = m.m[13]; + loc.z = m.m[14]; + scl.x = vec4_len(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); + scl.y = vec4_len(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); + scl.z = vec4_len(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); + if (mat4_determinant(m) < 0.0) { + scl.x = -scl.x; + } + float invs = 1.0 / scl.x; // Scale the rotation part + m.m[0] *= invs; + m.m[1] *= invs; + m.m[2] *= invs; + invs = 1.0 / scl.y; + m.m[4] *= invs; + m.m[5] *= invs; + m.m[6] *= invs; + invs = 1.0 / scl.z; + m.m[8] *= invs; + m.m[9] *= invs; + m.m[10] *= invs; + rot = quat_from_rot_mat(m); + + mat4_decomposed_t *dec = gc_alloc(sizeof(mat4_decomposed_t)); + dec->loc = loc; + dec->rot = rot; + dec->scl = scl; + return dec; +} + +mat4_t mat4_set_loc(mat4_t m, vec4_t v) { + m.m[12] = v.x; + m.m[13] = v.y; + m.m[14] = v.z; + return m; +} + +mat4_t mat4_from_quat(quat_t q) { + float x2 = q.x + q.x; + float y2 = q.y + q.y; + float z2 = q.z + q.z; + float xx = q.x * x2; + float xy = q.x * y2; + float xz = q.x * z2; + float yy = q.y * y2; + float yz = q.y * z2; + float zz = q.z * z2; + float wx = q.w * x2; + float wy = q.w * y2; + float wz = q.w * z2; + + mat4_t m; + m.m[0] = 1.0 - (yy + zz); + m.m[4] = xy - wz; + m.m[8] = xz + wy; + + m.m[1] = xy + wz; + m.m[5] = 1.0 - (xx + zz); + m.m[9] = yz - wx; + + m.m[2] = xz - wy; + m.m[6] = yz + wx; + m.m[10] = 1.0 - (xx + yy); + + m.m[3] = 0.0; + m.m[7] = 0.0; + m.m[11] = 0.0; + m.m[12] = 0.0; + m.m[13] = 0.0; + m.m[14] = 0.0; + m.m[15] = 1.0; + + return m; +} + +mat4_t mat4_init_translate(float x, float y, float z) { + mat4_t m; + m.m[0] = 1.0; + m.m[1] = 0.0; + m.m[2] = 0.0; + m.m[3] = 0.0; + m.m[4] = 0.0; + m.m[5] = 1.0; + m.m[6] = 0.0; + m.m[7] = 0.0; + m.m[8] = 0.0; + m.m[9] = 0.0; + m.m[10] = 1.0; + m.m[11] = 0.0; + m.m[12] = x; + m.m[13] = y; + m.m[14] = z; + m.m[15] = 1.0; + return m; +} + +mat4_t mat4_translate(mat4_t m, float x, float y, float z) { + m.m[0] += x * m.m[3]; + m.m[1] += y * m.m[3]; + m.m[2] += z * m.m[3]; + m.m[4] += x * m.m[7]; + m.m[5] += y * m.m[7]; + m.m[6] += z * m.m[7]; + m.m[8] += x * m.m[11]; + m.m[9] += y * m.m[11]; + m.m[10] += z * m.m[11]; + m.m[12] += x * m.m[15]; + m.m[13] += y * m.m[15]; + m.m[14] += z * m.m[15]; + return m; +} + +mat4_t mat4_scale(mat4_t m, vec4_t v) { + m.m[0] *= v.x; + m.m[1] *= v.x; + m.m[2] *= v.x; + m.m[3] *= v.x; + m.m[4] *= v.y; + m.m[5] *= v.y; + m.m[6] *= v.y; + m.m[7] *= v.y; + m.m[8] *= v.z; + m.m[9] *= v.z; + m.m[10] *= v.z; + m.m[11] *= v.z; + return m; +} + +mat4_t mat4_mult_mat3x4(mat4_t a, mat4_t b) { + float a00 = a.m[0]; + float a01 = a.m[1]; + float a02 = a.m[2]; + float a03 = a.m[3]; + float a10 = a.m[4]; + float a11 = a.m[5]; + float a12 = a.m[6]; + float a13 = a.m[7]; + float a20 = a.m[8]; + float a21 = a.m[9]; + float a22 = a.m[10]; + float a23 = a.m[11]; + float a30 = a.m[12]; + float a31 = a.m[13]; + float a32 = a.m[14]; + float a33 = a.m[15]; + + float b0 = b.m[0]; + float b1 = b.m[4]; + float b2 = b.m[8]; + float b3 = b.m[12]; + + mat4_t m; + m.m[0] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + m.m[4] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + m.m[8] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + m.m[12] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + b0 = b.m[1]; + b1 = b.m[5]; + b2 = b.m[9]; + b3 = b.m[13]; + m.m[1] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + m.m[5] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + m.m[9] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + m.m[13] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + b0 = b.m[2]; + b1 = b.m[6]; + b2 = b.m[10]; + b3 = b.m[14]; + m.m[2] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + m.m[6] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + m.m[10] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + m.m[14] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + m.m[3] = 0; + m.m[7] = 0; + m.m[11] = 0; + m.m[15] = 1; + return m; +} + +mat4_t mat4_mult_mat(mat4_t a, mat4_t b) { + float a00 = a.m[0]; + float a01 = a.m[1]; + float a02 = a.m[2]; + float a03 = a.m[3]; + float a10 = a.m[4]; + float a11 = a.m[5]; + float a12 = a.m[6]; + float a13 = a.m[7]; + float a20 = a.m[8]; + float a21 = a.m[9]; + float a22 = a.m[10]; + float a23 = a.m[11]; + float a30 = a.m[12]; + float a31 = a.m[13]; + float a32 = a.m[14]; + float a33 = a.m[15]; + + float b0 = b.m[0]; + float b1 = b.m[4]; + float b2 = b.m[8]; + float b3 = b.m[12]; + a.m[0] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + a.m[4] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + a.m[8] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + a.m[12] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + b0 = b.m[1]; + b1 = b.m[5]; + b2 = b.m[9]; + b3 = b.m[13]; + a.m[1] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + a.m[5] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + a.m[9] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + a.m[13] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + b0 = b.m[2]; + b1 = b.m[6]; + b2 = b.m[10]; + b3 = b.m[14]; + a.m[2] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + a.m[6] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + a.m[10] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + a.m[14] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + b0 = b.m[3]; + b1 = b.m[7]; + b2 = b.m[11]; + b3 = b.m[15]; + a.m[3] = a00 * b0 + a01 * b1 + a02 * b2 + a03 * b3; + a.m[7] = a10 * b0 + a11 * b1 + a12 * b2 + a13 * b3; + a.m[11] = a20 * b0 + a21 * b1 + a22 * b2 + a23 * b3; + a.m[15] = a30 * b0 + a31 * b1 + a32 * b2 + a33 * b3; + + return a; +} + +mat4_t mat4_inv(mat4_t a) { + float a00 = a.m[0]; + float a01 = a.m[1]; + float a02 = a.m[2]; + float a03 = a.m[3]; + float a10 = a.m[4]; + float a11 = a.m[5]; + float a12 = a.m[6]; + float a13 = a.m[7]; + float a20 = a.m[8]; + float a21 = a.m[9]; + float a22 = a.m[10]; + float a23 = a.m[11]; + float a30 = a.m[12]; + float a31 = a.m[13]; + float a32 = a.m[14]; + float a33 = a.m[15]; + float b00 = a00 * a11 - a01 * a10; + float b01 = a00 * a12 - a02 * a10; + float b02 = a00 * a13 - a03 * a10; + float b03 = a01 * a12 - a02 * a11; + float b04 = a01 * a13 - a03 * a11; + float b05 = a02 * a13 - a03 * a12; + float b06 = a20 * a31 - a21 * a30; + float b07 = a20 * a32 - a22 * a30; + float b08 = a20 * a33 - a23 * a30; + float b09 = a21 * a32 - a22 * a31; + float b10 = a21 * a33 - a23 * a31; + float b11 = a22 * a33 - a23 * a32; + + float det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (det == 0.0) { + return mat4_identity(); + } + det = 1.0 / det; + + mat4_t m; + m.m[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + m.m[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + m.m[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + m.m[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + m.m[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + m.m[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + m.m[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + m.m[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + m.m[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + m.m[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + m.m[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + m.m[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + m.m[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + m.m[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + m.m[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + m.m[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + + return m; +} + +mat4_t mat4_transpose(mat4_t m) { + float f = m.m[1]; + m.m[1] = m.m[4]; + m.m[4] = f; + + f = m.m[2]; + m.m[2] = m.m[8]; + m.m[8] = f; + + f = m.m[3]; + m.m[3] = m.m[12]; + m.m[12] = f; + + f = m.m[6]; + m.m[6] = m.m[9]; + m.m[9] = f; + + f = m.m[7]; + m.m[7] = m.m[13]; + m.m[13] = f; + + f = m.m[11]; + m.m[11] = m.m[14]; + m.m[14] = f; + + return m; +} + +mat4_t mat4_transpose3(mat4_t m) { + float f = m.m[1]; + m.m[1] = m.m[4]; + m.m[4] = f; + + f = m.m[2]; + m.m[2] = m.m[8]; + m.m[8] = f; + + f = m.m[6]; + m.m[6] = m.m[9]; + m.m[9] = f; + + return m; +} + +mat4_t mat4_clone(mat4_t m) { + return mat4_create(m.m[0], m.m[4], m.m[8], m.m[12], m.m[1], m.m[5], m.m[9], m.m[13], m.m[2], m.m[6], m.m[10], m.m[14], m.m[3], m.m[7], m.m[11], m.m[15]); +} + +vec4_t mat4_get_loc(mat4_t m) { + return vec4_create(m.m[12], m.m[13], m.m[14], m.m[15]); +} + +vec4_t mat4_get_scale(mat4_t m) { + return vec4_create(sqrtf(m.m[0] * m.m[0] + m.m[4] * m.m[4] + m.m[8] * m.m[8]), sqrtf(m.m[1] * m.m[1] + m.m[5] * m.m[5] + m.m[9] * m.m[9]), + sqrtf(m.m[2] * m.m[2] + m.m[6] * m.m[6] + m.m[10] * m.m[10]), 1.0); +} + +mat4_t mat4_mult(mat4_t m, float s) { + m.m[0] *= s; + m.m[1] *= s; + m.m[2] *= s; + m.m[3] *= s; + m.m[4] *= s; + m.m[5] *= s; + m.m[6] *= s; + m.m[7] *= s; + m.m[8] *= s; + m.m[9] *= s; + m.m[10] *= s; + m.m[11] *= s; + m.m[12] *= s; + m.m[13] *= s; + m.m[14] *= s; + m.m[15] *= s; + return m; +} + +mat4_t mat4_to_rot(mat4_t m) { + float scale = 1.0 / vec4_len(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); + m.m[0] = m.m[0] * scale; + m.m[1] = m.m[1] * scale; + m.m[2] = m.m[2] * scale; + scale = 1.0 / vec4_len(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); + m.m[4] = m.m[4] * scale; + m.m[5] = m.m[5] * scale; + m.m[6] = m.m[6] * scale; + scale = 1.0 / vec4_len(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); + m.m[8] = m.m[8] * scale; + m.m[9] = m.m[9] * scale; + m.m[10] = m.m[10] * scale; + m.m[3] = 0.0; + m.m[7] = 0.0; + m.m[11] = 0.0; + m.m[12] = 0.0; + m.m[13] = 0.0; + m.m[14] = 0.0; + m.m[15] = 1.0; + return m; +} + +vec4_t mat4_right(mat4_t m) { + return vec4_norm(vec4_create(m.m[0], m.m[1], m.m[2], 1.0)); +} + +vec4_t mat4_look(mat4_t m) { + return vec4_norm(vec4_create(m.m[4], m.m[5], m.m[6], 1.0)); +} + +vec4_t mat4_up(mat4_t m) { + return vec4_norm(vec4_create(m.m[8], m.m[9], m.m[10], 1.0)); +} + +f32_array_t *mat4_to_f32_array(mat4_t m) { + f32_array_t *a = f32_array_create(16); + a->buffer[0] = m.m[0]; + a->buffer[1] = m.m[4]; + a->buffer[2] = m.m[8]; + a->buffer[3] = m.m[12]; + a->buffer[4] = m.m[1]; + a->buffer[5] = m.m[5]; + a->buffer[6] = m.m[9]; + a->buffer[7] = m.m[13]; + a->buffer[8] = m.m[2]; + a->buffer[9] = m.m[6]; + a->buffer[10] = m.m[10]; + a->buffer[11] = m.m[14]; + a->buffer[12] = m.m[3]; + a->buffer[13] = m.m[7]; + a->buffer[14] = m.m[11]; + a->buffer[15] = m.m[15]; + return a; +} + +float mat4_cofactor(float m0, float m1, float m2, float m3, float m4, float m5, float m6, float m7, float m8) { + return m0 * (m4 * m8 - m5 * m7) - m1 * (m3 * m8 - m5 * m6) + m2 * (m3 * m7 - m4 * m6); +} + +float mat4_determinant(mat4_t m) { + float c00 = mat4_cofactor(m.m[5], m.m[9], m.m[13], m.m[6], m.m[10], m.m[14], m.m[7], m.m[11], m.m[15]); + float c01 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[6], m.m[10], m.m[14], m.m[7], m.m[11], m.m[15]); + float c02 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[5], m.m[9], m.m[13], m.m[7], m.m[11], m.m[15]); + float c03 = mat4_cofactor(m.m[4], m.m[8], m.m[12], m.m[5], m.m[9], m.m[13], m.m[6], m.m[10], m.m[14]); + return m.m[0] * c00 - m.m[1] * c01 + m.m[2] * c02 - m.m[3] * c03; +} + +mat4_t mat4_nan() { + mat4_t m; + m.m[0] = NAN; + return m; +} + +bool mat4_isnan(mat4_t m) { + return isnan(m.m[0]); +} diff --git a/base/sources/iron_math.h b/base/sources/iron_math.h index ab601a96..fdf74f36 100644 --- a/base/sources/iron_math.h +++ b/base/sources/iron_math.h @@ -1,46 +1,38 @@ #pragma once +#include "iron_array.h" #include "iron_global.h" #include -#define IRON_PI 3.141592654 +#define IRON_PI 3.14159265358979323846 #define IRON_TAU 6.283185307 -float iron_cot(float x); -float iron_round(float value); -float iron_abs(float value); -float iron_min(float a, float b); -float iron_max(float a, float b); -int iron_mini(int a, int b); -int iron_maxi(int a, int b); -float iron_clamp(float value, float minValue, float maxValue); - -typedef struct iron_vector2 { +typedef struct vec2 { float x; float y; -} iron_vector2_t; +} vec2_t; -typedef struct iron_vector3 { +typedef struct vec3 { float x; float y; float z; -} iron_vector3_t; +} vec3_t; -typedef struct iron_vector4 { +typedef struct vec4 { float x; float y; float z; float w; -} iron_vector4_t; +} vec4_t; -typedef struct iron_quaternion { +typedef struct quat { float x; float y; float z; float w; -} iron_quaternion_t; +} quat_t; -typedef union iron_matrix3x3 { +typedef union mat3 { float m[3 * 3]; struct { float m00; @@ -53,20 +45,9 @@ typedef union iron_matrix3x3 { float m21; float m22; }; -} iron_matrix3x3_t; +} mat3_t; -float iron_matrix3x3_get(iron_matrix3x3_t *matrix, int x, int y); -void iron_matrix3x3_set(iron_matrix3x3_t *matrix, int x, int y, float value); -void iron_matrix3x3_transpose(iron_matrix3x3_t *matrix); -iron_matrix3x3_t iron_matrix3x3_identity(void); -iron_matrix3x3_t iron_matrix3x3_rotation_x(float alpha); -iron_matrix3x3_t iron_matrix3x3_rotation_y(float alpha); -iron_matrix3x3_t iron_matrix3x3_rotation_z(float alpha); -iron_matrix3x3_t iron_matrix3x3_translation(float x, float y); -iron_matrix3x3_t iron_matrix3x3_multiply(iron_matrix3x3_t *a, iron_matrix3x3_t *b); -iron_vector3_t iron_matrix3x3_multiply_vector(iron_matrix3x3_t *a, iron_vector3_t b); - -typedef union iron_matrix4x4 { +typedef union mat4 { float m[4 * 4]; struct { float m00; @@ -86,18 +67,118 @@ typedef union iron_matrix4x4 { float m32; float m33; }; -} iron_matrix4x4_t; - -float iron_matrix4x4_get(iron_matrix4x4_t *matrix, int x, int y); -void iron_matrix4x4_set(iron_matrix4x4_t *matrix, int x, int y, float value); -void iron_matrix4x4_transpose(iron_matrix4x4_t *matrix); -iron_matrix4x4_t iron_matrix4x4_multiply(iron_matrix4x4_t *a, iron_matrix4x4_t *b); - -void iron_color_components(uint32_t color, float *red, float *green, float *blue, float *alpha); - -void iron_random_init(int64_t seed); -int64_t iron_random_get(void); -int64_t iron_random_get_max(int64_t max); -int64_t iron_random_get_in(int64_t min, int64_t max); +} mat4_t; +void iron_color_components(uint32_t color, float *red, float *green, float *blue, float *alpha); +void iron_random_init(int64_t seed); +int64_t iron_random_get(void); +int64_t iron_random_get_max(int64_t max); +int64_t iron_random_get_in(int64_t min, int64_t max); uint32_t iron_hash_djb2(unsigned char *str); + +vec2_t vec2_create(float x, float y); +float vec2_len(vec2_t v); +vec2_t vec2_set_len(vec2_t v, float length); +vec2_t vec2_mult(vec2_t a, float f); +vec2_t vec2_add(vec2_t a, vec2_t b); +vec2_t vec2_sub(vec2_t a, vec2_t b); +float vec2_cross(vec2_t a, vec2_t b); +vec2_t vec2_norm(vec2_t v); +float vec2_dot(vec2_t a, vec2_t b); +vec2_t vec2_nan(); +bool vec2_isnan(vec2_t v); + +vec4_t vec4_create(float x, float y, float z, float w); +vec4_t vec4_cross(vec4_t a, vec4_t b); +vec4_t vec4_add(vec4_t a, vec4_t b); +vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w); +vec4_t vec4_norm(vec4_t a); +vec4_t vec4_mult(vec4_t v, float f); +float vec4_dot(vec4_t a, vec4_t b); +vec4_t vec4_clone(vec4_t v); +vec4_t vec4_lerp(vec4_t from, vec4_t to, float s); +vec4_t vec4_apply_proj(vec4_t a, mat4_t m); +vec4_t vec4_apply_mat(vec4_t a, mat4_t m); +vec4_t vec4_apply_mat4(vec4_t a, mat4_t m); +vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle); +vec4_t vec4_apply_quat(vec4_t a, quat_t q); +bool vec4_equals(vec4_t a, vec4_t b); +bool vec4_almost_equals(vec4_t a, vec4_t b, float prec); +float vec4_len(vec4_t a); +vec4_t vec4_sub(vec4_t a, vec4_t b); +vec4_t vec4_exp(vec4_t a); +float vec4_dist(vec4_t v1, vec4_t v2); +float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z); +vec4_t vec4_reflect(vec4_t a, vec4_t n); +vec4_t vec4_clamp(vec4_t a, float min, float max); +vec4_t vec4_x_axis(); +vec4_t vec4_y_axis(); +vec4_t vec4_z_axis(); +vec4_t vec4_nan(); +bool vec4_isnan(vec4_t v); + +quat_t quat_create(float x, float y, float z, float w); +quat_t quat_from_axis_angle(vec4_t axis, float angle); +quat_t quat_from_mat(mat4_t m); +quat_t quat_from_rot_mat(mat4_t m); +quat_t quat_mult(quat_t a, quat_t b); +quat_t quat_norm(quat_t q); +quat_t quat_clone(quat_t q); +vec4_t quat_get_euler(quat_t q); +quat_t quat_from_euler(float x, float y, float z); +quat_t quat_lerp(quat_t from, quat_t to, float s); +float quat_dot(quat_t a, quat_t b); +quat_t quat_from_to(vec4_t v0, vec4_t v1); +quat_t quat_inv(quat_t q); + +mat3_t mat3_create(float _00, float _10, float _20, float _01, float _11, float _21, float _02, float _12, float _22); +mat3_t mat3_identity(); +mat3_t mat3_translation(float x, float y); +mat3_t mat3_rotation(float alpha); +mat3_t mat3_scale(mat3_t m, vec4_t v); +mat3_t mat3_set_from4(mat4_t m4); +mat3_t mat3_multmat(mat3_t a, mat3_t b); +mat3_t mat3_transpose(mat3_t m); +mat3_t mat3_nan(); +bool mat3_isnan(mat3_t m); + +typedef struct mat4_decomposed { + vec4_t loc; + quat_t rot; + vec4_t scl; +} mat4_decomposed_t; + +mat4_t mat4_create(float _00, float _10, float _20, float _30, float _01, float _11, float _21, float _31, float _02, float _12, float _22, float _32, + float _03, float _13, float _23, float _33); +mat4_t mat4_identity(); +mat4_t mat4_from_f32_array(f32_array_t *a, int offset); +mat4_t mat4_persp(float fov_y, float aspect, float zn, float zf); +mat4_t mat4_ortho(float left, float right, float bottom, float top, float znear, float zfar); +mat4_t mat4_rot_z(float alpha); +mat4_t mat4_compose(vec4_t loc, quat_t rot, vec4_t scl); +mat4_decomposed_t *mat4_decompose(mat4_t m); +mat4_t mat4_set_loc(mat4_t m, vec4_t v); +mat4_t mat4_from_quat(quat_t q); +mat4_t mat4_init_translate(float x, float y, float z); +mat4_t mat4_translate(mat4_t m, float x, float y, float z); +mat4_t mat4_scale(mat4_t m, vec4_t v); +mat4_t mat4_mult_mat3x4(mat4_t a, mat4_t b); +mat4_t mat4_mult_mat(mat4_t a, mat4_t b); +mat4_t mat4_inv(mat4_t a); +mat4_t mat4_transpose(mat4_t m); +mat4_t mat4_transpose3(mat4_t m); +mat4_t mat4_clone(mat4_t m); +vec4_t mat4_get_loc(mat4_t m); +vec4_t mat4_get_scale(mat4_t m); +mat4_t mat4_mult(mat4_t m, float s); +mat4_t mat4_to_rot(mat4_t m); +vec4_t mat4_right(mat4_t m); +vec4_t mat4_look(mat4_t m); +vec4_t mat4_up(mat4_t m); +f32_array_t *mat4_to_f32_array(mat4_t m); +float mat4_cofactor(float m0, float m1, float m2, float m3, float m4, float m5, float m6, float m7, float m8); +float mat4_determinant(mat4_t m); +mat4_t mat4_nan(); +bool mat4_isnan(mat4_t m); + +#define mat4nan (mat4_nan()) diff --git a/base/sources/iron_obj.c b/base/sources/iron_obj.c index db62f3f4..228b3233 100644 --- a/base/sources/iron_obj.c +++ b/base/sources/iron_obj.c @@ -3,7 +3,7 @@ #include "iron_array.h" #include "iron_gc.h" #include "iron_string.h" -#include "iron_vec4.h" +#include "iron_math.h" #include #include #include @@ -205,9 +205,9 @@ static bool pnpoly(float v0x, float v0y, float v1x, float v1y, float v2x, float return c; } -static iron_vector4_t calc_normal(iron_vector4_t a, iron_vector4_t b, iron_vector4_t c) { - iron_vector4_t cb = vec4_sub(c, b); - iron_vector4_t ab = vec4_sub(a, b); +static vec4_t calc_normal(vec4_t a, vec4_t b, vec4_t c) { + vec4_t cb = vec4_sub(c, b); + vec4_t ab = vec4_sub(a, b); cb = vec4_cross(cb, ab); cb = vec4_norm(cb); return cb; @@ -341,7 +341,7 @@ raw_mesh_t *obj_parse(buffer_t *file_bytes, char split_code, uint64_t start_pos, nz = nor_temp.buffer[(na[0] - _nind_off) * 3 + 2]; } else { - iron_vector4_t n = calc_normal(vec4_create(pos_temp.buffer[(va[0] - _vind_off) * 3], pos_temp.buffer[(va[0] - _vind_off) * 3 + 1], + vec4_t n = calc_normal(vec4_create(pos_temp.buffer[(va[0] - _vind_off) * 3], pos_temp.buffer[(va[0] - _vind_off) * 3 + 1], pos_temp.buffer[(va[0] - _vind_off) * 3 + 2], 1.0f), vec4_create(pos_temp.buffer[(va[1] - _vind_off) * 3], pos_temp.buffer[(va[1] - _vind_off) * 3 + 1], pos_temp.buffer[(va[1] - _vind_off) * 3 + 2], 1.0f), @@ -525,7 +525,7 @@ raw_mesh_t *obj_parse(buffer_t *file_bytes, char split_code, uint64_t start_pos, int i1 = part->inda->buffer[i * 3]; int i2 = part->inda->buffer[i * 3 + 1]; int i3 = part->inda->buffer[i * 3 + 2]; - iron_vector4_t n = calc_normal(vec4_create(part->posa->buffer[i1 * 4], part->posa->buffer[i1 * 4 + 1], part->posa->buffer[i1 * 4 + 2], 1.0), + vec4_t n = calc_normal(vec4_create(part->posa->buffer[i1 * 4], part->posa->buffer[i1 * 4 + 1], part->posa->buffer[i1 * 4 + 2], 1.0), vec4_create(part->posa->buffer[i2 * 4], part->posa->buffer[i2 * 4 + 1], part->posa->buffer[i2 * 4 + 2], 1.0), vec4_create(part->posa->buffer[i3 * 4], part->posa->buffer[i3 * 4 + 1], part->posa->buffer[i3 * 4 + 2], 1.0)); part->nora->buffer[i1 * 2] = (int)(n.x * 32767); diff --git a/base/sources/iron_quat.c b/base/sources/iron_quat.c deleted file mode 100644 index 3b259cac..00000000 --- a/base/sources/iron_quat.c +++ /dev/null @@ -1,185 +0,0 @@ - -#include "iron_quat.h" -#include - -#define MATH_PI 3.14159265358979323846 - -quat_t quat_create(float x, float y, float z, float w) { - quat_t q; - q.x = x; - q.y = y; - q.z = z; - q.w = w; - return q; -} - -quat_t quat_from_axis_angle(vec4_t axis, float angle) { - float s = sinf(angle * 0.5); - quat_t q; - q.x = axis.x * s; - q.y = axis.y * s; - q.z = axis.z * s; - q.w = cosf(angle * 0.5); - return quat_norm(q); -} - -quat_t quat_from_mat(mat4_t m) { - m = mat4_to_rot(m); - return quat_from_rot_mat(m); -} - -quat_t quat_from_rot_mat(mat4_t m) { - // Assumes the upper 3x3 is a pure rotation matrix - float m11 = m.m[0]; - float m12 = m.m[4]; - float m13 = m.m[8]; - float m21 = m.m[1]; - float m22 = m.m[5]; - float m23 = m.m[9]; - float m31 = m.m[2]; - float m32 = m.m[6]; - float m33 = m.m[10]; - float tr = m11 + m22 + m33; - float s = 0.0; - quat_t q; - - if (tr > 0) { - s = 0.5 / sqrtf(tr + 1.0); - q.w = 0.25 / s; - q.x = (m32 - m23) * s; - q.y = (m13 - m31) * s; - q.z = (m21 - m12) * s; - } - else if (m11 > m22 && m11 > m33) { - s = 2.0 * sqrtf(1.0 + m11 - m22 - m33); - q.w = (m32 - m23) / s; - q.x = 0.25 * s; - q.y = (m12 + m21) / s; - q.z = (m13 + m31) / s; - } - else if (m22 > m33) { - s = 2.0 * sqrtf(1.0 + m22 - m11 - m33); - q.w = (m13 - m31) / s; - q.x = (m12 + m21) / s; - q.y = 0.25 * s; - q.z = (m23 + m32) / s; - } - else { - s = 2.0 * sqrtf(1.0 + m33 - m11 - m22); - q.w = (m21 - m12) / s; - q.x = (m13 + m31) / s; - q.y = (m23 + m32) / s; - q.z = 0.25 * s; - } - return q; -} - -quat_t quat_mult(quat_t a, quat_t b) { - quat_t q; - q.x = a.x * b.w + a.w * b.x + a.y * b.z - a.z * b.y; - q.y = a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x; - q.z = a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w; - q.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z; - return q; -} - -quat_t quat_norm(quat_t q) { - float l = sqrtf(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w); - if (l == 0.0) { - q.x = 0; - q.y = 0; - q.z = 0; - q.w = 0; - } - else { - l = 1.0 / l; - q.x *= l; - q.y *= l; - q.z *= l; - q.w *= l; - } - return q; -} - -quat_t quat_clone(quat_t q) { - return q; -} - -vec4_t quat_get_euler(quat_t q) { - float a = -2 * (q.x * q.z - q.w * q.y); - float b = q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z; - float c = 2 * (q.x * q.y + q.w * q.z); - float d = -2 * (q.y * q.z - q.w * q.x); - float e = q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z; - return vec4_create(atan2f(d, e), atan2f(a, b), asinf(c), 1.0); -} - -quat_t quat_from_euler(float x, float y, float z) { - float f = x / 2; - float c1 = cosf(f); - float s1 = sinf(f); - f = y / 2; - float c2 = cosf(f); - float s2 = sinf(f); - f = z / 2; - float c3 = cosf(f); - float s3 = sinf(f); - // YZX - quat_t q; - q.x = s1 * c2 * c3 + c1 * s2 * s3; - q.y = c1 * s2 * c3 + s1 * c2 * s3; - q.z = c1 * c2 * s3 - s1 * s2 * c3; - q.w = c1 * c2 * c3 - s1 * s2 * s3; - return q; -} - -quat_t quat_lerp(quat_t from, quat_t to, float s) { - float dot = quat_dot(from, to); - if (dot < 0.0) { - from.x = -from.x; - from.y = -from.y; - from.z = -from.z; - from.w = -from.w; - } - from.x += (to.x - from.x) * s; - from.y += (to.y - from.y) * s; - from.z += (to.z - from.z) * s; - from.w += (to.w - from.w) * s; - return quat_norm(from); -} - -float quat_dot(quat_t a, quat_t b) { - return (a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w); -} - -quat_t quat_from_to(vec4_t v0, vec4_t v1) { - // Rotation formed by direction vectors - // v0 and v1 should be normalized first - float dot = vec4_dot(v0, v1); - if (dot < -0.999999) { - vec4_t a = vec4_cross(vec4_x_axis(), v0); - if (vec4_len(a) < 0.000001) { - a = vec4_cross(vec4_y_axis(), v0); - } - a = vec4_norm(a); - return quat_from_axis_angle(a, MATH_PI); - } - else if (dot > 0.999999) { - return quat_create(0, 0, 0, 1); - } - else { - vec4_t a = vec4_cross(v0, v1); - quat_t q = quat_create(a.x, a.y, a.z, 1.0 + dot); - return quat_norm(q); - } -} - -quat_t quat_inv(quat_t q) { - float l = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; - l = -1.0 / l; - q.x = q.x * l; - q.y = q.y * l; - q.z = q.z * l; - q.w = -q.w * l; - return q; -} diff --git a/base/sources/iron_quat.h b/base/sources/iron_quat.h deleted file mode 100644 index aa7fe890..00000000 --- a/base/sources/iron_quat.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "iron_mat4.h" -#include "iron_vec4.h" -#include "iron_math.h" - -quat_t quat_create(float x, float y, float z, float w); -quat_t quat_from_axis_angle(vec4_t axis, float angle); -quat_t quat_from_mat(mat4_t m); -quat_t quat_from_rot_mat(mat4_t m); -quat_t quat_mult(quat_t a, quat_t b); -quat_t quat_norm(quat_t q); -quat_t quat_clone(quat_t q); -vec4_t quat_get_euler(quat_t q); -quat_t quat_from_euler(float x, float y, float z); -quat_t quat_lerp(quat_t from, quat_t to, float s); -float quat_dot(quat_t a, quat_t b); -quat_t quat_from_to(vec4_t v0, vec4_t v1); -quat_t quat_inv(quat_t q); diff --git a/base/sources/iron_raycast.c b/base/sources/iron_raycast.c index 864e0814..261b6509 100644 --- a/base/sources/iron_raycast.c +++ b/base/sources/iron_raycast.c @@ -1,8 +1,7 @@ #include "iron_raycast.h" #include "iron_gc.h" -#include "iron_mat4.h" -#include "iron_vec4.h" +#include "iron_math.h" #include i32 sys_w(void); diff --git a/base/sources/iron_raycast.h b/base/sources/iron_raycast.h index adfc35c4..2713ef7c 100644 --- a/base/sources/iron_raycast.h +++ b/base/sources/iron_raycast.h @@ -1,7 +1,7 @@ #pragma once #include "engine.h" -#include "iron_vec4.h" +#include "iron_math.h" extern mat4_t _raycast_vp_inv; extern mat4_t _raycast_p_inv; diff --git a/base/sources/iron_shape.c b/base/sources/iron_shape.c index b7387911..62950b9d 100644 --- a/base/sources/iron_shape.c +++ b/base/sources/iron_shape.c @@ -1,8 +1,7 @@ #include "iron_shape.h" #include "iron_array.h" -#include "iron_mat4.h" -#include "iron_vec4.h" +#include "iron_math.h" gpu_shader_t *sys_get_shader(char *name); object_t *scene_get_child(char *name); @@ -36,7 +35,7 @@ gpu_pipeline_t *gpu_create_pipeline(void); void gpu_set_pipeline(gpu_pipeline_t *pipeline); void gpu_set_vertex_buffer(gpu_buffer_t *buffer); void gpu_set_index_buffer(gpu_buffer_t *buffer); -void gpu_set_matrix4(i32 location, mat4_t value); +void gpu_set_mat4(i32 location, mat4_t value); void gpu_set_float3(i32 location, f32 value1, f32 value2, f32 value3); void gpu_draw(void); void gpu_vertex_structure_add(gpu_vertex_structure_t *structure, const char *name, gpu_vertex_data_t data); @@ -258,7 +257,7 @@ void line_draw_end(void) { gpu_set_index_buffer(line_draw_index_buffer); gpu_set_pipeline(line_draw_pipeline); line_draw_vp = mat4_clone(scene_camera->vp); - gpu_set_matrix4(line_draw_vp_loc, line_draw_vp); + gpu_set_mat4(line_draw_vp_loc, line_draw_vp); gpu_set_float3(line_draw_color_loc, color_get_rb(line_draw_color) / 255.0, color_get_gb(line_draw_color) / 255.0, color_get_bb(line_draw_color) / 255.0); gpu_draw(); } @@ -293,7 +292,7 @@ void shape_draw_sphere(mat4_t mat) { line_draw_vp = mat4_scale(line_draw_vp, vec4_create(f, f, f, 0.0)); line_draw_vp = mat4_mult_mat(line_draw_vp, scene_camera->v); line_draw_vp = mat4_mult_mat(line_draw_vp, scene_camera->p); - gpu_set_matrix4(line_draw_vp_loc, line_draw_vp); + gpu_set_mat4(line_draw_vp_loc, line_draw_vp); gpu_set_float3(line_draw_color_loc, color_get_rb(line_draw_color) / 255.0, color_get_gb(line_draw_color) / 255.0, color_get_bb(line_draw_color) / 255.0); gpu_draw(); } diff --git a/base/sources/iron_shape.h b/base/sources/iron_shape.h index 1f2d63dc..dc0c57dd 100644 --- a/base/sources/iron_shape.h +++ b/base/sources/iron_shape.h @@ -2,7 +2,7 @@ #include "engine.h" #include "iron_global.h" -#include "iron_vec4.h" +#include "iron_math.h" extern i32 line_draw_color; extern f32 line_draw_strength; diff --git a/base/sources/iron_vec2.c b/base/sources/iron_vec2.c deleted file mode 100644 index c89ad9cd..00000000 --- a/base/sources/iron_vec2.c +++ /dev/null @@ -1,72 +0,0 @@ -#include "iron_vec2.h" - -#include "iron_math.h" -#include - -vec2_t vec2_create(float x, float y) { - vec2_t v; - v.x = x; - v.y = y; - return v; -} - -float vec2_len(vec2_t v) { - return sqrtf(v.x * v.x + v.y * v.y); -} - -vec2_t vec2_set_len(vec2_t v, float length) { - float current_length = vec2_len(v); - if (current_length == 0) { - return v; - } - float mul = length / current_length; - v.x *= mul; - v.y *= mul; - return v; -} - -vec2_t vec2_mult(vec2_t v, float f) { - v.x *= f; - v.y *= f; - return v; -} - -vec2_t vec2_add(vec2_t a, vec2_t b) { - a.x += b.x; - a.y += b.y; - return a; -} - -vec2_t vec2_sub(vec2_t a, vec2_t b) { - a.x -= b.x; - a.y -= b.y; - return a; -} - -float vec2_cross(vec2_t a, vec2_t b) { - return a.x * b.y - a.y * b.x; -} - -vec2_t vec2_norm(vec2_t v) { - float n = vec2_len(v); - if (n > 0.0) { - float inv_n = 1.0f / n; - v.x *= inv_n; - v.y *= inv_n; - } - return v; -} - -float vec2_dot(vec2_t a, vec2_t b) { - return a.x * b.x + a.y * b.y; -} - -vec2_t vec2_nan() { - vec2_t v; - v.x = NAN; - return v; -} - -bool vec2_isnan(vec2_t v) { - return isnan(v.x); -} diff --git a/base/sources/iron_vec2.h b/base/sources/iron_vec2.h deleted file mode 100644 index dc10b490..00000000 --- a/base/sources/iron_vec2.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "iron_vec4.h" -#include "iron_math.h" - -vec2_t vec2_create(float x, float y); -float vec2_len(vec2_t v); -vec2_t vec2_set_len(vec2_t v, float length); -vec2_t vec2_mult(vec2_t a, float f); -vec2_t vec2_add(vec2_t a, vec2_t b); -vec2_t vec2_sub(vec2_t a, vec2_t b); -float vec2_cross(vec2_t a, vec2_t b); -vec2_t vec2_norm(vec2_t v); -float vec2_dot(vec2_t a, vec2_t b); -vec2_t vec2_nan(); -bool vec2_isnan(vec2_t v); diff --git a/base/sources/iron_vec3.c b/base/sources/iron_vec3.c deleted file mode 100644 index 049675ff..00000000 --- a/base/sources/iron_vec3.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "iron_vec3.h" - -#include "iron_math.h" -#include diff --git a/base/sources/iron_vec3.h b/base/sources/iron_vec3.h deleted file mode 100644 index 07f6190f..00000000 --- a/base/sources/iron_vec3.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "iron_math.h" diff --git a/base/sources/iron_vec4.c b/base/sources/iron_vec4.c deleted file mode 100644 index 38f0f716..00000000 --- a/base/sources/iron_vec4.c +++ /dev/null @@ -1,194 +0,0 @@ -#include "iron_vec4.h" -#include "iron_quat.h" - -#include "iron_math.h" -#include - -vec4_t vec4_create(float x, float y, float z, float w) { - vec4_t v; - v.x = x; - v.y = y; - v.z = z; - v.w = w; - return v; -} - -vec4_t vec4_cross(vec4_t a, vec4_t b) { - vec4_t v; - v.x = a.y * b.z - a.z * b.y; - v.y = a.z * b.x - a.x * b.z; - v.z = a.x * b.y - a.y * b.x; - return v; -} - -vec4_t vec4_add(vec4_t a, vec4_t b) { - a.x += b.x; - a.y += b.y; - a.z += b.z; - a.w += b.w; - return a; -} - -vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w) { - a.x += x; - a.y += y; - a.z += z; - a.w += w; - return a; -} - -vec4_t vec4_norm(vec4_t a) { - float n = vec4_len(a); - if (n > 0.0) { - float inv_n = 1.0f / n; - a.x *= inv_n; - a.y *= inv_n; - a.z *= inv_n; - } - return a; -} - -vec4_t vec4_mult(vec4_t a, float f) { - a.x *= f; - a.y *= f; - a.z *= f; - a.w *= f; - return a; -} - -float vec4_dot(vec4_t a, vec4_t b) { - return a.x * b.x + a.y * b.y + a.z * b.z; -} - -vec4_t vec4_clone(vec4_t v) { - return v; -} - -vec4_t vec4_lerp(vec4_t from, vec4_t to, float s) { - vec4_t v; - v.x = from.x + (to.x - from.x) * s; - v.y = from.y + (to.y - from.y) * s; - v.z = from.z + (to.z - from.z) * s; - return v; -} - -vec4_t vec4_apply_proj(vec4_t a, mat4_t m) { - vec4_t v; - float d = 1.0 / (m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15]); // Perspective divide - v.x = (m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]) * d; - v.y = (m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]) * d; - v.z = (m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]) * d; - return v; -} - -vec4_t vec4_apply_mat(vec4_t a, mat4_t m) { - vec4_t v; - v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12]; - v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13]; - v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14]; - return v; -} - -vec4_t vec4_apply_mat4(vec4_t a, mat4_t m) { - vec4_t v; - v.x = m.m[0] * a.x + m.m[4] * a.y + m.m[8] * a.z + m.m[12] * a.w; - v.y = m.m[1] * a.x + m.m[5] * a.y + m.m[9] * a.z + m.m[13] * a.w; - v.z = m.m[2] * a.x + m.m[6] * a.y + m.m[10] * a.z + m.m[14] * a.w; - v.w = m.m[3] * a.x + m.m[7] * a.y + m.m[11] * a.z + m.m[15] * a.w; - return v; -} - -vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle) { - quat_t q = quat_from_axis_angle(axis, angle); - return vec4_apply_quat(a, q); -} - -vec4_t vec4_apply_quat(vec4_t a, quat_t q) { - vec4_t v; - float ix = q.w * a.x + q.y * a.z - q.z * a.y; - float iy = q.w * a.y + q.z * a.x - q.x * a.z; - float iz = q.w * a.z + q.x * a.y - q.y * a.x; - float iw = -q.x * a.x - q.y * a.y - q.z * a.z; - v.x = ix * q.w + iw * -q.x + iy * -q.z - iz * -q.y; - v.y = iy * q.w + iw * -q.y + iz * -q.x - ix * -q.z; - v.z = iz * q.w + iw * -q.z + ix * -q.y - iy * -q.x; - return v; -} - -bool vec4_equals(vec4_t a, vec4_t b) { - return a.x == b.x && a.y == b.y && a.z == b.z; -} - -bool vec4_almost_equals(vec4_t a, vec4_t b, float prec) { - return fabs(a.x - b.x) < prec && fabs(a.y - b.y) < prec && fabs(a.z - b.z) < prec; -} - -float vec4_len(vec4_t a) { - return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z); -} - -vec4_t vec4_sub(vec4_t a, vec4_t b) { - a.x -= b.x; - a.y -= b.y; - a.z -= b.z; - return a; -} - -vec4_t vec4_exp(vec4_t a) { - a.x = expf(a.x); - a.y = expf(a.y); - a.z = expf(a.z); - return a; -} - -float vec4_dist(vec4_t v1, vec4_t v2) { - return vec4_fdist(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z); -} - -float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z) { - float vx = v1x - v2x; - float vy = v1y - v2y; - float vz = v1z - v2z; - return sqrtf(vx * vx + vy * vy + vz * vz); -} - -vec4_t vec4_reflect(vec4_t a, vec4_t n) { - float d = 2 * vec4_dot(a, n); - a.x -= d * n.x; - a.y -= d * n.y; - a.z -= d * n.z; - return a; -} - -vec4_t vec4_clamp(vec4_t a, float min, float max) { - float l = vec4_len(a); - if (l < min) { - return vec4_mult(vec4_norm(a), min); - } - else if (l > max) { - return vec4_mult(vec4_norm(a), max); - } - return a; -} - -vec4_t vec4_x_axis() { - return vec4_create(1.0, 0.0, 0.0, 1.0); -} - -vec4_t vec4_y_axis() { - return vec4_create(0.0, 1.0, 0.0, 1.0); -} - -vec4_t vec4_z_axis() { - return vec4_create(0.0, 0.0, 1.0, 1.0); -} - -vec4_t vec4_nan() { - vec4_t v; - v.x = NAN; - return v; -} - -bool vec4_isnan(vec4_t v) { - return isnan(v.x); -} diff --git a/base/sources/iron_vec4.h b/base/sources/iron_vec4.h deleted file mode 100644 index e254f508..00000000 --- a/base/sources/iron_vec4.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#define mat4_t iron_matrix4x4_t -#define mat3_t iron_matrix3x3_t -#define quat_t iron_quaternion_t -#define vec4_t iron_vector4_t -#define vec3_t iron_vector3_t -#define vec2_t iron_vector2_t - -#include "iron_mat4.h" -#include "iron_math.h" - -vec4_t vec4_create(float x, float y, float z, float w); -vec4_t vec4_cross(vec4_t a, vec4_t b); -vec4_t vec4_add(vec4_t a, vec4_t b); -vec4_t vec4_fadd(vec4_t a, float x, float y, float z, float w); -vec4_t vec4_norm(vec4_t a); -vec4_t vec4_mult(vec4_t v, float f); -float vec4_dot(vec4_t a, vec4_t b); -vec4_t vec4_clone(vec4_t v); -vec4_t vec4_lerp(vec4_t from, vec4_t to, float s); -vec4_t vec4_apply_proj(vec4_t a, mat4_t m); -vec4_t vec4_apply_mat(vec4_t a, mat4_t m); -vec4_t vec4_apply_mat4(vec4_t a, mat4_t m); -vec4_t vec4_apply_axis_angle(vec4_t a, vec4_t axis, float angle); -vec4_t vec4_apply_quat(vec4_t a, quat_t q); -bool vec4_equals(vec4_t a, vec4_t b); -bool vec4_almost_equals(vec4_t a, vec4_t b, float prec); -float vec4_len(vec4_t a); -vec4_t vec4_sub(vec4_t a, vec4_t b); -vec4_t vec4_exp(vec4_t a); -float vec4_dist(vec4_t v1, vec4_t v2); -float vec4_fdist(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z); -vec4_t vec4_reflect(vec4_t a, vec4_t n); -vec4_t vec4_clamp(vec4_t a, float min, float max); -vec4_t vec4_x_axis(); -vec4_t vec4_y_axis(); -vec4_t vec4_z_axis(); -vec4_t vec4_nan(); -bool vec4_isnan(vec4_t v); diff --git a/base/sources/libs/asim.h b/base/sources/libs/asim.h index 2cabe58a..4ba643b8 100644 --- a/base/sources/libs/asim.h +++ b/base/sources/libs/asim.h @@ -1,8 +1,7 @@ #pragma once #include -#include -#include +#include typedef struct physics_pair { float pos_a_x; diff --git a/base/sources/plugins/plugin_api.c b/base/sources/plugins/plugin_api.c index e2092bc3..697edcf7 100644 --- a/base/sources/plugins/plugin_api.c +++ b/base/sources/plugins/plugin_api.c @@ -3,11 +3,10 @@ #include "iron_armpack.h" #include "iron_array.h" #include "iron_map.h" -#include "iron_mat4.h" +#include "iron_math.h" #include "iron_obj.h" #include "iron_ui.h" #include "iron_ui_nodes.h" -#include "iron_vec4.h" void plugin_embed(); diff --git a/paint/sources/render_path_paint.c b/paint/sources/render_path_paint.c index 5b1d2601..da036fb0 100644 --- a/paint/sources/render_path_paint.c +++ b/paint/sources/render_path_paint.c @@ -458,9 +458,9 @@ void render_path_paint_draw_cursor(f32 mx, f32 my, f32 radius, f32 tint_r, f32 t vec4_t right = vec4_norm(camera_object_right_world(scene_camera)); gpu_set_float3(pipes_cursor_camera_right, right.x, right.y, right.z); gpu_set_float3(pipes_cursor_tint, tint_r, tint_g, tint_b); - gpu_set_matrix4(pipes_cursor_vp, scene_camera->vp); + gpu_set_mat4(pipes_cursor_vp, scene_camera->vp); mat4_t inv_vp = mat4_inv(scene_camera->vp); - gpu_set_matrix4(pipes_cursor_inv_vp, inv_vp); + gpu_set_mat4(pipes_cursor_inv_vp, inv_vp); gpu_set_vertex_buffer(geom->_->vertex_buffer); gpu_set_index_buffer(geom->_->index_buffer); gpu_draw();