pass initial tweak variable on every call

This commit is contained in:
jacob 2026-01-01 17:26:17 -06:00
parent 169a74f637
commit df480e3a44
3 changed files with 95 additions and 44 deletions

View File

@ -9,11 +9,11 @@ void BootstrapTweakVars(void)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Tweak var operations //~ 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; String result = Zi;
Arena *perm = PermArena(); 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)]; TweakVarEntryBin *bin = &Base.tweak.entry_bins[hash % countof(Base.tweak.entry_bins)];
LockTicketMutex(&Base.tweak.tm); LockTicketMutex(&Base.tweak.tm);
{ {
@ -32,25 +32,28 @@ String TweakEx(Arena *arena, String name, TweakDesc desc, String new_value, b32
e->hash = hash; e->hash = hash;
{ {
// FIXME: Not perm // 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; TweakVar *v = &e->v;
v->name = PushString(perm, name); *v = desc;
v->desc = desc; v->name = store_name;
v->category = store_category;
v->value = store_value; v->value = store_value;
v->default_value = store_value; v->initial = store_initial;
} }
PushAlign(perm, CachelineSize); PushAlign(perm, CachelineSize);
SllQueuePushN(bin->first, bin->last, e, next_in_bin); SllQueuePushN(bin->first, bin->last, e, next_in_bin);
SllQueuePushN(Base.tweak.first_entry, Base.tweak.last_entry, e, next_in_list); SllQueuePushN(Base.tweak.first_entry, Base.tweak.last_entry, e, next_in_list);
Base.tweak.entries_count += 1; 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 // FIXME: Not perm
String store_value = PushString(perm, new_value); String store_value = PushString(perm, desc.value);
// FIXME: free old value // FIXME: free old value
e->v.value = store_value; e->v.value = store_value;
@ -76,8 +79,10 @@ TweakVarArray GetAllTweakVars(Arena *arena)
TweakVar *src = &e->v; TweakVar *src = &e->v;
TweakVar *dst = &result.v[var_idx]; TweakVar *dst = &result.v[var_idx];
*dst = *src; *dst = *src;
dst->name = PushString(arena, src->name);
dst->category = PushString(arena, src->category);
dst->value = PushString(arena, src->value); dst->value = PushString(arena, src->value);
dst->default_value = PushString(arena, src->default_value); dst->initial = PushString(arena, src->initial);
var_idx += 1; var_idx += 1;
} }
} }
@ -89,29 +94,47 @@ TweakVarArray GetAllTweakVars(Arena *arena)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Tweak utils //~ Tweak utils
b32 TweakBool_(String name, b32 default_value) b32 TweakBool_(String name, b32 initial, TweakBoolDesc desc)
{ {
b32 result = 0; b32 result = 0;
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
{ {
TweakDesc desc = Zi; String initial_str = StringFromBool(scratch.arena, initial);
desc.kind = TweakKind_Bool; TweakVar var = Zi;
String default_value_str = StringFromBool(scratch.arena, default_value); {
String tweak_str = TweakEx(scratch.arena, name, desc, default_value_str, 0); 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); result = BoolFromString(tweak_str);
} }
EndScratch(scratch); EndScratch(scratch);
return result; return result;
} }
f64 TweakFloat_(String name, f64 default_value, TweakDesc desc) f64 TweakFloat_(String name, f64 initial, TweakFloatDesc desc)
{ {
f64 result = 0; f64 result = 0;
desc.kind = TweakKind_Float;
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
{ {
String default_value_str = StringFromFloat(scratch.arena, default_value, desc.precision); String initial_str = StringFromFloat(scratch.arena, initial, desc.precision);
String tweak_str = TweakEx(scratch.arena, name, desc, default_value_str, 0); 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); result = FloatFromString(tweak_str);
} }
EndScratch(scratch); EndScratch(scratch);

View File

@ -7,19 +7,24 @@ Enum(TweakKind)
TweakKind_Float, TweakKind_Float,
}; };
Struct(TweakDesc) Enum(TweakFlag)
{ {
TweakKind kind; TweakFlag_None = 0,
RngF64 range; TweakFlag_Hidden = (1 << 0),
i32 precision;
}; };
Struct(TweakVar) Struct(TweakVar)
{ {
TweakKind kind;
TweakFlag flags;
String name; String name;
TweakDesc desc; String category;
String value; String value;
String default_value; String initial;
RngF64 range;
i32 precision;
}; };
Struct(TweakVarArray) Struct(TweakVarArray)
@ -28,6 +33,24 @@ Struct(TweakVarArray)
TweakVar *v; TweakVar *v;
}; };
////////////////////////////////////////////////////////////
//~ Utility types
Struct(TweakBoolDesc)
{
TweakFlag flags;
String category;
};
Struct(TweakFloatDesc)
{
TweakFlag flags;
String category;
f64 min;
f64 max;
i32 precision;
};
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Cache types //~ Cache types
@ -67,19 +90,23 @@ void BootstrapTweakVars(void);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Tweak var operations //~ 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); TweakVarArray GetAllTweakVars(Arena *arena);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Tweak utils //~ Tweak utils
b32 TweakBool_(String name, b32 default_value); b32 TweakBool_(String name, b32 initial, TweakBoolDesc desc);
#define TweakBool(_name, _default_value) TweakBool_(Lit(_name), (_default_value)) #define TweakBool(_name, _initial) TweakBool_(Lit(_name), (_initial), (TweakBoolDesc) { \
.category = Lit("Debug"), \
__VA_ARGS__ \
}) \
f64 TweakFloat_(String name, f64 default_value, TweakDesc desc); f64 TweakFloat_(String name, f64 initial, TweakFloatDesc desc);
#define TweakFloat(_name, _default_value, _min, _max, ...) TweakFloat_(Lit(_name), (_default_value), (TweakDesc) { \ #define TweakFloat(_name, _initial, _min, _max, ...) TweakFloat_(Lit(_name), (_initial), (TweakFloatDesc) { \
.range.min = (_min), \ .category = Lit("Debug"), \
.range.max = (_max), \ .min = (_min), \
.max = (_max), \
.precision = 6, \ .precision = 6, \
__VA_ARGS__ \ __VA_ARGS__ \
}) })

View File

@ -1514,7 +1514,6 @@ void V_TickForever(WaveLaneCtx *lane)
if (item->flags & PaletteItemFlag_IsTweakVar) if (item->flags & PaletteItemFlag_IsTweakVar)
{ {
TweakVar tweak_var = item->tweak_var; TweakVar tweak_var = item->tweak_var;
TweakDesc tweak_desc = tweak_var.desc;
String old_tweak_str = tweak_var.value; String old_tweak_str = tweak_var.value;
String new_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); UI_BuildLabel(new_tweak_str);
// Reset button // 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_BuildSpacer(UI_PIX(spacing * 0.5, 1), Axis_X);
UI_Key reset_key = UI_KeyF("reset"); UI_Key reset_key = UI_KeyF("reset");
@ -1531,7 +1530,7 @@ void V_TickForever(WaveLaneCtx *lane)
if (reset_rep.m1.presses > 0) if (reset_rep.m1.presses > 0)
{ {
new_tweak_str = tweak_var.default_value; new_tweak_str = tweak_var.initial;
} }
Vec4 reset_bg_color = Zi; Vec4 reset_bg_color = Zi;
@ -1553,7 +1552,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_PopCP(UI_TopCP()); UI_PopCP(UI_TopCP());
} }
switch (tweak_desc.kind) switch (tweak_var.kind)
{ {
// Boolean tweak // Boolean tweak
case TweakKind_Bool: case TweakKind_Bool:
@ -1603,8 +1602,8 @@ void V_TickForever(WaveLaneCtx *lane)
Vec2 marker_dims = DimsFromRng2(marker_reps.draw.screen_rect); Vec2 marker_dims = DimsFromRng2(marker_reps.draw.screen_rect);
Vec2 half_marker_dims = MulVec2(marker_dims, 0.5); Vec2 half_marker_dims = MulVec2(marker_dims, 0.5);
f64 range_min = tweak_desc.range.min; f64 range_min = tweak_var.range.min;
f64 range_max = tweak_desc.range.max; f64 range_max = tweak_var.range.max;
if (range_max <= range_min) if (range_max <= range_min)
{ {
range_max = range_min + 1; 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)) 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_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_slider_width = DimsFromRng2(slider_reps.drag.screen_rect).x - initial_marker_width;
f64 initial_cursor = ui_frame->drag_cursor_pos.x; f64 initial_cursor = ui_frame->drag_cursor_pos.x;
f64 initial_ratio = slider_reps.drag.misc; 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 = LerpF64(range_min, range_max, virtual_cursor_ratio);
tweak_float = ClampF64(tweak_float, range_min, range_max); 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) if (slider_reps.draw.is_hot)
{ {
@ -1691,7 +1690,9 @@ void V_TickForever(WaveLaneCtx *lane)
if (!MatchString(old_tweak_str, new_tweak_str)) 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);
} }
} }