From 5f6c1f629e543e453a8a4c6dddca9914ae63c27b Mon Sep 17 00:00:00 2001 From: jacob Date: Fri, 2 Jan 2026 21:07:04 -0600 Subject: [PATCH] move draw helpers to vis core --- src/pp/pp_sim/pp_sim_core.c | 23 ++-- src/pp/pp_sim/pp_sim_core.h | 3 +- src/pp/pp_vis/pp_vis.lay | 2 - src/pp/pp_vis/pp_vis_core.c | 215 ++++++++++++++++++++++++++++++++---- src/pp/pp_vis/pp_vis_core.h | 19 +++- src/pp/pp_vis/pp_vis_draw.c | 123 --------------------- src/pp/pp_vis/pp_vis_draw.h | 14 --- src/ui/ui_core.c | 8 +- src/ui/ui_extras.c | 2 +- src/ui/ui_extras.h | 4 +- 10 files changed, 234 insertions(+), 179 deletions(-) delete mode 100644 src/pp/pp_vis/pp_vis_draw.c delete mode 100644 src/pp/pp_vis/pp_vis_draw.h diff --git a/src/pp/pp_sim/pp_sim_core.c b/src/pp/pp_sim/pp_sim_core.c index f421d4f8..1fb0ec56 100644 --- a/src/pp/pp_sim/pp_sim_core.c +++ b/src/pp/pp_sim/pp_sim_core.c @@ -154,18 +154,32 @@ S_Shape S_MulXformShape(Xform xf, S_Shape shape) Vec2 S_SupportPointFromShape(S_Shape shape, Vec2 dir) { Vec2 result = Zi; + Vec2 dir_norm = NormVec2(dir); f32 max_dot = -Inf; for (i32 i = 0; i < shape.points_count; ++i) { Vec2 p = shape.points[i]; - f32 dot = DotVec2(p, dir); + f32 dot = DotVec2(p, dir_norm); if (dot > max_dot) { max_dot = dot; result = p; } } - result = AddVec2(result, MulVec2(dir, shape.radius)); + result = AddVec2(result, MulVec2(dir_norm, shape.radius)); + return result; +} + +Rng2 S_BoundingBoxFromShape(S_Shape shape) +{ + Vec2 left = S_SupportPointFromShape(shape, VEC2(-1, 0)); + Vec2 top = S_SupportPointFromShape(shape, VEC2(0, -1)); + Vec2 right = S_SupportPointFromShape(shape, VEC2(1, 0)); + Vec2 bottom = S_SupportPointFromShape(shape, VEC2(0, 1)); + + Rng2 result = Zi; + result.p0 = VEC2(left.x, top.y); + result.p1 = VEC2(right.x, bottom.y); return result; } @@ -448,11 +462,6 @@ void S_TickForever(WaveLaneCtx *lane) for (S_Ent *ent = S_FirstEnt(&iter, world); ent->active; ent = S_NextEnt(&iter)) { - if (!IsVec2Zero(ent->move)) - { - DEBUGBREAKABLE; - } - Xform xf = ent->xf; if (!IsVec2Zero(ent->look)) { diff --git a/src/pp/pp_sim/pp_sim_core.h b/src/pp/pp_sim/pp_sim_core.h index d2c89ac1..1c1f878c 100644 --- a/src/pp/pp_sim/pp_sim_core.h +++ b/src/pp/pp_sim/pp_sim_core.h @@ -260,12 +260,13 @@ Rng2I32 S_UpdateTilesInPlaceFromPlacement(u8 *tiles, S_TilePlacement placement); //////////////////////////////////////////////////////////// //~ Shape helpers -#define S_ShapeFromDesc(...) S_ShapeFromDescEx((S_ShapeDesc) { __VA_ARGS__ }) S_Shape S_ShapeFromDescEx(S_ShapeDesc desc); +#define S_ShapeFromDesc(...) S_ShapeFromDescEx((S_ShapeDesc) { __VA_ARGS__ }) S_Shape S_MulXformShape(Xform xf, S_Shape shape); Vec2 S_SupportPointFromShape(S_Shape shape, Vec2 dir); +Rng2 S_BoundingBoxFromShape(S_Shape shape); //////////////////////////////////////////////////////////// //~ Lookup helpers diff --git a/src/pp/pp_vis/pp_vis.lay b/src/pp/pp_vis/pp_vis.lay index 7fdda791..a273e263 100644 --- a/src/pp/pp_vis/pp_vis.lay +++ b/src/pp/pp_vis/pp_vis.lay @@ -27,7 +27,6 @@ //- Api @IncludeC pp_vis_shaders.cgh -@IncludeC pp_vis_draw.h @IncludeC pp_vis_core.h @IncludeG pp_vis_shaders.cgh @@ -38,7 +37,6 @@ ////////////////////////////// //- Impl -@IncludeC pp_vis_draw.c @IncludeC pp_vis_core.c @IncludeG pp_vis_shaders.g diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index c9794a52..c5a8e0dc 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -16,7 +16,7 @@ void V_Shutdown(void) } //////////////////////////////////////////////////////////// -//~ Helpers +//~ Misc helpers V_Frame *V_CurrentFrame(void) { @@ -72,6 +72,148 @@ String V_StringFromHotkey(Arena *arena, V_Hotkey hotkey) return StringFromList(arena, parts, Lit(" + ")); } +//////////////////////////////////////////////////////////// +//~ Draw helpers + +void V_DrawPoly(Vec2Array points, Vec4 srgb, V_DrawFlag flags) +{ + V_Frame *frame = V_CurrentFrame(); + Arena *verts_arena = frame->dverts_arena; + Arena *idxs_arena = frame->dvert_idxs_arena; + Vec4 lin = LinearFromSrgb(srgb); + if (flags & V_DrawFlag_Line) + { + i32 verts_count = points.count; + if (verts_count >= 2) + { + TempArena scratch = BeginScratchNoConflict(); + { + f32 half_thickness = 1; + i32 lines_count = verts_count == 2 ? 1 : verts_count; + i32 line_verts_count = lines_count * 4; + i32 idx_count = lines_count * 6; + i32 idx_offset = ArenaCount(verts_arena, V_DVert); + + // Push dverts + V_DVert *dverts = PushStructsNoZero(verts_arena, V_DVert, line_verts_count); + for (i32 line_idx = 0; line_idx < lines_count; ++line_idx) + { + i32 a_idx = line_idx; + i32 b_idx = line_idx + 1; + if (b_idx >= lines_count) + { + b_idx = 0; + } + + Vec2 a = points.points[a_idx]; + Vec2 b = points.points[b_idx]; + + Vec2 a_to_b = SubVec2(b, a); + Vec2 perp = Vec2WithLen(PerpVec2(a_to_b), half_thickness); + + Vec2 p0 = AddVec2(a, perp); + Vec2 p1 = SubVec2(a, perp); + Vec2 p2 = SubVec2(b, perp); + Vec2 p3 = AddVec2(b, perp); + + i32 offset = line_idx * 4; + dverts[offset + 0] = (V_DVert) { .pos = p0, .color_lin = lin }; + dverts[offset + 1] = (V_DVert) { .pos = p1, .color_lin = lin }; + dverts[offset + 2] = (V_DVert) { .pos = p2, .color_lin = lin }; + dverts[offset + 3] = (V_DVert) { .pos = p3, .color_lin = lin }; + } + + // Generate indices + i32 *indices = PushStructsNoZero(idxs_arena, i32, idx_count); + for (i32 line_idx = 0; line_idx < lines_count; ++line_idx) + { + i32 indices_offset = line_idx * 6; + i32 vert_idx_offset = idx_offset + (line_idx * 4); + indices[indices_offset + 0] = vert_idx_offset + 0; + indices[indices_offset + 1] = vert_idx_offset + 1; + indices[indices_offset + 2] = vert_idx_offset + 2; + indices[indices_offset + 3] = vert_idx_offset + 0; + indices[indices_offset + 4] = vert_idx_offset + 2; + indices[indices_offset + 5] = vert_idx_offset + 3; + } + } + EndScratch(scratch); + } + } + else + { + i32 verts_count = points.count; + if (verts_count >= 3) + { + i32 idx_offset = ArenaCount(verts_arena, V_DVert); + i32 tris_count = verts_count - 2; + i32 idx_count = tris_count * 3; + + // Push dverts + V_DVert *dverts = PushStructsNoZero(verts_arena, V_DVert, verts_count); + for (i32 point_idx = 0; point_idx < (i32)points.count; ++point_idx) + { + V_DVert *dvert = &dverts[point_idx]; + dvert->pos = points.points[point_idx]; + dvert->color_lin = lin; + } + + // Generate indices in a fan pattern + i32 *indices = PushStructsNoZero(idxs_arena, i32, idx_count); + for (i32 i = 0; i < tris_count; ++i) + { + i32 tri_offset = i * 3; + indices[tri_offset + 0] = idx_offset; + indices[tri_offset + 1] = idx_offset + i + 1; + indices[tri_offset + 2] = idx_offset + i + 2; + } + } + } +} + +void V_DrawShape(S_Shape shape, Vec4 srgb, i32 detail, V_DrawFlag flags) +{ + if (shape.radius == 0) + { + Vec2Array draw_points = Zi; + draw_points.points = shape.points; + draw_points.count = shape.points_count; + V_DrawPoly(draw_points, srgb, flags); + } + else + { + TempArena scratch = BeginScratchNoConflict(); + { + Vec2Array draw_points = Zi; + draw_points.points = PushStructsNoZero(scratch.arena, Vec2, detail); + draw_points.count = detail; + for (i32 i = 0; i < detail; ++i) + { + f32 rad = ((f32)i / (f32)detail) * Tau; + Vec2 dir = Vec2FromAngle(rad); + Vec2 sp = S_SupportPointFromShape(shape, dir); + draw_points.points[i] = sp; + } + V_DrawPoly(draw_points, srgb, flags); + } + EndScratch(scratch); + } +} + +void V_DrawRect(Rng2 rect, Vec4 srgb, V_DrawFlag flags) +{ + Vec2 points[4] = { + VEC2(rect.p0.x, rect.p0.y), + VEC2(rect.p1.x, rect.p0.y), + VEC2(rect.p1.x, rect.p1.y), + VEC2(rect.p0.x, rect.p1.y), + }; + Vec2Array points_arr = Zi; + points_arr.points = points; + points_arr.count = countof(points); + V_DrawPoly(points_arr, srgb, flags); +} + //////////////////////////////////////////////////////////// //~ Theme @@ -90,6 +232,7 @@ V_WidgetTheme V_GetWidgetTheme(void) theme.h4 = 1.0; theme.h5 = 0.875; theme.h6 = 0.75; + theme.micro = 0.50; // theme.rounding = 0; // theme.rounding = 1; @@ -668,11 +811,10 @@ void V_TickForever(WaveLaneCtx *lane) } ////////////////////////////// - //- Build editor UI - - // TODO: Remove this (testing) - //- Init test layout + + // TODO: Remove this + if (!V.root_panel) { { @@ -690,7 +832,7 @@ void V_TickForever(WaveLaneCtx *lane) panel->parent = V.root_panel; panel->key = UI_RandKey(); // TODO: Don't use random keys panel->axis = !panel->parent->axis; - panel->pref_ratio = 0.25; + panel->pref_ratio = 0.15; DllQueuePush(panel->parent->first, panel->parent->last, panel); ++panel->parent->count; ++V.panels_count; @@ -725,7 +867,7 @@ void V_TickForever(WaveLaneCtx *lane) ++panel->parent->count; ++V.panels_count; - panel->pref_ratio = 0.75; + panel->pref_ratio = 0.85; panel->is_viewport_panel = 1; // { @@ -770,6 +912,9 @@ void V_TickForever(WaveLaneCtx *lane) // } } + ////////////////////////////// + //- Build panels + if (frame->is_editing) { Struct(PanelDfsNode) { PanelDfsNode *next; b32 visited; V_Panel *panel; UI_Checkpoint cp; }; @@ -882,7 +1027,7 @@ void V_TickForever(WaveLaneCtx *lane) ////////////////////////////// //- Build tab row - f32 tab_spacing = 5; + f32 tab_spacing = UI_FNT(0.25, 0).v; V_Window *active_window = 0; V_Window *close_window = 0; { @@ -1037,24 +1182,27 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(BackgroundColor, bg_color); UI_SetNext(BorderColor, border_color); UI_SetNext(BorderSize, 1); - UI_SetNext(Width, UI_SHRINK(0, 0)); + UI_SetNext(Width, UI_SHRINK(0, 1)); UI_SetNext(Height, UI_SHRINK(0, 0)); UI_SetNext(ChildAlignment, UI_Region_Left); UI_SetNext(Misc, window == active_window); UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); - UI_SetNext(Text, tab_name); UI_PushCP(UI_BuildRowEx(tab->key)); { + UI_BuildSpacer(UI_PIX(tab_spacing, 0), Axis_X); + // Build tab title { UI_SetNext(ChildAlignment, UI_Region_Center); UI_SetNext(Flags, UI_BoxFlag_DrawText); UI_SetNext(Text, tab_name); - UI_SetNext(Width, UI_SHRINK(6, 0)); + UI_SetNext(Width, UI_SHRINK(0, 0)); UI_SetNext(Height, UI_SHRINK(2, 0)); UI_BuildRow(); } + UI_BuildSpacer(UI_PIX(tab_spacing, 0), Axis_X); + // Build tab close button { UI_Key close_key = UI_KeyF("close"); @@ -1069,11 +1217,21 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(BorderColor, close_border_color); UI_SetNext(BorderSize, 2); UI_SetNext(ChildAlignment, UI_Region_Center); - UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_CaptureMouse); - UI_SetNext(Text, Lit("x")); - UI_SetNext(Width, UI_SHRINK(6, 0)); - UI_SetNext(Height, UI_SHRINK(2, 0)); - UI_BuildRowEx(close_key); + UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); + UI_SetNext(Width, UI_SHRINK(0, 0)); + UI_SetNext(Height, UI_GROW(1, 0)); + UI_PushCP(UI_BuildRowEx(close_key)); + { + UI_BuildSpacer(UI_PIX(tab_spacing * 2, 0), Axis_X); + + UI_SetNext(Width, UI_SHRINK(0, 1)); + UI_SetNext(Height, UI_SHRINK(0, 1)); + UI_SetNext(FontSize, UI_Top(FontSize) * theme.micro); + UI_BuildIcon(theme.icon_font, UI_Icon_Cross); + + UI_BuildSpacer(UI_PIX(tab_spacing * 2, 0), Axis_X); + } + UI_PopCP(UI_TopCP()); if (close_rep.m1.presses) { @@ -1135,13 +1293,16 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(BorderColor, border_color); UI_SetNext(BorderSize, 2); UI_SetNext(Width, UI_SHRINK(10, 0)); - UI_SetNext(Height, UI_SHRINK(2, 0)); + UI_SetNext(Height, UI_GROW(1, 0)); UI_SetNext(ChildAlignment, UI_Region_Center); // UI_SetNext(FontSize, theme.font_size * 1.5); - UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_CaptureMouse); - UI_SetNext(Text, Lit("+")); + UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); UI_PushCP(UI_BuildRowEx(key)); { + UI_SetNext(Width, UI_SHRINK(0, 1)); + UI_SetNext(Height, UI_SHRINK(0, 1)); + UI_SetNext(FontSize, UI_Top(FontSize) * theme.micro); + UI_BuildIcon(theme.icon_font, UI_Icon_Plus); } UI_PopCP(UI_TopCP()); } @@ -1589,7 +1750,7 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(Height, UI_SHRINK(0, 1)); UI_SetNext(Flags, UI_BoxFlag_CaptureMouse); UI_SetNext(FontSize, UI_Top(FontSize) * theme.h6); - UI_BuildIconEx(reset_key, UI_Icon_Loop2, theme.icon_font); + UI_BuildIconEx(reset_key, theme.icon_font, UI_Icon_Loop2); } UI_BuildSpacer(UI_PIX(spacing, 1), Axis_X); @@ -2199,6 +2360,7 @@ void V_TickForever(WaveLaneCtx *lane) { Xform ent_to_world_xf = ent->xf; Xform ent_to_draw_xf = MulXform(frame->world_to_draw_xf, ent_to_world_xf); + S_Shape draw_shape = S_MulXformShape(ent_to_draw_xf, ent->local_shape); b32 is_visible = 1; if (is_visible) @@ -2207,9 +2369,9 @@ void V_TickForever(WaveLaneCtx *lane) { Vec4 color = Color_Purple; i32 detail = 32; - S_Shape shape = S_MulXformShape(ent_to_draw_xf, ent->local_shape); - V_DrawShape(frame->dverts_arena, frame->dvert_idxs_arena, shape, LinearFromSrgb(color), detail, V_DrawFlag_Line); + V_DrawShape(draw_shape, color, detail, V_DrawFlag_Line); } + // Draw weapon if (ent->has_weapon) { @@ -2226,7 +2388,14 @@ void V_TickForever(WaveLaneCtx *lane) Xform local_xf = XformFromTrs(TRS(.t = { 0, 0 }, .r = Tau / 4)); Xform xf = MulXform(ent_to_draw_xf, local_xf); S_Shape shape = S_MulXformShape(xf, local_shape); - V_DrawShape(frame->dverts_arena, frame->dvert_idxs_arena, shape, LinearFromSrgb(color), 10, V_DrawFlag_Line); + V_DrawShape(shape, color, 10, V_DrawFlag_Line); + } + + // Draw aabb + { + Vec4 color = Color_Orange; + Rng2 bb = S_BoundingBoxFromShape(draw_shape); + V_DrawRect(bb, color, V_DrawFlag_Line); } } } diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index 186f6545..5e522e03 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -30,6 +30,7 @@ Struct(V_WidgetTheme) f32 h4; f32 h5; f32 h6; + f32 micro; f32 rounding; @@ -180,6 +181,15 @@ Struct(V_Window) b32 is_tile_window; }; +//////////////////////////////////////////////////////////// +//~ Draw types + +Enum(V_DrawFlag) +{ + V_DrawFlag_None = 0, + V_DrawFlag_Line = (1 << 0), +}; + //////////////////////////////////////////////////////////// //~ State types @@ -295,7 +305,7 @@ void V_Bootstrap(void); void V_Shutdown(void); //////////////////////////////////////////////////////////// -//~ Helpers +//~ Misc helpers V_Frame *V_CurrentFrame(void); V_Frame *V_LastFrame(void); @@ -303,6 +313,13 @@ V_Cmd *V_PushVisCmd(String name); S_Cmd *V_PushSimCmd(S_CmdKind kind); String V_StringFromHotkey(Arena *arena, V_Hotkey hotkey); +//////////////////////////////////////////////////////////// +//~ Draw helpers + +void V_DrawPoly(Vec2Array points, Vec4 srgb, V_DrawFlag flags); +void V_DrawShape(S_Shape shape, Vec4 srgb, i32 detail, V_DrawFlag flags); +void V_DrawRect(Rng2 rect, Vec4 srgb, V_DrawFlag flags); + //////////////////////////////////////////////////////////// //~ Theme diff --git a/src/pp/pp_vis/pp_vis_draw.c b/src/pp/pp_vis/pp_vis_draw.c deleted file mode 100644 index 509fc1b9..00000000 --- a/src/pp/pp_vis/pp_vis_draw.c +++ /dev/null @@ -1,123 +0,0 @@ -//////////////////////////////////////////////////////////// -//~ Shape helpers - -void V_DrawPoly(Arena *verts_arena, Arena *idxs_arena, Vec2Array points, Vec4 color_lin, V_DrawFlag flags) -{ - if (flags & V_DrawFlag_Line) - { - i32 verts_count = points.count; - if (verts_count >= 2) - { - TempArena scratch = BeginScratchNoConflict(); - { - f32 half_thickness = 1; - i32 lines_count = verts_count == 2 ? 1 : verts_count; - i32 line_verts_count = lines_count * 4; - i32 idx_count = lines_count * 6; - i32 idx_offset = ArenaCount(verts_arena, V_DVert); - - // Push dverts - V_DVert *dverts = PushStructsNoZero(verts_arena, V_DVert, line_verts_count); - for (i32 line_idx = 0; line_idx < lines_count; ++line_idx) - { - i32 a_idx = line_idx; - i32 b_idx = line_idx + 1; - if (b_idx >= lines_count) - { - b_idx = 0; - } - - Vec2 a = points.points[a_idx]; - Vec2 b = points.points[b_idx]; - - Vec2 a_to_b = SubVec2(b, a); - Vec2 perp = Vec2WithLen(PerpVec2(a_to_b), half_thickness); - - Vec2 p0 = AddVec2(a, perp); - Vec2 p1 = SubVec2(a, perp); - Vec2 p2 = SubVec2(b, perp); - Vec2 p3 = AddVec2(b, perp); - - i32 offset = line_idx * 4; - dverts[offset + 0] = (V_DVert) { .pos = p0, .color_lin = color_lin }; - dverts[offset + 1] = (V_DVert) { .pos = p1, .color_lin = color_lin }; - dverts[offset + 2] = (V_DVert) { .pos = p2, .color_lin = color_lin }; - dverts[offset + 3] = (V_DVert) { .pos = p3, .color_lin = color_lin }; - } - - // Generate indices - i32 *indices = PushStructsNoZero(idxs_arena, i32, idx_count); - for (i32 line_idx = 0; line_idx < lines_count; ++line_idx) - { - i32 indices_offset = line_idx * 6; - i32 vert_idx_offset = idx_offset + (line_idx * 4); - indices[indices_offset + 0] = vert_idx_offset + 0; - indices[indices_offset + 1] = vert_idx_offset + 1; - indices[indices_offset + 2] = vert_idx_offset + 2; - indices[indices_offset + 3] = vert_idx_offset + 0; - indices[indices_offset + 4] = vert_idx_offset + 2; - indices[indices_offset + 5] = vert_idx_offset + 3; - } - } - EndScratch(scratch); - } - } - else - { - i32 verts_count = points.count; - if (verts_count >= 3) - { - i32 idx_offset = ArenaCount(verts_arena, V_DVert); - i32 tris_count = verts_count - 2; - i32 idx_count = tris_count * 3; - - // Push dverts - V_DVert *dverts = PushStructsNoZero(verts_arena, V_DVert, verts_count); - for (i32 point_idx = 0; point_idx < (i32)points.count; ++point_idx) - { - V_DVert *dvert = &dverts[point_idx]; - dvert->pos = points.points[point_idx]; - dvert->color_lin = color_lin; - } - - // Generate indices in a fan pattern - i32 *indices = PushStructsNoZero(idxs_arena, i32, idx_count); - for (i32 i = 0; i < tris_count; ++i) - { - i32 tri_offset = i * 3; - indices[tri_offset + 0] = idx_offset; - indices[tri_offset + 1] = idx_offset + i + 1; - indices[tri_offset + 2] = idx_offset + i + 2; - } - } - } -} - -void V_DrawShape(Arena *verts_arena, Arena *idxs_arena, S_Shape shape, Vec4 color_lin, i32 detail, V_DrawFlag flags) -{ - if (shape.radius == 0) - { - Vec2Array draw_points = Zi; - draw_points.points = shape.points; - draw_points.count = shape.points_count; - V_DrawPoly(verts_arena, idxs_arena, draw_points, color_lin, flags); - } - else - { - TempArena scratch = BeginScratchNoConflict(); - { - Vec2Array draw_points = Zi; - draw_points.points = PushStructsNoZero(scratch.arena, Vec2, detail); - draw_points.count = detail; - for (i32 i = 0; i < detail; ++i) - { - f32 rad = ((f32)i / (f32)detail) * Tau; - Vec2 dir = Vec2FromAngle(rad); - Vec2 sp = S_SupportPointFromShape(shape, dir); - draw_points.points[i] = sp; - } - V_DrawPoly(verts_arena, idxs_arena, draw_points, color_lin, flags); - } - EndScratch(scratch); - } -} diff --git a/src/pp/pp_vis/pp_vis_draw.h b/src/pp/pp_vis/pp_vis_draw.h deleted file mode 100644 index c4566663..00000000 --- a/src/pp/pp_vis/pp_vis_draw.h +++ /dev/null @@ -1,14 +0,0 @@ -//////////////////////////////////////////////////////////// -//~ Flag types - -Enum(V_DrawFlag) -{ - V_DrawFlag_None = 0, - V_DrawFlag_Line = (1 << 0), -}; - -//////////////////////////////////////////////////////////// -//~ Shape helpers - -void V_DrawPoly(Arena *verts_arena, Arena *idxs_arena, Vec2Array points, Vec4 color_lin, V_DrawFlag flags); -void V_DrawShape(Arena *verts_arena, Arena *idxs_arena, S_Shape shape, Vec4 color_lin, i32 detail, V_DrawFlag flags); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index cc7ecec6..ed15531d 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1164,7 +1164,6 @@ void UI_EndFrame(UI_Frame *frame) } else if (sem_dims.kind == UI_SizeKind_Shrink && AnyBit(box->desc.flags, UI_BoxFlag_DrawText)) { - // TODO: Distinguish between baseline alignment & visual alignment f32 text_size = 0; if (axis == Axis_X) { @@ -1258,8 +1257,8 @@ void UI_EndFrame(UI_Frame *frame) for (Axis axis = 0; axis < Axis_COUNTXY; ++axis) { f32 box_size = box->solved_dims.v[axis]; - // Accumulate non-floating sizes { + // Accumulate non-floating sizes f32 unconstrained_size_accum = 0; f32 flex_accum = 0; f32 violation = 0; @@ -1269,8 +1268,6 @@ void UI_EndFrame(UI_Frame *frame) b32 is_floating = AnyBit(child->desc.flags, UI_BoxFlag_Floating); if (!is_floating) { - child->solved_dims.v[axis] = RoundF32(child->solved_dims.v[axis]); - f32 size = child->solved_dims.v[axis]; f32 strictness = child->desc.pref_semantic_dims[axis].strictness; f32 flex = size * (1.0 - strictness); @@ -1286,6 +1283,7 @@ void UI_EndFrame(UI_Frame *frame) } } } + unconstrained_size_accum = FloorF32(unconstrained_size_accum); violation = unconstrained_size_accum - box_size; } { @@ -1333,6 +1331,7 @@ void UI_EndFrame(UI_Frame *frame) UI_Box *box = boxes_pre[pre_index]; UI_Box *parent = box->parent; + // TODO: Distinguish between baseline alignment & visual alignment UI_RegionPair child_alignment = UI_PairFromRegion(box->desc.child_alignment); UI_RegionPair alignment_in_parent = UI_PairFromRegion(parent ? parent->desc.child_alignment : UI_Region_TopLeft); @@ -1341,7 +1340,6 @@ void UI_EndFrame(UI_Frame *frame) b32 is_floating = AnyBit(box->desc.flags, UI_BoxFlag_Floating); - // Apply scale for (Axis axis = 0; axis < Axis_COUNTXY; ++axis) { diff --git a/src/ui/ui_extras.c b/src/ui/ui_extras.c index 8d63f9dc..14f164f9 100644 --- a/src/ui/ui_extras.c +++ b/src/ui/ui_extras.c @@ -63,7 +63,7 @@ UI_Key UI_BuildLabelF_(String fmt, ...) //////////////////////////////////////////////////////////// //~ Icon helpers -UI_Key UI_BuildIconEx(UI_Key key, UI_Icon icon, GC_FontKey font) +UI_Key UI_BuildIconEx(UI_Key key, GC_FontKey font, UI_Icon icon) { UI_SetNext(Font, font); UI_SetNext(Icon, icon); diff --git a/src/ui/ui_extras.h b/src/ui/ui_extras.h index 14dc623f..a75b52d7 100644 --- a/src/ui/ui_extras.h +++ b/src/ui/ui_extras.h @@ -14,8 +14,8 @@ UI_Key UI_BuildLabelF_(String fmt, ...); //////////////////////////////////////////////////////////// //~ Icon helpers -UI_Key UI_BuildIconEx(UI_Key key, UI_Icon icon, GC_FontKey font); -#define UI_BuildIcon(icon, font) UI_BuildIconEx(UI_NilKey, (icon), (font)) +UI_Key UI_BuildIconEx(UI_Key key, GC_FontKey font, UI_Icon icon); +#define UI_BuildIcon(font, icon) UI_BuildIconEx(UI_NilKey, (font), (icon)) //////////////////////////////////////////////////////////// //~ Spacing helpers