From df480e3a4488009351a46504f72ad6a023d931be Mon Sep 17 00:00:00 2001 From: jacob Date: Thu, 1 Jan 2026 17:26:17 -0600 Subject: [PATCH] pass initial tweak variable on every call --- src/base/base_tweak.c | 63 +++++++++++++++++++++++++------------ src/base/base_tweak.h | 57 ++++++++++++++++++++++++--------- src/pp/pp_vis/pp_vis_core.c | 19 +++++------ 3 files changed, 95 insertions(+), 44 deletions(-) diff --git a/src/base/base_tweak.c b/src/base/base_tweak.c index 6f4d4aed..6f1c5001 100644 --- a/src/base/base_tweak.c +++ b/src/base/base_tweak.c @@ -9,11 +9,11 @@ void BootstrapTweakVars(void) //////////////////////////////////////////////////////////// //~ Tweak var operations -String TweakEx(Arena *arena, String name, TweakDesc desc, String new_value, b32 set_to_new_value) +String TweakEx(Arena *arena, TweakVar desc, b32 update_existing) { String result = Zi; Arena *perm = PermArena(); - u64 hash = MixU64(HashFnv64(Fnv64Basis, name)); + u64 hash = MixU64(HashFnv64(Fnv64Basis, desc.name)); TweakVarEntryBin *bin = &Base.tweak.entry_bins[hash % countof(Base.tweak.entry_bins)]; LockTicketMutex(&Base.tweak.tm); { @@ -32,25 +32,28 @@ String TweakEx(Arena *arena, String name, TweakDesc desc, String new_value, b32 e->hash = hash; { // FIXME: Not perm - String store_value = PushString(perm, new_value); - + String store_name = PushString(perm, desc.name); + String store_category = PushString(perm, desc.category); + String store_value = PushString(perm, desc.value); + String store_initial = PushString(perm, desc.initial); TweakVar *v = &e->v; - v->name = PushString(perm, name); - v->desc = desc; + *v = desc; + v->name = store_name; + v->category = store_category; v->value = store_value; - v->default_value = store_value; + v->initial = store_initial; } PushAlign(perm, CachelineSize); SllQueuePushN(bin->first, bin->last, e, next_in_bin); SllQueuePushN(Base.tweak.first_entry, Base.tweak.last_entry, e, next_in_list); Base.tweak.entries_count += 1; } - else if (set_to_new_value) + else if (update_existing) { - if (!MatchString(e->v.value, new_value)) + if (!MatchString(e->v.value, desc.value)) { // FIXME: Not perm - String store_value = PushString(perm, new_value); + String store_value = PushString(perm, desc.value); // FIXME: free old value e->v.value = store_value; @@ -76,8 +79,10 @@ TweakVarArray GetAllTweakVars(Arena *arena) TweakVar *src = &e->v; TweakVar *dst = &result.v[var_idx]; *dst = *src; + dst->name = PushString(arena, src->name); + dst->category = PushString(arena, src->category); dst->value = PushString(arena, src->value); - dst->default_value = PushString(arena, src->default_value); + dst->initial = PushString(arena, src->initial); var_idx += 1; } } @@ -89,29 +94,47 @@ TweakVarArray GetAllTweakVars(Arena *arena) //////////////////////////////////////////////////////////// //~ Tweak utils -b32 TweakBool_(String name, b32 default_value) +b32 TweakBool_(String name, b32 initial, TweakBoolDesc desc) { b32 result = 0; TempArena scratch = BeginScratchNoConflict(); { - TweakDesc desc = Zi; - desc.kind = TweakKind_Bool; - String default_value_str = StringFromBool(scratch.arena, default_value); - String tweak_str = TweakEx(scratch.arena, name, desc, default_value_str, 0); + String initial_str = StringFromBool(scratch.arena, initial); + TweakVar var = Zi; + { + var.flags = desc.flags; + var.kind = TweakKind_Bool; + var.name = name; + var.category = desc.category; + var.value = initial_str; + var.initial = initial_str; + } + String tweak_str = TweakEx(scratch.arena, var, 0); result = BoolFromString(tweak_str); } EndScratch(scratch); return result; } -f64 TweakFloat_(String name, f64 default_value, TweakDesc desc) +f64 TweakFloat_(String name, f64 initial, TweakFloatDesc desc) { f64 result = 0; - desc.kind = TweakKind_Float; TempArena scratch = BeginScratchNoConflict(); { - String default_value_str = StringFromFloat(scratch.arena, default_value, desc.precision); - String tweak_str = TweakEx(scratch.arena, name, desc, default_value_str, 0); + String initial_str = StringFromFloat(scratch.arena, initial, desc.precision); + TweakVar var = Zi; + { + var.flags = desc.flags; + var.kind = TweakKind_Float; + var.name = name; + var.category = desc.category; + var.value = initial_str; + var.initial = initial_str; + var.range.min = desc.min; + var.range.max = desc.max; + var.precision = desc.precision; + } + String tweak_str = TweakEx(scratch.arena, var, 0); result = FloatFromString(tweak_str); } EndScratch(scratch); diff --git a/src/base/base_tweak.h b/src/base/base_tweak.h index 2adaf809..d75dce0f 100644 --- a/src/base/base_tweak.h +++ b/src/base/base_tweak.h @@ -7,19 +7,24 @@ Enum(TweakKind) TweakKind_Float, }; -Struct(TweakDesc) +Enum(TweakFlag) { - TweakKind kind; - RngF64 range; - i32 precision; + TweakFlag_None = 0, + TweakFlag_Hidden = (1 << 0), }; Struct(TweakVar) { + TweakKind kind; + TweakFlag flags; String name; - TweakDesc desc; + String category; + String value; - String default_value; + String initial; + + RngF64 range; + i32 precision; }; Struct(TweakVarArray) @@ -28,6 +33,24 @@ Struct(TweakVarArray) TweakVar *v; }; +//////////////////////////////////////////////////////////// +//~ Utility types + +Struct(TweakBoolDesc) +{ + TweakFlag flags; + String category; +}; + +Struct(TweakFloatDesc) +{ + TweakFlag flags; + String category; + f64 min; + f64 max; + i32 precision; +}; + //////////////////////////////////////////////////////////// //~ Cache types @@ -67,19 +90,23 @@ void BootstrapTweakVars(void); //////////////////////////////////////////////////////////// //~ Tweak var operations -String TweakEx(Arena *arena, String name, TweakDesc desc, String new_value, b32 set_to_new_value); +String TweakEx(Arena *arena, TweakVar desc, b32 update_existing); TweakVarArray GetAllTweakVars(Arena *arena); //////////////////////////////////////////////////////////// //~ Tweak utils -b32 TweakBool_(String name, b32 default_value); -#define TweakBool(_name, _default_value) TweakBool_(Lit(_name), (_default_value)) +b32 TweakBool_(String name, b32 initial, TweakBoolDesc desc); +#define TweakBool(_name, _initial) TweakBool_(Lit(_name), (_initial), (TweakBoolDesc) { \ + .category = Lit("Debug"), \ + __VA_ARGS__ \ +}) \ -f64 TweakFloat_(String name, f64 default_value, TweakDesc desc); -#define TweakFloat(_name, _default_value, _min, _max, ...) TweakFloat_(Lit(_name), (_default_value), (TweakDesc) { \ - .range.min = (_min), \ - .range.max = (_max), \ - .precision = 6, \ - __VA_ARGS__ \ +f64 TweakFloat_(String name, f64 initial, TweakFloatDesc desc); +#define TweakFloat(_name, _initial, _min, _max, ...) TweakFloat_(Lit(_name), (_initial), (TweakFloatDesc) { \ + .category = Lit("Debug"), \ + .min = (_min), \ + .max = (_max), \ + .precision = 6, \ + __VA_ARGS__ \ }) diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 7e453c60..f7084dd4 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -1514,7 +1514,6 @@ void V_TickForever(WaveLaneCtx *lane) if (item->flags & PaletteItemFlag_IsTweakVar) { TweakVar tweak_var = item->tweak_var; - TweakDesc tweak_desc = tweak_var.desc; String old_tweak_str = tweak_var.value; String new_tweak_str = tweak_var.value; @@ -1523,7 +1522,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_BuildLabel(new_tweak_str); // Reset button - if (!MatchString(new_tweak_str, tweak_var.default_value)) + if (!MatchString(new_tweak_str, tweak_var.initial)) { UI_BuildSpacer(UI_PIX(spacing * 0.5, 1), Axis_X); UI_Key reset_key = UI_KeyF("reset"); @@ -1531,7 +1530,7 @@ void V_TickForever(WaveLaneCtx *lane) if (reset_rep.m1.presses > 0) { - new_tweak_str = tweak_var.default_value; + new_tweak_str = tweak_var.initial; } Vec4 reset_bg_color = Zi; @@ -1553,7 +1552,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_PopCP(UI_TopCP()); } - switch (tweak_desc.kind) + switch (tweak_var.kind) { // Boolean tweak case TweakKind_Bool: @@ -1603,8 +1602,8 @@ void V_TickForever(WaveLaneCtx *lane) Vec2 marker_dims = DimsFromRng2(marker_reps.draw.screen_rect); Vec2 half_marker_dims = MulVec2(marker_dims, 0.5); - f64 range_min = tweak_desc.range.min; - f64 range_max = tweak_desc.range.max; + f64 range_min = tweak_var.range.min; + f64 range_max = tweak_var.range.max; if (range_max <= range_min) { range_max = range_min + 1; @@ -1614,8 +1613,8 @@ void V_TickForever(WaveLaneCtx *lane) { if (slider_reps.draw.m1.held && (frame->ui_cursor.x != last_frame->ui_cursor.x)) { - f64 initial_marker_width = DimsFromRng2(marker_reps.drag.screen_rect).x; f64 initial_slider_pos = slider_reps.drag.screen_rect.p0.x; + f64 initial_marker_width = DimsFromRng2(marker_reps.drag.screen_rect).x; f64 initial_slider_width = DimsFromRng2(slider_reps.drag.screen_rect).x - initial_marker_width; f64 initial_cursor = ui_frame->drag_cursor_pos.x; f64 initial_ratio = slider_reps.drag.misc; @@ -1626,7 +1625,7 @@ void V_TickForever(WaveLaneCtx *lane) tweak_float = LerpF64(range_min, range_max, virtual_cursor_ratio); tweak_float = ClampF64(tweak_float, range_min, range_max); - new_tweak_str = StringFromFloat(frame->arena, tweak_float, tweak_desc.precision); + new_tweak_str = StringFromFloat(frame->arena, tweak_float, tweak_var.precision); } if (slider_reps.draw.is_hot) { @@ -1691,7 +1690,9 @@ void V_TickForever(WaveLaneCtx *lane) if (!MatchString(old_tweak_str, new_tweak_str)) { - TweakEx(frame->arena, tweak_var.name, tweak_desc, new_tweak_str, 1); + TweakVar new_tweak_var = tweak_var; + new_tweak_var.value = new_tweak_str; + TweakEx(frame->arena, new_tweak_var, 1); } }