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
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);

View File

@ -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), \
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__ \
})

View File

@ -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);
}
}