begin adding tweak vars

This commit is contained in:
jacob 2025-12-29 21:13:34 -06:00
parent d1fe4593da
commit 4f00af6044
8 changed files with 157 additions and 54 deletions

View File

@ -5,6 +5,7 @@
//- Api
#include "base.cgh"
#if IsLanguageC
#include "base_tweak.h"
#include "base_intrinsics.h"
#include "base_memory.h"
#include "base_arena.h"
@ -33,6 +34,7 @@
//- Impl
#if IsLanguageC
#include "base_tweak.c"
#include "base_memory.c"
#include "base_arena.c"
#include "base_sync.c"
@ -49,6 +51,7 @@
#include "base_controller.c"
#include "base_async.c"
#include "base_state.c"
#else
#endif
//- Include base_win32

View File

@ -1,5 +1,5 @@
////////////////////////////////////////////////////////////
//~ Global context
//~ Global state
Struct(BaseCtx)
{
@ -7,12 +7,13 @@ Struct(BaseCtx)
ResourceCtx resource;
GstatCtx gstat;
AsyncCtx async;
TweakVarsCtx tweak;
};
extern BaseCtx Base;
////////////////////////////////////////////////////////////
//~ Thread-local context
//~ Thread-local state
Struct(BaseThreadLocalCtx)
{

39
src/base/base_tweak.c Normal file
View File

@ -0,0 +1,39 @@
////////////////////////////////////////////////////////////
//~ Tweak var get/set
//- Auto-generated functions
#define X(name, type, default_value) \
type GetTweak_##name(void) \
{ \
type result = Zi; \
LockTicketMutex(&Base.tweak.mutex); \
{ \
result = Base.tweak.shared_vars.##name; \
} \
UnlockTicketMutex(&Base.tweak.mutex); \
return result; \
} \
void SetTweak_##name(type v) \
{ \
LockTicketMutex(&Base.tweak.mutex); \
{ \
Base.tweak.shared_vars.name = v; \
} \
UnlockTicketMutex(&Base.tweak.mutex); \
}
TweakVarsXMacro(X);
#undef X
//- Helpers
TweakVars GetAllTweakVars(void)
{
TweakVars result;
LockTicketMutex(&Base.tweak.mutex);
{
result = Base.tweak.shared_vars;
}
UnlockTicketMutex(&Base.tweak.mutex);
return result;
}

43
src/base/base_tweak.h Normal file
View File

@ -0,0 +1,43 @@
////////////////////////////////////////////////////////////
//~ Tweak var types
Enum(TweakVarType)
{
TweakVarType_b32,
};
Enum(TweakVarKind)
{
#define X(name, ...) TweakVarKind_##name,
TweakVarsXMacro(X)
#undef X
TweakVarKind_COUNT
};
Struct(TweakVars)
{
#define X(name, type, ...) type name;
TweakVarsXMacro(X)
#undef X
i32 __; // Prevent empty struct
};
Struct(TweakVarsCtx)
{
TicketMutex mutex;
TweakVars shared_vars;
};
////////////////////////////////////////////////////////////
//~ Tweak var operations
//- Auto-generated functions
#define X(name, type, ...) \
type GetTweak_##name(void); \
void SetTweak_##name(type v);
#undef X
//- Helpers
TweakVars GetAllTweakVars(void);
#define GetTweak(name) GetTweak_##name()
#define SetTweak(name, v) SetTweak_##name((v))

View File

@ -1,4 +1,12 @@
// Project-wide configurable constants
////////////////////////////////////////////////////////////
//~ Debug tweak vars
#define TweakVarsXMacro(X) \
X(CeilGlyphAdvances, b32, 1) \
/* --------------------------------- */
////////////////////////////////////////////////////////////
//~ Project-wide configurable constants
#define WRITE_DIR "power_play"

View File

@ -178,7 +178,16 @@ GC_Run GC_RunFromString(Arena *arena, String str, GC_FontKey font, f32 font_size
{
GC_Glyph *glyph = ready_glyphs[glyph_idx];
GC_RunRect *rect = &result.rects[glyph_idx];
f32 advance = glyph->advance * scale;
f32 advance = 0;
if (GetTweak(CeilGlyphAdvances))
{
advance = CeilF32(glyph->advance * scale);
}
else
{
advance = FloorF32(glyph->advance * scale);
}
Rng2 bounds = Zi;
bounds.p0 = glyph->bounds.p0;

View File

@ -101,30 +101,30 @@ void V_PushWidgetThemeStyles(V_WidgetTheme theme)
}
////////////////////////////////////////////////////////////
//~ Commands widget
//~ Palette
void V_BeginCommandsWidget(V_CommandsWidget *widget)
void V_BeginPalette(V_Palette *widget)
{
ZeroStruct(&widget->build);
widget->build.cp = UI_PushCP(UI_NilKey);
widget->key = UI_KeyF("commands widget");
widget->key = UI_KeyF("commands palette");
UI_Push(Tag, widget->key.hash);
}
V_CommandsWidgetItemReport V_PushCommandsWidgetItem(V_CommandsWidget *widget, V_CommandsWidgetItemDesc desc)
V_PaletteItemReport V_PushPaletteItem(V_Palette *widget, V_PaletteItemDesc desc)
{
Arena *frame_arena = UI_FrameArena();
UI_Key key = UI_KeyF("btn%F", FmtSint(widget->build.num_items));
{
V_CommandsWidgetItem *item = PushStruct(frame_arena, V_CommandsWidgetItem);
V_PaletteItem *item = PushStruct(frame_arena, V_PaletteItem);
item->key = key;
item->desc = desc;
SllQueuePush(widget->build.first_item, widget->build.last_item, item);
++widget->build.num_items;
}
V_CommandsWidgetItemReport result = Zi;
V_PaletteItemReport result = Zi;
UI_Report rep = UI_ReportFromKey(key);
result.ui_report = rep;
result.pressed = rep.m1.presses > 0;
@ -132,7 +132,7 @@ V_CommandsWidgetItemReport V_PushCommandsWidgetItem(V_CommandsWidget *widget, V_
return result;
}
void V_EndCommandsWidget(V_CommandsWidget *widget)
void V_EndPalette(V_Palette *widget)
{
V_Frame *frame = V_CurrentFrame();
V_WidgetTheme theme = V_GetWidgetTheme();
@ -170,7 +170,7 @@ void V_EndCommandsWidget(V_CommandsWidget *widget)
UI_Push(Height, UI_SHRINK(0, 0));
UI_Push(ChildLayoutAxis, Axis_Y);
UI_Push(FloatingPos, SubVec2(widget->pos, widget_half_dims));
UI_SetNext(Flags, UI_BoxFlag_Floating | (UI_BoxFlag_Selected * frame->show_command_palette));
UI_SetNext(Flags, UI_BoxFlag_Floating | (UI_BoxFlag_Selected * frame->show_palette));
UI_PushCP(UI_BuildBoxEx(widget->key));
{
// Title bar
@ -195,7 +195,7 @@ void V_EndCommandsWidget(V_CommandsWidget *widget)
UI_SetNext(FontSize, theme.window_title_font_size);
UI_SetNext(ChildAlignment, UI_Alignment_Center);
UI_SetNext(Width, UI_SHRINK(0, 1));
UI_SetNext(Text, Lit("Commands"));
UI_SetNext(Text, Lit("Command Palette"));
UI_SetNext(Flags, UI_BoxFlag_DrawText);
UI_BuildBox();
@ -219,7 +219,7 @@ void V_EndCommandsWidget(V_CommandsWidget *widget)
UI_SetNext(Width, UI_GROW(1, 0));
UI_PushCP(UI_BuildColumn());
{
for (V_CommandsWidgetItem *item = widget->build.first_item; item; item = item->next)
for (V_PaletteItem *item = widget->build.first_item; item; item = item->next)
{
UI_BuildDivider(UI_PIX(1, 1), theme.divider_color, Axis_Y);
@ -441,10 +441,10 @@ void V_TickForever(WaveLaneCtx *lane)
// Persist state
CopyBytes(frame->held_buttons, last_frame->held_buttons, sizeof(frame->held_buttons));
frame->commands_widget = last_frame->commands_widget;
frame->palette = last_frame->palette;
frame->is_editing = last_frame->is_editing;
frame->ui_debug = last_frame->ui_debug;
frame->show_command_palette = last_frame->show_command_palette;
frame->show_palette = last_frame->show_palette;
frame->show_console = last_frame->show_console;
frame->look = last_frame->look;
frame->edit_mode = last_frame->edit_mode;
@ -1136,7 +1136,7 @@ void V_TickForever(WaveLaneCtx *lane)
if (V.dragging_window && panel_rep.is_hovered)
{
DrawableTab *left = 0;
DrawableTab *right = 0;
DrawableTab *right = first_drawable_tab;
for (DrawableTab *sibling = first_drawable_tab; sibling; sibling = sibling->next)
{
UI_Report sibling_rep = UI_ReportFromKey(sibling->key);
@ -1222,14 +1222,14 @@ void V_TickForever(WaveLaneCtx *lane)
border_color = theme.button_active_color;
}
bg_color = LerpSrgb(bg_color, theme.button_hot_color, tab_rep.hot);
bg_color = LerpSrgb(bg_color, theme.button_active_color, tab_rep.active);
border_color = LerpSrgb(border_color, theme.button_active_color, tab_rep.hot);
bg_color = LerpSrgb(bg_color, theme.button_hot_color, tab_rep.hot * (1.0 - tab_rep.selected));
bg_color = LerpSrgb(bg_color, theme.button_active_color, tab_rep.active * is_dragging);
border_color = LerpSrgb(border_color, theme.button_active_color, tab_rep.selected);
if (is_dragging)
{
bg_color = Color_Blue;
}
// if (is_dragging)
// {
// bg_color = Color_Blue;
// }
String tab_name = Zi;
if (window->is_tile_window)
@ -1247,7 +1247,7 @@ void V_TickForever(WaveLaneCtx *lane)
UI_SetNext(Width, UI_SHRINK(0, 0));
UI_SetNext(Height, UI_SHRINK(0, 0));
UI_SetNext(ChildAlignment, UI_Alignment_Left);
UI_SetNext(Flags, UI_BoxFlag_Interactable);
UI_SetNext(Flags, UI_BoxFlag_Interactable | (UI_BoxFlag_Selected * (active_window == window)));
UI_SetNext(Text, tab_name);
UI_PushCP(UI_BuildRowEx(tab->key));
{
@ -1496,30 +1496,30 @@ void V_TickForever(WaveLaneCtx *lane)
//////////////////////////////
//- Build command palette
// if (frame->show_command_palette)
{
V_BeginCommandsWidget(&frame->commands_widget);
V_BeginPalette(&frame->palette);
{
// Push cmd items to palette
for (u64 i = 0; i < countof(V_cmd_descs); ++i)
{
V_CmdDesc desc = V_cmd_descs[i];
if (!desc.flags & V_CmdDescFlag_HideFromPalette)
V_CmdDesc cmd_desc = V_cmd_descs[i];
if (!cmd_desc.flags & V_CmdDescFlag_HideFromPalette)
{
V_CommandsWidgetItemDesc item_desc = Zi;
item_desc.display_name = desc.display_name;
V_PaletteItemDesc item_desc = Zi;
item_desc.display_name = cmd_desc.display_name;
// FIXME: Attach active shortcuts instead of default hotkeys
CopyStructs(item_desc.hotkeys, desc.default_hotkeys, MinU32(countof(item_desc.hotkeys), countof(desc.default_hotkeys)));
if (V_PushCommandsWidgetItem(&frame->commands_widget, item_desc).pressed > 0)
CopyStructs(item_desc.hotkeys, cmd_desc.default_hotkeys, MinU32(countof(item_desc.hotkeys), countof(cmd_desc.default_hotkeys)));
if (V_PushPaletteItem(&frame->palette, item_desc).pressed > 0)
{
V_CmdNode *cmd_node = PushStruct(frame->arena, V_CmdNode);
cmd_node->cmd.name = desc.name;
cmd_node->cmd.name = cmd_desc.name;
SllQueuePush(first_cmd_node, last_cmd_node, cmd_node);
++cmds_count;
}
}
}
}
V_EndCommandsWidget(&frame->commands_widget);
V_EndPalette(&frame->palette);
}
//////////////////////////////
@ -1761,9 +1761,9 @@ void V_TickForever(WaveLaneCtx *lane)
SignalExit(0);
} break;
case V_CmdKind_toggle_command_palette:
case V_CmdKind_toggle_palette:
{
frame->show_command_palette = !frame->show_command_palette;
frame->show_palette = !frame->show_palette;
} break;
case V_CmdKind_zoom_in:

View File

@ -1,10 +1,10 @@
////////////////////////////////////////////////////////////
//~ Command table
#define V_CmdsTableXMacro(X) \
#define V_CmdsTableXMacro(X) \
X(nop, NOP, V_CmdDescFlag_HideFromPalette, V_HOTKEY(0), ) \
X(exit_program, Exit Program, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_Escape ) ) \
X(toggle_command_palette, Toggle Command Palette, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_P, .ctrl = 1, .shift = 1 ), ) \
X(toggle_palette, Toggle Command Palette, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_P, .ctrl = 1, .shift = 1 ), ) \
X(zoom_in, Zoom In, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_MWheelUp ), ) \
X(zoom_out, Zoom Out, V_CmdDescFlag_HideFromPalette, V_HOTKEY( Button_MWheelDown ), ) \
X(toggle_editor, Toggle Editor, V_CmdDescFlag_None, V_HOTKEY( Button_F1 ), ) \
@ -110,9 +110,9 @@ Global Readonly V_CmdDesc V_cmd_descs[V_CmdKind_COUNT] = {
};
////////////////////////////////////////////////////////////
//~ Commands widget types
//~ Palette types
Struct(V_CommandsWidgetItemReport)
Struct(V_PaletteItemReport)
{
b32 pressed;
b32 hotkey_changed;
@ -120,20 +120,20 @@ Struct(V_CommandsWidgetItemReport)
V_Hotkey new_hotkeys[8];
};
Struct(V_CommandsWidgetItemDesc)
Struct(V_PaletteItemDesc)
{
String display_name;
V_Hotkey hotkeys[8];
};
Struct(V_CommandsWidgetItem)
Struct(V_PaletteItem)
{
V_CommandsWidgetItem *next;
V_PaletteItem *next;
UI_Key key;
V_CommandsWidgetItemDesc desc;
V_PaletteItemDesc desc;
};
Struct(V_CommandsWidget)
Struct(V_Palette)
{
// Persistent state
Vec2 pos;
@ -143,8 +143,8 @@ Struct(V_CommandsWidget)
struct
{
UI_Checkpoint cp;
V_CommandsWidgetItem *first_item;
V_CommandsWidgetItem *last_item;
V_PaletteItem *first_item;
V_PaletteItem *last_item;
u64 num_items;
} build;
};
@ -213,7 +213,7 @@ Struct(V_Frame)
f64 dt;
Button held_buttons[Button_COUNT];
V_CommandsWidget commands_widget;
V_Palette palette;
String window_restore;
i32 zooms;
@ -224,7 +224,7 @@ Struct(V_Frame)
// Modes
b32 is_editing;
b32 ui_debug;
b32 show_command_palette;
b32 show_palette;
b32 show_console;
// Editor state
@ -316,11 +316,11 @@ V_WidgetTheme V_GetWidgetTheme(void);
void V_PushWidgetThemeStyles(V_WidgetTheme theme);
////////////////////////////////////////////////////////////
//~ Commands widget
//~ Palette
void V_BeginCommandsWidget(V_CommandsWidget *widget);
V_CommandsWidgetItemReport V_PushCommandsWidgetItem(V_CommandsWidget *widget, V_CommandsWidgetItemDesc desc);
void V_EndCommandsWidget(V_CommandsWidget *widget);
void V_BeginPalette(V_Palette *widget);
V_PaletteItemReport V_PushPaletteItem(V_Palette *widget, V_PaletteItemDesc desc);
void V_EndPalette(V_Palette *widget);
////////////////////////////////////////////////////////////
//~ Vis tick