From 07f72ac41e14f5d545af3f29bf99146679371fbb Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 29 Dec 2025 15:32:26 +1100 Subject: [PATCH] layout fixes --- assets/gui.frag.spv | Bin 6276 -> 7144 bytes assets/gui.vert.spv | Bin 9436 -> 9956 bytes src/dlib | 2 +- src/editor/editor.d | 17 ++- src/editor/ui.d | 243 ++++++++++++++++++-------------------- src/editor/views.d | 46 ++++---- src/shaders/gui.frag.glsl | 29 ++--- src/shaders/gui.layout | 31 +++++ src/shaders/gui.vert.glsl | 54 +++------ 9 files changed, 218 insertions(+), 204 deletions(-) diff --git a/assets/gui.frag.spv b/assets/gui.frag.spv index 89ae57e8ba60341443ffde384588a83176a5003b..8794c328a5e47009bdd6bdefa2b25c57b3c5d821 100644 GIT binary patch literal 7144 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 literal 6276 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 item.rect.p1.y) { @@ -1977,7 +1961,6 @@ DrawGlyph(UIItem* item, Glyph* glyph, u32 atlas_index, f32* x_pos, f32 y, Vec4 c v.dst_end.y -= (v.dst_end.y - v.dst_start.y) * cull_pct; v.src_end.y -= (v.src_end.y - v.src_start.y) * cull_pct; } - */ static foreach(axis; A2D.min .. A2D.max) { @@ -2000,10 +1983,28 @@ ItemBounds(UIItem* item) return [item.rect.p0, item.rect.p1]; } +pragma(inline) f32 +AxisPadding(Axis2D axis)(UIItem* item) +{ + return item.padding[axis].x + item.padding[axis].y; +} + pragma(inline) f32 InnerSize(Axis2D axis)(UIItem* item) { - return clamp(item.size[axis] - item.padding.v[axis]*2.0, 0.0, f32.max); + return clamp(item.size[axis] - (item.padding[axis].x + item.padding[axis].y) - item.border_thickness*2.0, 0.0, f32.max); +} + +pragma(inline) f32 +InnerSize(UIItem* item, Axis2D axis) +{ + return clamp(item.size[axis] - (item.padding[axis].x + item.padding[axis].y) - item.border_thickness*2.0, 0.0, f32.max); +} + +pragma(inline) f32 +InnerOffset(Axis2D axis, bool start)(UIItem* item) +{ + return item.padding[axis].v[start] + item.border_thickness; } pragma(inline) Vertex* @@ -2049,22 +2050,10 @@ InBounds(T)(T pos, Rect* rect) return pos.x >= rect.p0.x && pos.x <= rect.p1.x && pos.y >= rect.p0.y && pos.y <= rect.p1.y; } -static Vec4[4] -Vec4Arr(Vec4 vec) -{ - return [vec, vec, vec, vec]; -} - static Vec2[2] -Vec2ArrX(alias Vec2 vec)() +Vec2A2(f32 x0, f32 y0, f32 x1, f32 y1) { - return [vec, Vec2(0.0)]; -} - -static Vec2[2] -Vec2ArrY(alias Vec2 vec)() -{ - return [Vec2(0.0), vec]; + return [Vec2(x0, y0), Vec2(x1, y1)]; } unittest diff --git a/src/editor/views.d b/src/editor/views.d index d958927..c3e29c6 100644 --- a/src/editor/views.d +++ b/src/editor/views.d @@ -46,13 +46,15 @@ LineCounterView(FontAtlasBuf* abuf, u64 max_line, u64 lines, i64 line_offset, f3 enum UIPushInfo[] lc_params = [ { "layout_axis", q{ A2D.Y } }, { "view_offset", q{ Vec2(0.0, view_offset) } }, - { "padding", q{ Vec2(8.0) } }, - { "size_info", q{ UISX(ST.Pixels, lc_width) }}, + { "padding", q{ Vec2(4.0) } }, + { "size_info", q{ UIS2(ST.Pixels, ST.Percentage, lc_width, 1.0) }}, + { "edge_softness", q{ 0.0 } }, + { "border_thickness", q{ 1.0 } }, ]; mixin(PushOnce!(lc_params)); - UIItem* line_count = MakeItem(zero, UIF.DrawBorder|UIF.PortalViewY); + UIItem* line_count = MakeItem("###lc", UIF.DrawBorder|UIF.PortalViewY); mixin(PushScope!("text_col", q{ Vec4(1.0) } )); mixin(PushScope!("size_info", q{ UISY(ST.Pixels, abuf.atlas.line_height) } )); @@ -80,17 +82,19 @@ EditorTextView(UIItem* editor, Panel* p, FontAtlasBuf* abuf, u64 lines, i64 line f32 padding = 8.0; enum UIPushInfo[] text_view_params = [ - { "layout_axis", q{ A2D.Y } }, - { "border_col", q{ Vec4(1.0) } }, - { "size_info", q{ UIS2() } }, - { "scroll_target", q{ Vec2(0.0, scroll_pos) } }, - { "scroll_clamp", q{ Vec2(0.0, clamp_y) } }, - { "view_offset", q{ Vec2(0.0, view_offset) } }, - { "padding", q{ Vec2(padding) } }, + { "layout_axis", q{ A2D.Y } }, + { "border_col", q{ Vec4(1.0) } }, + { "size_info", q{ UIS2() } }, + { "scroll_target", q{ Vec2(0.0, scroll_pos) } }, + { "scroll_clamp", q{ Vec2(0.0, clamp_y) } }, + { "view_offset", q{ Vec2(0.0, view_offset) } }, + { "padding", q{ Vec2(4.0) } }, + { "edge_softness", q{ 0.0 } }, + { "border_thickness", q{ 1.0 } }, ]; mixin(PushOnce!(text_view_params)); - editor = MakeItem(editor.key, UIF.DrawBorder|UIF.ScrollY|UIF.ClampY); + editor = MakeItem(editor.key, UIF.DrawBorder|UIF.ScrollY|UIF.ClampY|UIF.PortalViewY); mixin(PushScope!("parent", q{ editor })); @@ -113,13 +117,13 @@ EditorTextView(UIItem* editor, Panel* p, FontAtlasBuf* abuf, u64 lines, i64 line ]; mixin(PushOnce!(cursor_info)); - MakeItem(zero, UIF.DrawBackground|UIF.FixedPosition); + UIItem* cursor = MakeItem("###cursor", UIF.DrawBackground|UIF.FixedPosition); } mixin(PushScope!("size_info", q{ UISY(ST.TextSize) } )); mixin(PushScope!("syntax_highlight", q{ UISH.D } )); - // NEED TO FIX LINES BEING OFFSET FOR WHATEVER REASON + // Do a thing like the bottom 3 colours on lost trail (arknights) on highlighting but make it slide to the right one colour every time you scroll down u64 i = line_offset; for(LineBuffer* lb = GetLine(&ed.buf, i); !CheckNil(g_NIL_LINE_BUF, lb) && i < line_offset+lines; i += 1, lb = GetLine(&ed.buf, i)) @@ -142,6 +146,8 @@ EditorView(Panel* p) UIKey zero = ZeroKey(); FontAtlasBuf* abuf = GetFontAtlas(p.text_size); + mixin(PushScope!("text_size", q{ p.text_size })); + if(CheckNil(g_NIL_ED, ed)) { for(Panel* c = p.first; !CheckNil(g_NIL_PANEL, c); c = c.next) @@ -173,11 +179,11 @@ EditorView(Panel* p) u64 view_lines; if(editor.size.y > 0.0) { - view_lines = cast(u64)floor(editor.size.y/text_size); + view_lines = cast(u64)floor(editor.size.y/text_size)+1; const u64 SCROLL_BUFFER = 4; - u64 start = ed.line_offset; - u64 end = start+view_lines; + i64 start = ed.line_offset; + i64 end = start+view_lines; if(ed.cursor_pos.y < start) { @@ -190,10 +196,6 @@ EditorView(Panel* p) } } - u64 start = cast(u64)floor(editor.scroll_offset.y/text_size); - LineCounterView(abuf, ed.buf.line_count, view_lines, start, frame_view_offset); - EditorTextView(editor, p, abuf, view_lines, start, frame_view_offset); - for(UIInput* i = ctx.events.first; !CheckNil(g_UI_NIL_INPUT, i) && g_ed_ctx.focused_editor == p.ed; i = i.next) { bool taken; @@ -224,6 +226,10 @@ EditorView(Panel* p) } ed.cursor_pos = VecPos(&ed.buf); + + u64 start = cast(u64)floor(editor.scroll_offset.y/text_size); + LineCounterView(abuf, ed.buf.line_count, view_lines, start, frame_view_offset); + EditorTextView(editor, p, abuf, view_lines, start, frame_view_offset); } ResetBuffer(&ed.buf); diff --git a/src/shaders/gui.frag.glsl b/src/shaders/gui.frag.glsl index 67442a5..eb51179 100644 --- a/src/shaders/gui.frag.glsl +++ b/src/shaders/gui.frag.glsl @@ -3,28 +3,10 @@ #extension GL_GOOGLE_include_directive : require #extension GL_EXT_debug_printf : require +#define FRAG_SHADER + #include "gui.layout" -layout (location = 0) flat in struct FragDataFlatIn -{ - uint texture; - uint atlas_index; -} FDF; - -layout (location = 2) in struct FragDataIn -{ - vec4 color; - vec2 uv; - vec2 dst_pos; - vec2 dst_center; - vec2 dst_half_size; - vec2 sdf_sample_pos; - float corner_radius; - float softness; - float raised; - float border_thickness; -} FD; - layout (location = 0) out vec4 FragColor; float RectSDF(vec2 pos, vec2 half_size, float radius) @@ -47,6 +29,11 @@ vec4 ToLinear(vec4 col) return pow(col, vec4(vec3(2.2), 1.0)); } +float GradientNoise(vec2 uv) +{ + return fract(52.9829189 * fract(dot(uv, vec2(0.06711056, 0.00583715)))); +} + void main() { float softness = FD.softness; @@ -90,5 +77,7 @@ void main() out_color.a *= corner_factor; out_color.a *= border_factor; + out_color += (1.0 / 255.0) * GradientNoise(gl_FragCoord.xy); + FragColor = out_color; } diff --git a/src/shaders/gui.layout b/src/shaders/gui.layout index e27d573..4c1c269 100644 --- a/src/shaders/gui.layout +++ b/src/shaders/gui.layout @@ -9,3 +9,34 @@ layout (push_constant) uniform Constants { } PC; #define SpriteAtlas SpriteAtlasArray[FDF.atlas_index] + +#ifdef VERT_SHADER +# define FragData out struct FragDataOut +# define FragDataFlat flat out struct FragDataFlatOut +#endif + +#ifdef FRAG_SHADER +# define FragData in struct FragDataIn +# define FragDataFlat flat in struct FragDataFlatIn +#endif + +layout (location = 0) FragDataFlat +{ + uint texture; + uint atlas_index; +} FDF; + +layout (location = 2) FragData +{ + vec4 color; + vec4 color_end; + vec2 uv; + vec2 dst_pos; + vec2 dst_center; + vec2 dst_half_size; + vec2 sdf_sample_pos; + float corner_radius; + float softness; + float raised; + float border_thickness; +} FD; diff --git a/src/shaders/gui.vert.glsl b/src/shaders/gui.vert.glsl index 99dfa3d..62813b7 100644 --- a/src/shaders/gui.vert.glsl +++ b/src/shaders/gui.vert.glsl @@ -2,42 +2,25 @@ #extension GL_GOOGLE_include_directive : require +#define VERT_SHADER + #include "gui.layout" -layout (location = 0) in vec4 in_col; -layout (location = 1) in float in_corner_radius_x0y0; -layout (location = 2) in float in_corner_radius_x1y0; -layout (location = 3) in float in_corner_radius_x0y1; -layout (location = 4) in float in_corner_radius_x1y1; -layout (location = 5) in vec2 in_dst_start; -layout (location = 6) in vec2 in_dst_end; -layout (location = 7) in vec2 in_src_start; -layout (location = 8) in vec2 in_src_end; -layout (location = 9) in float border_thickness; -layout (location = 10) in float edge_softness; -layout (location = 11) in float raised; -layout (location = 12) in uint in_has_texture; -layout (location = 13) in uint in_atlas_index; - -layout (location = 0) flat out struct FragDataFlatOut -{ - uint texture; - uint atlas_index; -} FDF; - -layout (location = 2) out struct FragDataOut -{ - vec4 color; - vec2 uv; - vec2 dst_pos; - vec2 dst_center; - vec2 dst_half_size; - vec2 sdf_sample_pos; - float corner_radius; - float softness; - float raised; - float border_thickness; -} FD; +layout (location = 0) in vec4 in_col_start; +layout (location = 1) in vec4 in_col_end; +layout (location = 2) in float in_corner_radius_x0y0; +layout (location = 3) in float in_corner_radius_x1y0; +layout (location = 4) in float in_corner_radius_x0y1; +layout (location = 5) in float in_corner_radius_x1y1; +layout (location = 6) in vec2 in_dst_start; +layout (location = 7) in vec2 in_dst_end; +layout (location = 8) in vec2 in_src_start; +layout (location = 9) in vec2 in_src_end; +layout (location = 10) in float border_thickness; +layout (location = 11) in float edge_softness; +layout (location = 12) in float raised; +layout (location = 13) in uint in_has_texture; +layout (location = 14) in uint in_atlas_index; vec2 Vertices[4] = vec2[4]( vec2(-1.0, -1.0), @@ -83,7 +66,8 @@ void main() vec2 dst_verts_pct = vec2(bool(gl_VertexIndex >> 1) ? 1.0f : 0.0f, bool(gl_VertexIndex & 1) ? 0.0f : 1.0f); - FD.color = in_col; + FD.color = in_col_start; + FD.color_end = in_col_end; FD.uv = uvs[gl_VertexIndex] / tex_size; FD.dst_pos = pos; FD.dst_center = center;