diff --git a/src/core/core_math.gen.c b/src/core/core_math.gen.c index 5b5e855..34edc1d 100644 --- a/src/core/core_math.gen.c +++ b/src/core/core_math.gen.c @@ -239,22 +239,22 @@ fn_inline r3i64_t r3i64_mul(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 * b.x fn_inline r3i64_t r3i64_muls(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 * b, a.y0 * b, a.z0 * b, a.x1 * b, a.y1 * b, a.z1 * b }; } fn_inline r3i64_t r3i64_div(r3i64_t a, r3i64_t b) { return (r3i64_t){ a.x0 / b.x0, a.y0 / b.y0, a.z0 / b.z0, a.x1 / b.x1, a.y1 / b.y1, a.z1 / b.z1 }; } fn_inline r3i64_t r3i64_divs(r3i64_t a, i64 b) { return (r3i64_t){ a.x0 / b, a.y0 / b, a.z0 / b, a.x1 / b, a.y1 / b, a.z1 / b }; } -fn_inline r2f32_t r2f32_mindim(v2f32_t pos, v2f32_t size) { return (r2f32_t){ pos, v2f32_add(pos, size) }; } -fn_inline r2f32_t r2f32_center_halfdim(v2f32_t center, v2f32_t halfdim) { return (r2f32_t){ v2f32_sub(center, halfdim), v2f32_add(center, halfdim) }; } -fn_inline r3f32_t r3f32_mindim(v3f32_t pos, v3f32_t size) { return (r3f32_t){ pos, v3f32_add(pos, size) }; } -fn_inline r3f32_t r3f32_center_halfdim(v3f32_t center, v3f32_t halfdim) { return (r3f32_t){ v3f32_sub(center, halfdim), v3f32_add(center, halfdim) }; } -fn_inline r2f64_t r2f64_mindim(v2f64_t pos, v2f64_t size) { return (r2f64_t){ pos, v2f64_add(pos, size) }; } -fn_inline r2f64_t r2f64_center_halfdim(v2f64_t center, v2f64_t halfdim) { return (r2f64_t){ v2f64_sub(center, halfdim), v2f64_add(center, halfdim) }; } -fn_inline r3f64_t r3f64_mindim(v3f64_t pos, v3f64_t size) { return (r3f64_t){ pos, v3f64_add(pos, size) }; } -fn_inline r3f64_t r3f64_center_halfdim(v3f64_t center, v3f64_t halfdim) { return (r3f64_t){ v3f64_sub(center, halfdim), v3f64_add(center, halfdim) }; } -fn_inline r2i32_t r2i32_mindim(v2i32_t pos, v2i32_t size) { return (r2i32_t){ pos, v2i32_add(pos, size) }; } -fn_inline r2i32_t r2i32_center_halfdim(v2i32_t center, v2i32_t halfdim) { return (r2i32_t){ v2i32_sub(center, halfdim), v2i32_add(center, halfdim) }; } -fn_inline r3i32_t r3i32_mindim(v3i32_t pos, v3i32_t size) { return (r3i32_t){ pos, v3i32_add(pos, size) }; } -fn_inline r3i32_t r3i32_center_halfdim(v3i32_t center, v3i32_t halfdim) { return (r3i32_t){ v3i32_sub(center, halfdim), v3i32_add(center, halfdim) }; } -fn_inline r2i64_t r2i64_mindim(v2i64_t pos, v2i64_t size) { return (r2i64_t){ pos, v2i64_add(pos, size) }; } -fn_inline r2i64_t r2i64_center_halfdim(v2i64_t center, v2i64_t halfdim) { return (r2i64_t){ v2i64_sub(center, halfdim), v2i64_add(center, halfdim) }; } -fn_inline r3i64_t r3i64_mindim(v3i64_t pos, v3i64_t size) { return (r3i64_t){ pos, v3i64_add(pos, size) }; } -fn_inline r3i64_t r3i64_center_halfdim(v3i64_t center, v3i64_t halfdim) { return (r3i64_t){ v3i64_sub(center, halfdim), v3i64_add(center, halfdim) }; } +fn_inline r2f32_t r2f32_min_dim(v2f32_t pos, v2f32_t size) { return (r2f32_t){ pos, v2f32_add(pos, size) }; } +fn_inline r2f32_t r2f32_center_half_dim(v2f32_t center, v2f32_t halfdim) { return (r2f32_t){ v2f32_sub(center, halfdim), v2f32_add(center, halfdim) }; } +fn_inline r3f32_t r3f32_min_dim(v3f32_t pos, v3f32_t size) { return (r3f32_t){ pos, v3f32_add(pos, size) }; } +fn_inline r3f32_t r3f32_center_half_dim(v3f32_t center, v3f32_t halfdim) { return (r3f32_t){ v3f32_sub(center, halfdim), v3f32_add(center, halfdim) }; } +fn_inline r2f64_t r2f64_min_dim(v2f64_t pos, v2f64_t size) { return (r2f64_t){ pos, v2f64_add(pos, size) }; } +fn_inline r2f64_t r2f64_center_half_dim(v2f64_t center, v2f64_t halfdim) { return (r2f64_t){ v2f64_sub(center, halfdim), v2f64_add(center, halfdim) }; } +fn_inline r3f64_t r3f64_min_dim(v3f64_t pos, v3f64_t size) { return (r3f64_t){ pos, v3f64_add(pos, size) }; } +fn_inline r3f64_t r3f64_center_half_dim(v3f64_t center, v3f64_t halfdim) { return (r3f64_t){ v3f64_sub(center, halfdim), v3f64_add(center, halfdim) }; } +fn_inline r2i32_t r2i32_min_dim(v2i32_t pos, v2i32_t size) { return (r2i32_t){ pos, v2i32_add(pos, size) }; } +fn_inline r2i32_t r2i32_center_half_dim(v2i32_t center, v2i32_t halfdim) { return (r2i32_t){ v2i32_sub(center, halfdim), v2i32_add(center, halfdim) }; } +fn_inline r3i32_t r3i32_min_dim(v3i32_t pos, v3i32_t size) { return (r3i32_t){ pos, v3i32_add(pos, size) }; } +fn_inline r3i32_t r3i32_center_half_dim(v3i32_t center, v3i32_t halfdim) { return (r3i32_t){ v3i32_sub(center, halfdim), v3i32_add(center, halfdim) }; } +fn_inline r2i64_t r2i64_min_dim(v2i64_t pos, v2i64_t size) { return (r2i64_t){ pos, v2i64_add(pos, size) }; } +fn_inline r2i64_t r2i64_center_half_dim(v2i64_t center, v2i64_t halfdim) { return (r2i64_t){ v2i64_sub(center, halfdim), v2i64_add(center, halfdim) }; } +fn_inline r3i64_t r3i64_min_dim(v3i64_t pos, v3i64_t size) { return (r3i64_t){ pos, v3i64_add(pos, size) }; } +fn_inline r3i64_t r3i64_center_half_dim(v3i64_t center, v3i64_t halfdim) { return (r3i64_t){ v3i64_sub(center, halfdim), v3i64_add(center, halfdim) }; } fn r2f32_t r2f32_cut_left(r2f32_t *r, f32 value) { f32 minx = r->min.x; @@ -374,6 +374,22 @@ fn_inline v2f32_t r2f32_get_mid(r2f32_t r) { return v2f32_add(r.min, v2f32_divs( fn_inline b32 r2f32_contains(r2f32_t rec, v2f32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } fn_inline r2f32_t r2f32_intersect(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } fn_inline r2f32_t r2f32_union(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f32 r1f32_size(r1f32_t a) { return a.max - a.min; } +fn_inline r1f32_t r1f32(f32 min, f32 max) { return (r1f32_t){min,max}; } +fn_inline r1f32_t r1f32_auto(f32 a, f32 b) { return (r1f32_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f32_t r1f32s(f32 a) { return (r1f32_t){a,a}; } +fn_inline r1f32_t r1f32_clamp(r1f32_t a, f32 min, f32 max) { return (r1f32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +gb_read_only r1f32_t r1f32_null; + +fn v2f32_t v2f32_clamps(v2f32_t v, f32 min, f32 max) { + v2f32_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f32_t v2f32_clamp(v2f32_t v, v2f32_t min, v2f32_t max) { + v2f32_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} fn r2f64_t r2f64_cut_left(r2f64_t *r, f64 value) { @@ -494,6 +510,22 @@ fn_inline v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs( fn_inline b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } fn_inline r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } fn_inline r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f64 r1f64_size(r1f64_t a) { return a.max - a.min; } +fn_inline r1f64_t r1f64(f64 min, f64 max) { return (r1f64_t){min,max}; } +fn_inline r1f64_t r1f64_auto(f64 a, f64 b) { return (r1f64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f64_t r1f64s(f64 a) { return (r1f64_t){a,a}; } +fn_inline r1f64_t r1f64_clamp(r1f64_t a, f64 min, f64 max) { return (r1f64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +gb_read_only r1f64_t r1f64_null; + +fn v2f64_t v2f64_clamps(v2f64_t v, f64 min, f64 max) { + v2f64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f64_t v2f64_clamp(v2f64_t v, v2f64_t min, v2f64_t max) { + v2f64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} fn r2i32_t r2i32_cut_left(r2i32_t *r, i32 value) { @@ -614,6 +646,22 @@ fn_inline v2i32_t r2i32_get_mid(r2i32_t r) { return v2i32_add(r.min, v2i32_divs( fn_inline b32 r2i32_contains(r2i32_t rec, v2i32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } fn_inline r2i32_t r2i32_intersect(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } fn_inline r2i32_t r2i32_union(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline i32 r1i32_size(r1i32_t a) { return a.max - a.min; } +fn_inline r1i32_t r1i32(i32 min, i32 max) { return (r1i32_t){min,max}; } +fn_inline r1i32_t r1i32_auto(i32 a, i32 b) { return (r1i32_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1i32_t r1i32s(i32 a) { return (r1i32_t){a,a}; } +fn_inline r1i32_t r1i32_clamp(r1i32_t a, i32 min, i32 max) { return (r1i32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +gb_read_only r1i32_t r1i32_null; + +fn v2i32_t v2i32_clamps(v2i32_t v, i32 min, i32 max) { + v2i32_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2i32_t v2i32_clamp(v2i32_t v, v2i32_t min, v2i32_t max) { + v2i32_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} fn r2i64_t r2i64_cut_left(r2i64_t *r, i64 value) { @@ -734,6 +782,22 @@ fn_inline v2i64_t r2i64_get_mid(r2i64_t r) { return v2i64_add(r.min, v2i64_divs( fn_inline b32 r2i64_contains(r2i64_t rec, v2i64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } fn_inline r2i64_t r2i64_intersect(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } fn_inline r2i64_t r2i64_union(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline i64 r1i64_size(r1i64_t a) { return a.max - a.min; } +fn_inline r1i64_t r1i64(i64 min, i64 max) { return (r1i64_t){min,max}; } +fn_inline r1i64_t r1i64_auto(i64 a, i64 b) { return (r1i64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1i64_t r1i64s(i64 a) { return (r1i64_t){a,a}; } +fn_inline r1i64_t r1i64_clamp(r1i64_t a, i64 min, i64 max) { return (r1i64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +gb_read_only r1i64_t r1i64_null; + +fn v2i64_t v2i64_clamps(v2i64_t v, i64 min, i64 max) { + v2i64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2i64_t v2i64_clamp(v2i64_t v, v2i64_t min, v2i64_t max) { + v2i64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} fn_inline v2f64_t v2f32_to_v2f64(v2f32_t v) { return (v2f64_t){ (f64)v.x, (f64)v.y }; } fn_inline v3f64_t v3f32_to_v3f64(v3f32_t v) { return (v3f64_t){ (f64)v.x, (f64)v.y, (f64)v.z }; } @@ -811,27 +875,3 @@ fn_inline r2i64_t r2i64_add_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i6 fn_inline r2i64_t r2i64_sub_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_sub(a.min, b), v2i64_sub(a.max, b) }; } fn_inline r2i64_t r2i64_mul_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_mul(a.min, b), v2i64_mul(a.max, b) }; } fn_inline r2i64_t r2i64_div_v2i64(r2i64_t a, v2i64_t b) { return (r2i64_t){ v2i64_div(a.min, b), v2i64_div(a.max, b) }; } -fn_inline f32 r1f32_size(r1f32_t a) { return a.max - a.min; } -fn_inline r1f32_t r1f32(f32 min, f32 max) { return (r1f32_t){min,max}; } -fn_inline r1f32_t r1f32_auto(f32 a, f32 b) { return (r1f32_t){MIN(a,b),MAX(a,b)}; } -fn_inline r1f32_t r1f32s(f32 a) { return (r1f32_t){a,a}; } -fn_inline r1f32_t r1f32_clamp(r1f32_t a, f32 min, f32 max) { return (r1f32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } -gb_read_only r1f32_t r1f32_null; -fn_inline f64 r1f64_size(r1f64_t a) { return a.max - a.min; } -fn_inline r1f64_t r1f64(f64 min, f64 max) { return (r1f64_t){min,max}; } -fn_inline r1f64_t r1f64_auto(f64 a, f64 b) { return (r1f64_t){MIN(a,b),MAX(a,b)}; } -fn_inline r1f64_t r1f64s(f64 a) { return (r1f64_t){a,a}; } -fn_inline r1f64_t r1f64_clamp(r1f64_t a, f64 min, f64 max) { return (r1f64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } -gb_read_only r1f64_t r1f64_null; -fn_inline i32 r1i32_size(r1i32_t a) { return a.max - a.min; } -fn_inline r1i32_t r1i32(i32 min, i32 max) { return (r1i32_t){min,max}; } -fn_inline r1i32_t r1i32_auto(i32 a, i32 b) { return (r1i32_t){MIN(a,b),MAX(a,b)}; } -fn_inline r1i32_t r1i32s(i32 a) { return (r1i32_t){a,a}; } -fn_inline r1i32_t r1i32_clamp(r1i32_t a, i32 min, i32 max) { return (r1i32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } -gb_read_only r1i32_t r1i32_null; -fn_inline i64 r1i64_size(r1i64_t a) { return a.max - a.min; } -fn_inline r1i64_t r1i64(i64 min, i64 max) { return (r1i64_t){min,max}; } -fn_inline r1i64_t r1i64_auto(i64 a, i64 b) { return (r1i64_t){MIN(a,b),MAX(a,b)}; } -fn_inline r1i64_t r1i64s(i64 a) { return (r1i64_t){a,a}; } -fn_inline r1i64_t r1i64_clamp(r1i64_t a, i64 min, i64 max) { return (r1i64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } -gb_read_only r1i64_t r1i64_null; diff --git a/src/core/core_math_gen.py b/src/core/core_math_gen.py index eb93a24..775f425 100644 --- a/src/core/core_math_gen.py +++ b/src/core/core_math_gen.py @@ -199,8 +199,8 @@ for basic_type in basic_types: rect_name = rect_type[name_idx] + basic_type rect_members = rect_type[member_idx] - print(f"fn_inline {rect_name}_t {rect_name}_mindim({vec_name}_t pos, {vec_name}_t size) {{ return ({rect_name}_t){{ pos, {vec_name}_add(pos, size) }}; }}") - print(f"fn_inline {rect_name}_t {rect_name}_center_halfdim({vec_name}_t center, {vec_name}_t halfdim) {{ return ({rect_name}_t){{ {vec_name}_sub(center, halfdim), {vec_name}_add(center, halfdim) }}; }}") + print(f"fn_inline {rect_name}_t {rect_name}_min_dim({vec_name}_t pos, {vec_name}_t size) {{ return ({rect_name}_t){{ pos, {vec_name}_add(pos, size) }}; }}") + print(f"fn_inline {rect_name}_t {rect_name}_center_half_dim({vec_name}_t center, {vec_name}_t halfdim) {{ return ({rect_name}_t){{ {vec_name}_sub(center, halfdim), {vec_name}_add(center, halfdim) }}; }}") for basic_type in basic_types: s = """ @@ -322,10 +322,24 @@ fn_inline v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs( fn_inline b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } fn_inline r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } fn_inline r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + +fn_inline f64 r1f64_size(r1f64_t a) { return a.max - a.min; } +fn_inline r1f64_t r1f64(f64 min, f64 max) { return (r1f64_t){min,max}; } +fn_inline r1f64_t r1f64_auto(f64 a, f64 b) { return (r1f64_t){MIN(a,b),MAX(a,b)}; } +fn_inline r1f64_t r1f64s(f64 a) { return (r1f64_t){a,a}; } +fn_inline r1f64_t r1f64_clamp(r1f64_t a, f64 min, f64 max) { return (r1f64_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } +gb_read_only r1f64_t r1f64_null; + +fn v2f64_t v2f64_clamps(v2f64_t v, f64 min, f64 max) { + v2f64_t result = { CLAMP(v.x, min, max), CLAMP(v.y, min, max) }; + return result; +} +fn v2f64_t v2f64_clamp(v2f64_t v, v2f64_t min, v2f64_t max) { + v2f64_t result = { CLAMP(v.x, min.x, max.x), CLAMP(v.y, min.y, max.y) }; + return result; +} """ - s = s.replace("r2f64", f"r2{basic_type}") s = s.replace("f64", basic_type) - s = s.replace("v2f64", f"v2{basic_type}") print(s) for at in basic_types: @@ -360,16 +374,3 @@ fn_inline r2f64_t r2f64_sub_v2f64(r2f64_t a, v2f64_t b) { return (r2f64_t){ v2f6 print(s) -########## -# r1 type stuff -for bt in basic_types: - s = """ -fn_inline i32 r1i32_size(r1i32_t a) { return a.max - a.min; } -fn_inline r1i32_t r1i32(i32 min, i32 max) { return (r1i32_t){min,max}; } -fn_inline r1i32_t r1i32_auto(i32 a, i32 b) { return (r1i32_t){MIN(a,b),MAX(a,b)}; } -fn_inline r1i32_t r1i32s(i32 a) { return (r1i32_t){a,a}; } -fn_inline r1i32_t r1i32_clamp(r1i32_t a, i32 min, i32 max) { return (r1i32_t){ .min = CLAMP(a.min, min, max), .max = CLAMP(a.max, min, max) }; } -gb_read_only r1i32_t r1i32_null; - """.strip() - s = s.replace("i32", bt) - print(s) diff --git a/src/render/render.c b/src/render/render.c index 55d8236..36bcea2 100644 --- a/src/render/render.c +++ b/src/render/render.c @@ -96,7 +96,7 @@ fn v2f32_t rn_base_draw_string(rn_font_t *font, s8_t string, v2f32_t pos, v4f32_ for (utf8_iter_t iter = utf8_iterate_ex(string.str, (int)string.len); iter.item; utf8_advance(&iter)) { u32 codepoint = iter.item; rn_glyph_t *g = rn_get_glyph(font, codepoint); - r2f32_t rect = r2f32_mindim(v2f32_add(pos, g->offset), g->size); + r2f32_t rect = r2f32_min_dim(v2f32_add(pos, g->offset), g->size); if (draw && codepoint != '\n' && codepoint != ' ' && codepoint != '\t') { rn_push_quad(rect, g->atlas_bounding_box, color); } diff --git a/src/ui/ui.c b/src/ui/ui.c index 4f15be5..406a85b 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -204,7 +204,7 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s } if (box->flags.dont_compute_rect == false) { r2f32_t rect = ui_next_rect(ui_top_lop(), &ui->top->rect, string_size); - ui_set_rect(box, rect, ui_top_lop()); + ui_set_rect(box, rect); } box->string_pos_offset = ui_top_string_pos_offset(); return box; @@ -503,7 +503,7 @@ fn ui_signal_t ui__label_button(ui_code_loc_t loc, char *str, ...) { #define ui_label(...) ui__label(UILOC, __VA_ARGS__) fn ui_box_t *ui__label(ui_code_loc_t loc, char *str, ...) { S8_FMT(tcx->temp, str, string); - ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true }, string); + ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true, .draw_rect = true }, string); return box; } @@ -915,7 +915,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_begin_build(UILOC, ev, window_rect_from_frame(frame)); ui_box_t *top_box = ui_box0((ui_box_flags_t){.draw_rect = true, .clip_rect = true}); - ui_set_rect(top_box, r2f32_cut_top(&ui->top->rect, ui_em(1.5f)), ui_lop_cut_top); + ui_set_rect(top_box, r2f32_cut_top(&ui->top->rect, ui_em(1.5f))); ui_set_padding(ui_em(3)) ui_set_text_align(ui_text_align_center) ui_set_lop(ui_lop_cut_left) @@ -928,10 +928,10 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co if (ui_g_panel == 1) { ui_box_t *scroller_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .clip_rect = true}, "scrollbar"); - ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, 10 * frame->dpr), ui_lop_cut_right); + ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, 10 * frame->dpr)); ui_box_t *item_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .clip_rect = true}, "item_box"); - ui_set_rect(item_box, r2f32_cut_left(&ui->top->rect, ui_max), ui_lop_cut_left); + ui_set_rect(item_box, r2f32_cut_left(&ui->top->rect, ui_max)); item_box->rect = r2f32_shrinks(item_box->rect, ui_em(1)); @@ -970,8 +970,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_label("allocated boxes: %d", ui->allocated_boxes); ui_serial_type(&ui_test_event, type(app_event_t)); ui_set_id(ui_idf("a")) { - ui_serial_type(&ui_test_event, type(app_event_t)); - + ui_serial_type(&ui_test_event, type(app_event_t)); } } @@ -985,23 +984,34 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co f32 scrollable_space = (1 - scroller_size); f32 scroller_norm = scroller_value / (all_items_size); f32 scroller_percent = scroller_norm * scrollable_space; + f32 slider_box_size = scroller_size * scroller_box_size; // f32 scroller_second = scrollable_space - scroller_percent; - r2f32_cut_top(&ui->top->rect, scroller_percent * scroller_box_size); - ui_box_t *box = ui_build_box_from_id(UILOC, (ui_box_flags_t){.draw_rect = true}, ui_idf("slider")); - box->background_color = ui_color_table[ui_color_scroller]; - box->bg_hot_color = ui_color_table[ui_color_scroller_hot]; - box->bg_active_color = ui_color_table[ui_color_scroller_active]; - ui_set_rect(box, r2f32_cut_top(&ui->top->rect, scroller_size * scroller_box_size), ui_lop_cut_top); - ui_signal_t signal = ui_signal_from_box(box); + ui_box_t *upper_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "upper_box"); + ui_box_t *slider_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "slider_box"); + ui_box_t *down_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "down_box"); + ui_set_rect(upper_box, r2f32_cut_top(&ui->top->rect, scroller_percent * scroller_box_size)); + ui_set_rect(slider_box, r2f32_cut_top(&ui->top->rect, slider_box_size)); + ui_set_rect(down_box, r2f32_cut_top(&ui->top->rect, ui_max)); + slider_box->background_color = ui_color_table[ui_color_scroller]; + slider_box->bg_hot_color = ui_color_table[ui_color_scroller_hot]; + slider_box->bg_active_color = ui_color_table[ui_color_scroller_active]; + ui_signal_t signal = ui_signal_from_box(slider_box); + ui_signal_t upper_box_signal = ui_signal_from_box(upper_box); + ui_signal_t down_box_signal = ui_signal_from_box(down_box); + f32 drag = ev->mouse_delta.y; + f32 coef = (all_items_size / item_box_size) / scrollable_space; if (signal.dragging) { - scroller_value += signal.drag.y; - scroller_value = CLAMP(scroller_value, 0, all_items_size); + scroller_value += drag * coef; + } + if (upper_box_signal.clicked || down_box_signal.dragging) { + scroller_value = (ev->mouse_pos.y - upper_box->final_rect.min.y) * coef; + scroller_value -= (slider_box_size / 2) * coef; } if (ev->kind == app_event_kind_mouse_wheel) { scroller_value -= ev->mouse_wheel_delta.y; - scroller_value = CLAMP(scroller_value, 0, all_items_size); } + scroller_value = CLAMP(scroller_value, 0, all_items_size); for (ui_box_t *it = item_box->first; it; it = it->next) { ui_offset_box(it, v2f32(0, scroller_value)); @@ -1011,6 +1021,27 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co } + // ui_box_t *lister = ui_box0((ui_box_flags_t){.draw_rect = true, .clip_rect = true}); + // ui_set_top(lister) + // ui_set_lop(ui_lop_cut_top) { + // v2f32_t max_size = v2f32_sub(frame->window_size, v2f32(ui_em(2), ui_em(2))); + // v2f32_t _lister_size = v2f32(ui_em(20), ui_em(40)); + // v2f32_t lister_size = v2f32_clamp(_lister_size, v2f32_null, max_size); + // v2f32_t pos = v2f32_divs(v2f32_sub(frame->window_size, lister_size), 2.0); + // r2f32_t rect = r2f32_min_dim(pos, lister_size); + // ui_set_rect(lister, rect); + // lister->background_color.g += 100; + + // locl char buff[128]; + // locl ui_text_input_t text_input; + // if (text_input.str == NULL) { + // text_input.str = buff; + // text_input.cap = lengthof(buff); + // } + // ui_text_input(UILOC, &text_input); + + // } + ui_end_build(); } diff --git a/src/ui/ui.h b/src/ui/ui.h index 4ca9155..e5a2eb1 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -153,7 +153,7 @@ fn b32 ui_is_focused_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id #define ev_left_up(ev) ((ev)->kind == app_event_kind_mouse_up && ev_left(ev)) #define ev_left_down(ev) ((ev)->kind == app_event_kind_mouse_down && ev_left(ev)) -fn void ui_set_rect(ui_box_t *box, r2f32_t rect, ui_lop_t lop) { box->rect = box->full_rect = rect; box->lop = lop; } +fn void ui_set_rect(ui_box_t *box, r2f32_t rect) { box->rect = box->full_rect = rect; } #define UILOC (ui_code_loc_t){.file = __FILE__, .line = __LINE__, .counter = __COUNTER__} #define ui_em(x) ((x) * rn->main_font->size) diff --git a/todo.txt b/todo.txt index ffe7c2a..4be390a 100644 --- a/todo.txt +++ b/todo.txt @@ -22,12 +22,14 @@ [ ] maybe copy package stuff to build? [ ] ui - [ ] fix elements getting offset when font large and they are on the edge + [ ] debug console, lines + [x] fix elements getting offset when font large and they are on the edge [ ] text input [x] basic working [ ] ctrl backspace, ctrl delete [ ] set mouse cursor on hover [ ] everything lister (with edits etc.) + [ ] pernament storage? [ ] push pop flag [ ] how to do colors? - css like based on ids and pre built palettes