From bf36f094dbb8b617eee0efd15ecbfe2a2661de89 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Mon, 22 Jun 2026 18:48:01 +0200 Subject: [PATCH 01/14] Make it work --- assets/cubyz/ui/tooltip_background.png | Bin 0 -> 189 bytes src/graphics.zig | 41 ++++++++++++++++++++ src/gui/components/Button.zig | 21 ++-------- src/gui/components/Label.zig | 2 +- src/gui/gui.zig | 44 +++++++++------------ src/gui/tooltip.zig | 51 +++++++++++++++++++++++++ 6 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 assets/cubyz/ui/tooltip_background.png create mode 100644 src/gui/tooltip.zig diff --git a/assets/cubyz/ui/tooltip_background.png b/assets/cubyz/ui/tooltip_background.png new file mode 100644 index 0000000000000000000000000000000000000000..7f60b29c2ce74d9ae73b41573b0f172c34f3ab5d GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar*{oCK>WIDDb%MSIH~- z-~8y=g4!Db!qdu31?n`Gu6MYsB)|LB+=lVSPZHB+ zH= windowSize[0]) { - pos[0] -= size[0] + xOffset; - } else { - pos[0] += xOffset; - } - pos[1] = @min(pos[1] - fontSize, windowSize[1] - size[1] - border); - pos = @max(pos, Vec2f{border, border}); - { - const oldColor = draw.setColor(0xffffff00); - defer draw.restoreColor(oldColor); - draw.rect(pos - @as(Vec2f, @splat(border)), size + @as(Vec2f, @splat(2*border))); - } - { - const oldColor = draw.setColor(0xff000000); - defer draw.restoreColor(oldColor); - draw.rect(pos - @as(Vec2f, @splat(padding)), size + @as(Vec2f, @splat(2*padding))); + var alignment: graphics.TextBuffer.Alignment = .right; + if(pos[0] + size[0] + Tooltip.tooltipSliceCenter[0] * 2 + Tooltip.tooltipSliceCenter[1] >= windowSize[0]) { + alignment = .left; } - textBuffer.render(pos[0], pos[1], fontSize); + pos[1] = @min(pos[1] - GuiComponent.Label.fontSize, windowSize[1] - size[1] - Tooltip.tooltipSliceCenter[2] - Tooltip.tooltipSliceCenter[3]); + + var list = GuiComponent.VerticalList.init(Vec2f{0, 0}, 360, Tooltip.tooltipSliceCenter[2]); + list.add(label); + list.finish(.left); + var component: GuiComponent = .{.verticalList = list}; + defer component.deinit(); + Tooltip.render(&component, pos, alignment); } } } diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig new file mode 100644 index 0000000000..ab8be7efb4 --- /dev/null +++ b/src/gui/tooltip.zig @@ -0,0 +1,51 @@ +const std = @import("std"); + +const main = @import("main"); +const graphics = main.graphics; +const draw = graphics.draw; +const Texture = graphics.Texture; +const vec = main.vec; +const Vec2f = vec.Vec2f; +const Vec4f = vec.Vec4f; + +const gui = @import("gui.zig"); +const GuiComponent = gui.GuiComponent; + +var tooltipTexture: Texture = undefined; +pub const tooltipSliceCenter: Vec4f = .{4, 4, 4, 4}; + +pub fn globalInit() void { + tooltipTexture = Texture.initFromFile("assets/cubyz/ui/tooltip_background.png"); +} + +pub fn globalDeinit() void { + tooltipTexture.deinit(); +} + +pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextBuffer.Alignment) void { + const size = guicomponent.size(); + tooltipTexture.bindTo(0); + + var renderpos = pos; + switch (alignment) { + .right => { + renderpos = pos + Vec2f{tooltipSliceCenter[0], 0}; + }, + .left => { + renderpos = pos - Vec2f{size[0] + tooltipSliceCenter[0] * 2 + tooltipSliceCenter[1], 0}; + }, + .center => { + renderpos = pos - Vec2f{size[0] / 2, 0}; + } + } + + draw.bound9SliceImage(renderpos, size + Vec2f{tooltipSliceCenter[0] + tooltipSliceCenter[1], tooltipSliceCenter[2] + tooltipSliceCenter[3]}, @floatFromInt(tooltipTexture.size()), tooltipSliceCenter, 1); + + // for a future cubyz contributor: there was no pos setter and im lazy + switch (guicomponent.*) { + inline else => |impl| { + impl.pos = renderpos + Vec2f{tooltipSliceCenter[0], tooltipSliceCenter[2]}; + }, + } + guicomponent.render(pos); +} From 385854ad45d4807196e9cbab2151bbc6e45013ee Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Mon, 22 Jun 2026 18:57:31 +0200 Subject: [PATCH 02/14] Cubyz Formatter --- src/graphics.zig | 45 ++++++++++++++++++++------------------------- src/gui/gui.zig | 4 ++-- src/gui/tooltip.zig | 6 +++--- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/graphics.zig b/src/graphics.zig index 825a7cc8ab..8322d05205 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -470,20 +470,15 @@ pub const draw = struct { // MARK: draw c.glDrawArrays(c.GL_TRIANGLE_STRIP, 0, 4); } - pub fn drawSlice(_destMin : Vec2f, _destMax : Vec2f, _uvMin : Vec2f, _uvMax : Vec2f) void { - boundSubImage( - _destMin, - _destMax - _destMin, - _uvMin, - _uvMax - _uvMin - ); + pub fn drawSlice(_destMin: Vec2f, _destMax: Vec2f, _uvMin: Vec2f, _uvMax: Vec2f) void { + boundSubImage(_destMin, _destMax - _destMin, _uvMin, _uvMax - _uvMin); } - pub fn bound9SliceImage(_pos : Vec2f, _dim : Vec2f, _textureSize : Vec2f, _sliceCenter : Vec4f, _sliceScale : f32) void { - const leftSlice = _sliceCenter[0] * _sliceScale; - const rightSlice = _sliceCenter[1] * _sliceScale; - const topSlice = _sliceCenter[2] * _sliceScale; - const bottomSlice = _sliceCenter[3] * _sliceScale; + pub fn bound9SliceImage(_pos: Vec2f, _dim: Vec2f, _textureSize: Vec2f, _sliceCenter: Vec4f, _sliceScale: f32) void { + const leftSlice = _sliceCenter[0]*_sliceScale; + const rightSlice = _sliceCenter[1]*_sliceScale; + const topSlice = _sliceCenter[2]*_sliceScale; + const bottomSlice = _sliceCenter[3]*_sliceScale; // Construct 9-Slice Rectangle Cordinates const _x1 = _pos[0] + leftSlice; @@ -494,21 +489,21 @@ pub const draw = struct { // MARK: draw const _y3 = _pos[1] + _dim[1]; // Construct UV Boundaries - const _u1 = _sliceCenter[0] / _textureSize[0]; - const _u2 = (_textureSize[0] - _sliceCenter[1]) / _textureSize[0]; - const _v1 = _sliceCenter[2] / _textureSize[1]; - const _v2 = (_textureSize[1] - _sliceCenter[3]) / _textureSize[1]; + const _u1 = _sliceCenter[0]/_textureSize[0]; + const _u2 = (_textureSize[0] - _sliceCenter[1])/_textureSize[0]; + const _v1 = _sliceCenter[2]/_textureSize[1]; + const _v2 = (_textureSize[1] - _sliceCenter[3])/_textureSize[1]; // Draw all Slices - drawSlice(.{_pos[0],_pos[1]},.{_x1,_y1},.{0,0},.{_u1,_v1}); - drawSlice(.{_x1,_pos[1]},.{_x2,_y1},.{_u1,0},.{_u2,_v1}); - drawSlice(.{_x2,_pos[1]},.{_x3,_y1},.{_u2,0},.{1,_v1}); - drawSlice(.{_pos[0],_y1},.{_x1,_y2},.{0,_v1},.{_u1,_v2}); - drawSlice(.{_x1,_y1},.{_x2,_y2},.{_u1,_v1},.{_u2,_v2}); - drawSlice(.{_x2,_y1},.{_x3,_y2},.{_u2,_v1},.{1,_v2}); - drawSlice(.{_pos[0],_y2},.{_x1,_y3},.{0,_v2},.{_u1,1}); - drawSlice(.{_x1,_y2},.{_x2,_y3},.{_u1,_v2},.{_u2,1}); - drawSlice(.{_x2,_y2},.{_x3,_y3},.{_u2,_v2},.{1,1}); + drawSlice(.{_pos[0], _pos[1]}, .{_x1, _y1}, .{0, 0}, .{_u1, _v1}); + drawSlice(.{_x1, _pos[1]}, .{_x2, _y1}, .{_u1, 0}, .{_u2, _v1}); + drawSlice(.{_x2, _pos[1]}, .{_x3, _y1}, .{_u2, 0}, .{1, _v1}); + drawSlice(.{_pos[0], _y1}, .{_x1, _y2}, .{0, _v1}, .{_u1, _v2}); + drawSlice(.{_x1, _y1}, .{_x2, _y2}, .{_u1, _v1}, .{_u2, _v2}); + drawSlice(.{_x2, _y1}, .{_x3, _y2}, .{_u2, _v1}, .{1, _v2}); + drawSlice(.{_pos[0], _y2}, .{_x1, _y3}, .{0, _v2}, .{_u1, 1}); + drawSlice(.{_x1, _y2}, .{_x2, _y3}, .{_u1, _v2}, .{_u2, 1}); + drawSlice(.{_x2, _y2}, .{_x3, _y3}, .{_u2, _v2}, .{1, 1}); } pub fn customShadedImage(uniforms: anytype, _pos: Vec2f, _dim: Vec2f) void { diff --git a/src/gui/gui.zig b/src/gui/gui.zig index cd9e220f66..636e42b627 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -791,7 +791,7 @@ pub const inventory = struct { // MARK: inventory var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, tooltip, .left); var size = label.text.calculateLineBreaks(GuiComponent.Label.fontSize, 300); size[0] = 0; - for(label.text.lineBreaks.items) |lineBreak| { + for (label.text.lineBreaks.items) |lineBreak| { size[0] = @max(size[0], lineBreak.width); } label.size = size; @@ -799,7 +799,7 @@ pub const inventory = struct { // MARK: inventory const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(scale)); var pos = mousePos; var alignment: graphics.TextBuffer.Alignment = .right; - if(pos[0] + size[0] + Tooltip.tooltipSliceCenter[0] * 2 + Tooltip.tooltipSliceCenter[1] >= windowSize[0]) { + if (pos[0] + size[0] + Tooltip.tooltipSliceCenter[0]*2 + Tooltip.tooltipSliceCenter[1] >= windowSize[0]) { alignment = .left; } pos[1] = @min(pos[1] - GuiComponent.Label.fontSize, windowSize[1] - size[1] - Tooltip.tooltipSliceCenter[2] - Tooltip.tooltipSliceCenter[3]); diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index ab8be7efb4..c5ee18ef2a 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -32,11 +32,11 @@ pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextB renderpos = pos + Vec2f{tooltipSliceCenter[0], 0}; }, .left => { - renderpos = pos - Vec2f{size[0] + tooltipSliceCenter[0] * 2 + tooltipSliceCenter[1], 0}; + renderpos = pos - Vec2f{size[0] + tooltipSliceCenter[0]*2 + tooltipSliceCenter[1], 0}; }, .center => { - renderpos = pos - Vec2f{size[0] / 2, 0}; - } + renderpos = pos - Vec2f{size[0]/2, 0}; + }, } draw.bound9SliceImage(renderpos, size + Vec2f{tooltipSliceCenter[0] + tooltipSliceCenter[1], tooltipSliceCenter[2] + tooltipSliceCenter[3]}, @floatFromInt(tooltipTexture.size()), tooltipSliceCenter, 1); From bf91a0204360af185d6c9214ecd32f390b6c46b4 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:07:33 +0200 Subject: [PATCH 03/14] forgot mutpos exist --- src/gui/tooltip.zig | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index c5ee18ef2a..856f0860ab 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -41,11 +41,6 @@ pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextB draw.bound9SliceImage(renderpos, size + Vec2f{tooltipSliceCenter[0] + tooltipSliceCenter[1], tooltipSliceCenter[2] + tooltipSliceCenter[3]}, @floatFromInt(tooltipTexture.size()), tooltipSliceCenter, 1); - // for a future cubyz contributor: there was no pos setter and im lazy - switch (guicomponent.*) { - inline else => |impl| { - impl.pos = renderpos + Vec2f{tooltipSliceCenter[0], tooltipSliceCenter[2]}; - }, - } + guicomponent.mutPos().* = renderpos + Vec2f{tooltipSliceCenter[0], tooltipSliceCenter[2]}; guicomponent.render(pos); } From 464c06488b766b4b629860c0edbe768a3b4be3eb Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:16:22 +0200 Subject: [PATCH 04/14] forgor --- src/gui/gui.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/gui.zig b/src/gui/gui.zig index 636e42b627..bdd5fa58db 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -19,7 +19,7 @@ const ScrollBar = @import("components/ScrollBar.zig"); const ContinuousSlider = @import("components/ContinuousSlider.zig"); const DiscreteSlider = @import("components/DiscreteSlider.zig"); const TextInput = @import("components/TextInput.zig"); -const Tooltip = @import("tooltip.zig"); +const Tooltip = @import("Tooltip.zig"); const gui_component = @import("gui_component.zig"); pub const GuiComponent = gui_component.GuiComponent; pub const GuiWindow = @import("GuiWindow.zig"); From da5cf3fb30f31d1a7a31560c3524c2b9313791c1 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:21:43 +0200 Subject: [PATCH 05/14] Rename tooltip.zig to Tooltip.zig (why didnt this change) --- src/gui/{tooltip.zig => Tooltip.zig} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/gui/{tooltip.zig => Tooltip.zig} (100%) diff --git a/src/gui/tooltip.zig b/src/gui/Tooltip.zig similarity index 100% rename from src/gui/tooltip.zig rename to src/gui/Tooltip.zig From 7e4f8ed67988132d7a3d4581d2bbd5982a1b8a33 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:43:24 +0200 Subject: [PATCH 06/14] update tooltip background --- assets/cubyz/ui/tooltip_background.png | Bin 189 -> 153 bytes src/gui/Tooltip.zig | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/cubyz/ui/tooltip_background.png b/assets/cubyz/ui/tooltip_background.png index 7f60b29c2ce74d9ae73b41573b0f172c34f3ab5d..f6d0231cfaa9473fce2afe62620a7bdc748bef5c 100644 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqex5FlAr*{kdN*<%P~c%*zcPAZ z@WTK9D_i|q^SY!quShW|ki2Irw9xOtIk`|pEv5I*7p{xFpthv`$fb1&2lq@D`^H@L wW~R$L-GaGtuRu2a|6lT#ofXJn1DVXskh)H7Ez?m47oZ4(r>mdKI;Vst0ELn?jQ{`u literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar*{oCK>WIDDb%MSIH~- z-~8y=g4!Db!qdu31?n`Gu6MYsB)|LB+=lVSPZHB+ zH Date: Tue, 23 Jun 2026 12:18:15 +0200 Subject: [PATCH 07/14] Made Tooltip lowercase (its not a type or a component) --- src/gui/Tooltip.zig | 1 - src/gui/gui.zig | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/gui/Tooltip.zig b/src/gui/Tooltip.zig index 3e98038b2d..f92a994094 100644 --- a/src/gui/Tooltip.zig +++ b/src/gui/Tooltip.zig @@ -7,7 +7,6 @@ const Texture = graphics.Texture; const vec = main.vec; const Vec2f = vec.Vec2f; const Vec4f = vec.Vec4f; - const gui = @import("gui.zig"); const GuiComponent = gui.GuiComponent; diff --git a/src/gui/gui.zig b/src/gui/gui.zig index bdd5fa58db..a239898637 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -19,7 +19,7 @@ const ScrollBar = @import("components/ScrollBar.zig"); const ContinuousSlider = @import("components/ContinuousSlider.zig"); const DiscreteSlider = @import("components/DiscreteSlider.zig"); const TextInput = @import("components/TextInput.zig"); -const Tooltip = @import("Tooltip.zig"); +const tooltip = @import("tooltip.zig"); const gui_component = @import("gui_component.zig"); pub const GuiComponent = gui_component.GuiComponent; pub const GuiWindow = @import("GuiWindow.zig"); @@ -148,7 +148,7 @@ pub fn init() void { // MARK: init() ContinuousSlider.globalInit(); DiscreteSlider.globalInit(); TextInput.globalInit(); - Tooltip.globalInit(); + tooltip.globalInit(); load(); gamepad_cursor.init(); } @@ -169,7 +169,7 @@ pub fn deinit() void { ContinuousSlider.globalDeinit(); DiscreteSlider.globalDeinit(); TextInput.globalDeinit(); - Tooltip.globalDeinit(); + tooltip.globalDeinit(); inline for (@typeInfo(windowlist).@"struct".decls) |decl| { const WindowStruct = @field(windowlist, decl.name); if (@hasDecl(WindowStruct, "deinit")) { @@ -787,8 +787,8 @@ pub const inventory = struct { // MARK: inventory // Draw tooltip: const hovered = hoveredItemSlot orelse return; if (carried.getAmount(0) == 0) { - if (hovered.inventory.getItem(hovered.itemSlot).getTooltip()) |tooltip| { - var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, tooltip, .left); + if (hovered.inventory.getItem(hovered.itemSlot).getTooltip()) |tooltipContent| { + var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, tooltipContent, .left); var size = label.text.calculateLineBreaks(GuiComponent.Label.fontSize, 300); size[0] = 0; for (label.text.lineBreaks.items) |lineBreak| { @@ -799,17 +799,17 @@ pub const inventory = struct { // MARK: inventory const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(scale)); var pos = mousePos; var alignment: graphics.TextBuffer.Alignment = .right; - if (pos[0] + size[0] + Tooltip.tooltipSliceCenter[0]*2 + Tooltip.tooltipSliceCenter[1] >= windowSize[0]) { + if (pos[0] + size[0] + tooltip.tooltipSliceCenter[0]*2 + tooltip.tooltipSliceCenter[1] >= windowSize[0]) { alignment = .left; } - pos[1] = @min(pos[1] - GuiComponent.Label.fontSize, windowSize[1] - size[1] - Tooltip.tooltipSliceCenter[2] - Tooltip.tooltipSliceCenter[3]); + pos[1] = @min(pos[1] - GuiComponent.Label.fontSize, windowSize[1] - size[1] - tooltip.tooltipSliceCenter[2] - tooltip.tooltipSliceCenter[3]); - var list = GuiComponent.VerticalList.init(Vec2f{0, 0}, 360, Tooltip.tooltipSliceCenter[2]); + var list = GuiComponent.VerticalList.init(Vec2f{0, 0}, 360, tooltip.tooltipSliceCenter[2]); list.add(label); list.finish(.left); var component: GuiComponent = .{.verticalList = list}; defer component.deinit(); - Tooltip.render(&component, pos, alignment); + tooltip.render(&component, pos, alignment); } } } From e887ee88dbf10f5ef03f380a894101161edf8ede Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Tue, 23 Jun 2026 12:18:52 +0200 Subject: [PATCH 08/14] Rename Tooltip.zig to tooltip.zig --- src/gui/{Tooltip.zig => tooltip.zig} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/gui/{Tooltip.zig => tooltip.zig} (100%) diff --git a/src/gui/Tooltip.zig b/src/gui/tooltip.zig similarity index 100% rename from src/gui/Tooltip.zig rename to src/gui/tooltip.zig From e3e902f3ab49f96ab8de1b3e4e208f4f66bff67d Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Tue, 23 Jun 2026 12:28:32 +0200 Subject: [PATCH 09/14] Reduce unecessary variables in bound9SliceImage --- src/graphics.zig | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/graphics.zig b/src/graphics.zig index 8322d05205..9f396e198f 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -480,30 +480,22 @@ pub const draw = struct { // MARK: draw const topSlice = _sliceCenter[2]*_sliceScale; const bottomSlice = _sliceCenter[3]*_sliceScale; - // Construct 9-Slice Rectangle Cordinates - const _x1 = _pos[0] + leftSlice; - const _x2 = _pos[0] + _dim[0] - rightSlice; - const _x3 = _pos[0] + _dim[0]; - const _y1 = _pos[1] + topSlice; - const _y2 = _pos[1] + _dim[1] - bottomSlice; - const _y3 = _pos[1] + _dim[1]; - - // Construct UV Boundaries + // Construct UV const _u1 = _sliceCenter[0]/_textureSize[0]; const _u2 = (_textureSize[0] - _sliceCenter[1])/_textureSize[0]; const _v1 = _sliceCenter[2]/_textureSize[1]; const _v2 = (_textureSize[1] - _sliceCenter[3])/_textureSize[1]; // Draw all Slices - drawSlice(.{_pos[0], _pos[1]}, .{_x1, _y1}, .{0, 0}, .{_u1, _v1}); - drawSlice(.{_x1, _pos[1]}, .{_x2, _y1}, .{_u1, 0}, .{_u2, _v1}); - drawSlice(.{_x2, _pos[1]}, .{_x3, _y1}, .{_u2, 0}, .{1, _v1}); - drawSlice(.{_pos[0], _y1}, .{_x1, _y2}, .{0, _v1}, .{_u1, _v2}); - drawSlice(.{_x1, _y1}, .{_x2, _y2}, .{_u1, _v1}, .{_u2, _v2}); - drawSlice(.{_x2, _y1}, .{_x3, _y2}, .{_u2, _v1}, .{1, _v2}); - drawSlice(.{_pos[0], _y2}, .{_x1, _y3}, .{0, _v2}, .{_u1, 1}); - drawSlice(.{_x1, _y2}, .{_x2, _y3}, .{_u1, _v2}, .{_u2, 1}); - drawSlice(.{_x2, _y2}, .{_x3, _y3}, .{_u2, _v2}, .{1, 1}); + drawSlice(.{_pos[0], _pos[1]}, .{_pos[0] + leftSlice, _pos[1] + topSlice}, .{0, 0}, .{_u1, _v1}); + drawSlice(.{_pos[0] + leftSlice, _pos[1]}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + topSlice}, .{_u1, 0}, .{_u2, _v1}); + drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1]}, .{_pos[0] + _dim[0], _pos[1] + topSlice}, .{_u2, 0}, .{1, _v1}); + drawSlice(.{_pos[0], _pos[1] + topSlice}, .{_pos[0] + leftSlice, _pos[1] + _dim[1] - bottomSlice}, .{0, _v1}, .{_u1, _v2}); + drawSlice(.{_pos[0] + leftSlice, _pos[1] + topSlice}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1] - bottomSlice}, .{_u1, _v1}, .{_u2, _v2}); + drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1] + topSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1] - bottomSlice}, .{_u2, _v1}, .{1, _v2}); + drawSlice(.{_pos[0], _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + leftSlice, _pos[1] + _dim[1]}, .{0, _v2}, .{_u1, 1}); + drawSlice(.{_pos[0] + leftSlice, _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1]}, .{_u1, _v2}, .{_u2, 1}); + drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1]}, .{_u2, _v2}, .{1, 1}); } pub fn customShadedImage(uniforms: anytype, _pos: Vec2f, _dim: Vec2f) void { From 4dd6279142ea8ad352b43e3d8c744781a465f61b Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Sun, 28 Jun 2026 14:55:44 +0200 Subject: [PATCH 10/14] "Small" Modifications to tooltip rendering --- assets/cubyz/ui/tooltip_background.png | Bin 153 -> 127 bytes src/graphics.zig | 32 +++++++------- src/gui/components/Button.zig | 4 +- src/gui/components/Label.zig | 2 +- src/gui/gui.zig | 23 +--------- src/gui/tooltip.zig | 56 ++++++++++++++++++------- 6 files changed, 60 insertions(+), 57 deletions(-) diff --git a/assets/cubyz/ui/tooltip_background.png b/assets/cubyz/ui/tooltip_background.png index f6d0231cfaa9473fce2afe62620a7bdc748bef5c..a0c1d5307fee930038b9f8468e103cf0fc1706e1 100644 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=6Hgb%kP60}?t`2R3Ovl`AMw4j zpJ&Z6i-S>K>|LR6&`q@DGnHiR^ W;Ez<9wRtK~gu&C*&t;ucLK6Vm1SAXq literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqex5FlAr*{kdN*<%P~c%*zcPAZ z@WTK9D_i|q^SY!quShW|ki2Irw9xOtIk`|pEv5I*7p{xFpthv`$fb1&2lq@D`^H@L wW~R$L-GaGtuRu2a|6lT#ofXJn1DVXskh)H7Ez?m47oZ4(r>mdKI;Vst0ELn?jQ{`u diff --git a/src/graphics.zig b/src/graphics.zig index 6b9ed3cb80..da3f387bdb 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -474,28 +474,24 @@ pub const draw = struct { // MARK: draw boundSubImage(_destMin, _destMax - _destMin, _uvMin, _uvMax - _uvMin); } - pub fn bound9SliceImage(_pos: Vec2f, _dim: Vec2f, _textureSize: Vec2f, _sliceCenter: Vec4f, _sliceScale: f32) void { - const leftSlice = _sliceCenter[0]*_sliceScale; - const rightSlice = _sliceCenter[1]*_sliceScale; - const topSlice = _sliceCenter[2]*_sliceScale; - const bottomSlice = _sliceCenter[3]*_sliceScale; + pub fn bound9SliceImage(_pos: Vec2f, _dim: Vec2f, _textureSize: Vec2f, _slices: Vec2f, _sliceScale: f32) void { + const widthSlice = _slices[0]*_sliceScale; + const heightSlice = _slices[1]*_sliceScale; // Construct UV - const _u1 = _sliceCenter[0]/_textureSize[0]; - const _u2 = (_textureSize[0] - _sliceCenter[1])/_textureSize[0]; - const _v1 = _sliceCenter[2]/_textureSize[1]; - const _v2 = (_textureSize[1] - _sliceCenter[3])/_textureSize[1]; + const u: Vec2f = .{_slices[0]/_textureSize[0], (_textureSize[0] - _slices[0])/_textureSize[0]}; + const v: Vec2f = .{_slices[1]/_textureSize[1], (_textureSize[1] - _slices[1])/_textureSize[1]}; // Draw all Slices - drawSlice(.{_pos[0], _pos[1]}, .{_pos[0] + leftSlice, _pos[1] + topSlice}, .{0, 0}, .{_u1, _v1}); - drawSlice(.{_pos[0] + leftSlice, _pos[1]}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + topSlice}, .{_u1, 0}, .{_u2, _v1}); - drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1]}, .{_pos[0] + _dim[0], _pos[1] + topSlice}, .{_u2, 0}, .{1, _v1}); - drawSlice(.{_pos[0], _pos[1] + topSlice}, .{_pos[0] + leftSlice, _pos[1] + _dim[1] - bottomSlice}, .{0, _v1}, .{_u1, _v2}); - drawSlice(.{_pos[0] + leftSlice, _pos[1] + topSlice}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1] - bottomSlice}, .{_u1, _v1}, .{_u2, _v2}); - drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1] + topSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1] - bottomSlice}, .{_u2, _v1}, .{1, _v2}); - drawSlice(.{_pos[0], _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + leftSlice, _pos[1] + _dim[1]}, .{0, _v2}, .{_u1, 1}); - drawSlice(.{_pos[0] + leftSlice, _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1]}, .{_u1, _v2}, .{_u2, 1}); - drawSlice(.{_pos[0] + _dim[0] - rightSlice, _pos[1] + _dim[1] - bottomSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1]}, .{_u2, _v2}, .{1, 1}); + drawSlice(.{_pos[0], _pos[1]}, .{_pos[0] + widthSlice, _pos[1] + heightSlice}, .{0, 0}, .{u[0], v[0]}); + drawSlice(.{_pos[0] + widthSlice, _pos[1]}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + heightSlice}, .{u[0], 0}, .{u[1], v[0]}); + drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1]}, .{_pos[0] + _dim[0], _pos[1] + heightSlice}, .{u[1], 0}, .{1, v[0]}); + drawSlice(.{_pos[0], _pos[1] + heightSlice}, .{_pos[0] + widthSlice, _pos[1] + _dim[1] - heightSlice}, .{0, v[0]}, .{u[0], v[1]}); + drawSlice(.{_pos[0] + widthSlice, _pos[1] + heightSlice}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1] - heightSlice}, .{u[0], v[0]}, .{u[1], v[1]}); + drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1] + heightSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1] - heightSlice}, .{u[1], v[0]}, .{1, v[1]}); + drawSlice(.{_pos[0], _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + widthSlice, _pos[1] + _dim[1]}, .{0, v[1]}, .{u[0], 1}); + drawSlice(.{_pos[0] + widthSlice, _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1]}, .{u[0], v[1]}, .{u[1], 1}); + drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1]}, .{u[1], v[1]}, .{1, 1}); } pub fn customShadedImage(uniforms: anytype, _pos: Vec2f, _dim: Vec2f) void { diff --git a/src/gui/components/Button.zig b/src/gui/components/Button.zig index 457264adb7..a6ad6de5ff 100644 --- a/src/gui/components/Button.zig +++ b/src/gui/components/Button.zig @@ -163,8 +163,10 @@ pub fn render(self: *Button, mousePosition: Vec2f) void { draw.customShadedRect(buttonUniforms, self.pos + Vec2f{2, 2}, self.size - Vec2f{4, 4}); } + const cornerSize = (textures.outlineTextureSize - Vec2f{1, 1})/Vec2f{2, 2}; + textures.outlineTexture.bindTo(0); - graphics.draw.bound9SliceImage(self.pos, self.size, textures.outlineTextureSize, .{2, 2, 2, 2}, 2); + graphics.draw.bound9SliceImage(self.pos, self.size, textures.outlineTextureSize, cornerSize, 2); const oldColor = draw.setColor(if (self.disabled) 0xff808080 else 0xffffffff); defer draw.restoreColor(oldColor); diff --git a/src/gui/components/Label.zig b/src/gui/components/Label.zig index 8eabcf864e..956192c491 100644 --- a/src/gui/components/Label.zig +++ b/src/gui/components/Label.zig @@ -12,7 +12,7 @@ const GuiComponent = gui.GuiComponent; const Label = @This(); -pub const fontSize: f32 = 16; +const fontSize: f32 = 16; pos: Vec2f, size: Vec2f, diff --git a/src/gui/gui.zig b/src/gui/gui.zig index a239898637..399a422cf1 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -788,28 +788,7 @@ pub const inventory = struct { // MARK: inventory const hovered = hoveredItemSlot orelse return; if (carried.getAmount(0) == 0) { if (hovered.inventory.getItem(hovered.itemSlot).getTooltip()) |tooltipContent| { - var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, tooltipContent, .left); - var size = label.text.calculateLineBreaks(GuiComponent.Label.fontSize, 300); - size[0] = 0; - for (label.text.lineBreaks.items) |lineBreak| { - size[0] = @max(size[0], lineBreak.width); - } - label.size = size; - - const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(scale)); - var pos = mousePos; - var alignment: graphics.TextBuffer.Alignment = .right; - if (pos[0] + size[0] + tooltip.tooltipSliceCenter[0]*2 + tooltip.tooltipSliceCenter[1] >= windowSize[0]) { - alignment = .left; - } - pos[1] = @min(pos[1] - GuiComponent.Label.fontSize, windowSize[1] - size[1] - tooltip.tooltipSliceCenter[2] - tooltip.tooltipSliceCenter[3]); - - var list = GuiComponent.VerticalList.init(Vec2f{0, 0}, 360, tooltip.tooltipSliceCenter[2]); - list.add(label); - list.finish(.left); - var component: GuiComponent = .{.verticalList = list}; - defer component.deinit(); - tooltip.render(&component, pos, alignment); + tooltip.renderFromText(tooltipContent, mousePos, .right); } } } diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index f92a994094..f8dfc9843b 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -11,35 +11,61 @@ const gui = @import("gui.zig"); const GuiComponent = gui.GuiComponent; var tooltipTexture: Texture = undefined; -pub const tooltipSliceCenter: Vec4f = .{3, 3, 3, 3}; +var cornerSize: Vec2f = undefined; + +const fontSize: f32 = 16; +const offsetFromMouse: f32 = 4; pub fn globalInit() void { tooltipTexture = Texture.initFromFile("assets/cubyz/ui/tooltip_background.png"); + cornerSize = (@as(Vec2f, @floatFromInt(tooltipTexture.size())) - Vec2f{1, 1})/Vec2f{2, 2}; } pub fn globalDeinit() void { tooltipTexture.deinit(); } +fn posFromAlignment(pos: Vec2f, size: Vec2f, alignment: graphics.TextBuffer.Alignment) Vec2f { + return switch (alignment) { + .right => pos + Vec2f{offsetFromMouse, 0}, + .left => pos - Vec2f{size[0] + cornerSize[0]*2, 0}, + .center => pos - Vec2f{size[0]/2, 0}, + }; +} + pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextBuffer.Alignment) void { - const size = guicomponent.size(); + const size = guicomponent.size() + Vec2f{cornerSize[0]*2, cornerSize[1]*2}; tooltipTexture.bindTo(0); - var renderpos = pos; - switch (alignment) { - .right => { - renderpos = pos + Vec2f{tooltipSliceCenter[0], 0}; - }, - .left => { - renderpos = pos - Vec2f{size[0] + tooltipSliceCenter[0]*2 + tooltipSliceCenter[1], 0}; - }, - .center => { - renderpos = pos - Vec2f{size[0]/2, 0}; - }, + const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(gui.scale)); + var renderpos = posFromAlignment(pos, size, alignment); + if (alignment == .center and renderpos[0] + size[0]/2 > windowSize[0]) { + renderpos = posFromAlignment(pos, size, .left); + } else if (renderpos[0] + size[0] > windowSize[0]) { + renderpos = posFromAlignment(pos, size, .left); + } else if (renderpos[0] < 0) { + renderpos = posFromAlignment(pos, size, .right); + } + if (renderpos[1] + size[1] > windowSize[1]) { + renderpos[1] += windowSize[1] - (renderpos[1] + size[1]); } - draw.bound9SliceImage(renderpos, size + Vec2f{tooltipSliceCenter[0] + tooltipSliceCenter[1], tooltipSliceCenter[2] + tooltipSliceCenter[3]}, @floatFromInt(tooltipTexture.size()), tooltipSliceCenter, 1); + draw.bound9SliceImage(renderpos, size, @floatFromInt(tooltipTexture.size()), cornerSize, 1); - guicomponent.mutPos().* = renderpos + Vec2f{tooltipSliceCenter[0], tooltipSliceCenter[2]}; + guicomponent.mutPos().* = renderpos + Vec2f{cornerSize[0], cornerSize[1]}; guicomponent.render(pos); } + +pub fn renderFromText(text: []const u8, pos: Vec2f, alignment: graphics.TextBuffer.Alignment) void { + var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, text, .left); + var size = label.text.calculateLineBreaks(fontSize, 300); + size[0] = 0; + for (label.text.lineBreaks.items) |lineBreak| { + size[0] = @max(size[0], lineBreak.width); + } + label.size = size; + + var component = GuiComponent{.label = label}; + defer component.deinit(); + render(&component, pos, alignment); +} From 79b72fa22c32f71b6c9a4b23f3523e2ec3f5ab16 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:06:46 +0200 Subject: [PATCH 11/14] merge repeating if statement --- src/gui/tooltip.zig | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index f8dfc9843b..a9e3314baf 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -39,9 +39,7 @@ pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextB const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(gui.scale)); var renderpos = posFromAlignment(pos, size, alignment); - if (alignment == .center and renderpos[0] + size[0]/2 > windowSize[0]) { - renderpos = posFromAlignment(pos, size, .left); - } else if (renderpos[0] + size[0] > windowSize[0]) { + if ((alignment == .center and renderpos[0] + size[0]/2 > windowSize[0]) or renderpos[0] + size[0] > windowSize[0]) { renderpos = posFromAlignment(pos, size, .left); } else if (renderpos[0] < 0) { renderpos = posFromAlignment(pos, size, .right); From 1fd0df10f70ca50625a0c327632a56528c4626f9 Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Sun, 28 Jun 2026 16:18:24 +0200 Subject: [PATCH 12/14] quantum changes 2 --- src/graphics.zig | 32 ++++++++++++++++---------------- src/gui/gui.zig | 4 ++-- src/gui/tooltip.zig | 36 +++++++++++++++--------------------- 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/graphics.zig b/src/graphics.zig index da3f387bdb..d933a68ead 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -470,28 +470,28 @@ pub const draw = struct { // MARK: draw c.glDrawArrays(c.GL_TRIANGLE_STRIP, 0, 4); } - pub fn drawSlice(_destMin: Vec2f, _destMax: Vec2f, _uvMin: Vec2f, _uvMax: Vec2f) void { - boundSubImage(_destMin, _destMax - _destMin, _uvMin, _uvMax - _uvMin); + pub fn drawSlice(destMin: Vec2f, destMax: Vec2f, uvMin: Vec2f, uvMax: Vec2f) void { + boundSubImage(destMin, destMax - destMin, uvMin, uvMax - uvMin); } - pub fn bound9SliceImage(_pos: Vec2f, _dim: Vec2f, _textureSize: Vec2f, _slices: Vec2f, _sliceScale: f32) void { - const widthSlice = _slices[0]*_sliceScale; - const heightSlice = _slices[1]*_sliceScale; + pub fn bound9SliceImage(pos: Vec2f, dim: Vec2f, textureSize: Vec2f, slices: Vec2f, sliceScale: f32) void { + const widthSlice = slices[0]*sliceScale; + const heightSlice = slices[1]*sliceScale; // Construct UV - const u: Vec2f = .{_slices[0]/_textureSize[0], (_textureSize[0] - _slices[0])/_textureSize[0]}; - const v: Vec2f = .{_slices[1]/_textureSize[1], (_textureSize[1] - _slices[1])/_textureSize[1]}; + const u: Vec2f = .{slices[0]/textureSize[0], (textureSize[0] - slices[0])/textureSize[0]}; + const v: Vec2f = .{slices[1]/textureSize[1], (textureSize[1] - slices[1])/textureSize[1]}; // Draw all Slices - drawSlice(.{_pos[0], _pos[1]}, .{_pos[0] + widthSlice, _pos[1] + heightSlice}, .{0, 0}, .{u[0], v[0]}); - drawSlice(.{_pos[0] + widthSlice, _pos[1]}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + heightSlice}, .{u[0], 0}, .{u[1], v[0]}); - drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1]}, .{_pos[0] + _dim[0], _pos[1] + heightSlice}, .{u[1], 0}, .{1, v[0]}); - drawSlice(.{_pos[0], _pos[1] + heightSlice}, .{_pos[0] + widthSlice, _pos[1] + _dim[1] - heightSlice}, .{0, v[0]}, .{u[0], v[1]}); - drawSlice(.{_pos[0] + widthSlice, _pos[1] + heightSlice}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1] - heightSlice}, .{u[0], v[0]}, .{u[1], v[1]}); - drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1] + heightSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1] - heightSlice}, .{u[1], v[0]}, .{1, v[1]}); - drawSlice(.{_pos[0], _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + widthSlice, _pos[1] + _dim[1]}, .{0, v[1]}, .{u[0], 1}); - drawSlice(.{_pos[0] + widthSlice, _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1]}, .{u[0], v[1]}, .{u[1], 1}); - drawSlice(.{_pos[0] + _dim[0] - widthSlice, _pos[1] + _dim[1] - heightSlice}, .{_pos[0] + _dim[0], _pos[1] + _dim[1]}, .{u[1], v[1]}, .{1, 1}); + drawSlice(.{pos[0], pos[1]}, .{pos[0] + widthSlice, pos[1] + heightSlice}, .{0, 0}, .{u[0], v[0]}); + drawSlice(.{pos[0] + widthSlice, pos[1]}, .{pos[0] + dim[0] - widthSlice, pos[1] + heightSlice}, .{u[0], 0}, .{u[1], v[0]}); + drawSlice(.{pos[0] + dim[0] - widthSlice, pos[1]}, .{pos[0] + dim[0], pos[1] + heightSlice}, .{u[1], 0}, .{1, v[0]}); + drawSlice(.{pos[0], pos[1] + heightSlice}, .{pos[0] + widthSlice, pos[1] + dim[1] - heightSlice}, .{0, v[0]}, .{u[0], v[1]}); + drawSlice(.{pos[0] + widthSlice, pos[1] + heightSlice}, .{pos[0] + dim[0] - widthSlice, pos[1] + dim[1] - heightSlice}, .{u[0], v[0]}, .{u[1], v[1]}); + drawSlice(.{pos[0] + dim[0] - widthSlice, pos[1] + heightSlice}, .{pos[0] + dim[0], pos[1] + dim[1] - heightSlice}, .{u[1], v[0]}, .{1, v[1]}); + drawSlice(.{pos[0], pos[1] + dim[1] - heightSlice}, .{pos[0] + widthSlice, pos[1] + dim[1]}, .{0, v[1]}, .{u[0], 1}); + drawSlice(.{pos[0] + widthSlice, pos[1] + dim[1] - heightSlice}, .{pos[0] + dim[0] - widthSlice, pos[1] + dim[1]}, .{u[0], v[1]}, .{u[1], 1}); + drawSlice(.{pos[0] + dim[0] - widthSlice, pos[1] + dim[1] - heightSlice}, .{pos[0] + dim[0], pos[1] + dim[1]}, .{u[1], v[1]}, .{1, 1}); } pub fn customShadedImage(uniforms: anytype, _pos: Vec2f, _dim: Vec2f) void { diff --git a/src/gui/gui.zig b/src/gui/gui.zig index 399a422cf1..88af8bf9a8 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -19,11 +19,11 @@ const ScrollBar = @import("components/ScrollBar.zig"); const ContinuousSlider = @import("components/ContinuousSlider.zig"); const DiscreteSlider = @import("components/DiscreteSlider.zig"); const TextInput = @import("components/TextInput.zig"); -const tooltip = @import("tooltip.zig"); const gui_component = @import("gui_component.zig"); pub const GuiComponent = gui_component.GuiComponent; pub const GuiWindow = @import("GuiWindow.zig"); +pub const tooltip = @import("tooltip.zig"); pub const windowlist = @import("windows/_list.zig"); const gamepad_cursor = @import("gamepad_cursor.zig"); @@ -788,7 +788,7 @@ pub const inventory = struct { // MARK: inventory const hovered = hoveredItemSlot orelse return; if (carried.getAmount(0) == 0) { if (hovered.inventory.getItem(hovered.itemSlot).getTooltip()) |tooltipContent| { - tooltip.renderFromText(tooltipContent, mousePos, .right); + tooltip.renderFromText(tooltipContent, mousePos); } } } diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index a9e3314baf..c171472f59 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -7,7 +7,7 @@ const Texture = graphics.Texture; const vec = main.vec; const Vec2f = vec.Vec2f; const Vec4f = vec.Vec4f; -const gui = @import("gui.zig"); +const gui = main.gui; const GuiComponent = gui.GuiComponent; var tooltipTexture: Texture = undefined; @@ -25,24 +25,14 @@ pub fn globalDeinit() void { tooltipTexture.deinit(); } -fn posFromAlignment(pos: Vec2f, size: Vec2f, alignment: graphics.TextBuffer.Alignment) Vec2f { - return switch (alignment) { - .right => pos + Vec2f{offsetFromMouse, 0}, - .left => pos - Vec2f{size[0] + cornerSize[0]*2, 0}, - .center => pos - Vec2f{size[0]/2, 0}, - }; -} - -pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextBuffer.Alignment) void { +pub fn render(guicomponent: *GuiComponent, pos: Vec2f) void { const size = guicomponent.size() + Vec2f{cornerSize[0]*2, cornerSize[1]*2}; tooltipTexture.bindTo(0); const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(gui.scale)); - var renderpos = posFromAlignment(pos, size, alignment); - if ((alignment == .center and renderpos[0] + size[0]/2 > windowSize[0]) or renderpos[0] + size[0] > windowSize[0]) { - renderpos = posFromAlignment(pos, size, .left); - } else if (renderpos[0] < 0) { - renderpos = posFromAlignment(pos, size, .right); + var renderpos = pos + Vec2f{offsetFromMouse, 0}; + if (renderpos[0] + size[0] > windowSize[0]) { + renderpos = pos - Vec2f{size[0] + cornerSize[0]*2, 0}; } if (renderpos[1] + size[1] > windowSize[1]) { renderpos[1] += windowSize[1] - (renderpos[1] + size[1]); @@ -50,12 +40,17 @@ pub fn render(guicomponent: *GuiComponent, pos: Vec2f, alignment: graphics.TextB draw.bound9SliceImage(renderpos, size, @floatFromInt(tooltipTexture.size()), cornerSize, 1); - guicomponent.mutPos().* = renderpos + Vec2f{cornerSize[0], cornerSize[1]}; - guicomponent.render(pos); + const adjustment = Vec2f{cornerSize[0], cornerSize[1]}; + const oldTranslation = draw.setTranslation(renderpos + adjustment); + defer draw.restoreTranslation(oldTranslation); + const oldClip = draw.setClip(guicomponent.size()); + defer draw.restoreClip(oldClip); + guicomponent.render(guicomponent.pos() + adjustment); } -pub fn renderFromText(text: []const u8, pos: Vec2f, alignment: graphics.TextBuffer.Alignment) void { +pub fn renderFromText(text: []const u8, pos: Vec2f) void { var label = GuiComponent.Label.init(Vec2f{0, 0}, 300, text, .left); + defer label.deinit(); var size = label.text.calculateLineBreaks(fontSize, 300); size[0] = 0; for (label.text.lineBreaks.items) |lineBreak| { @@ -63,7 +58,6 @@ pub fn renderFromText(text: []const u8, pos: Vec2f, alignment: graphics.TextBuff } label.size = size; - var component = GuiComponent{.label = label}; - defer component.deinit(); - render(&component, pos, alignment); + var component = label.toComponent(); + render(&component, pos); } From 7d62c4ec29f67b2b47bbec55f8c07e2726f7c18f Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Sun, 28 Jun 2026 16:37:34 +0200 Subject: [PATCH 13/14] fixed adjustment not considering existing position --- src/gui/tooltip.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index c171472f59..5d793ce3fa 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -40,12 +40,12 @@ pub fn render(guicomponent: *GuiComponent, pos: Vec2f) void { draw.bound9SliceImage(renderpos, size, @floatFromInt(tooltipTexture.size()), cornerSize, 1); - const adjustment = Vec2f{cornerSize[0], cornerSize[1]}; - const oldTranslation = draw.setTranslation(renderpos + adjustment); + const adjustment = renderpos - guicomponent.pos() + Vec2f{cornerSize[0], cornerSize[1]}; + const oldTranslation = draw.setTranslation(adjustment); defer draw.restoreTranslation(oldTranslation); const oldClip = draw.setClip(guicomponent.size()); defer draw.restoreClip(oldClip); - guicomponent.render(guicomponent.pos() + adjustment); + guicomponent.render(guicomponent.pos()); } pub fn renderFromText(text: []const u8, pos: Vec2f) void { From ea4b4bcbbaf7f1453e0d67ea9ce1d8de2c1f3e5e Mon Sep 17 00:00:00 2001 From: SpellDigger <123126610+SpellDigger@users.noreply.github.com> Date: Sun, 5 Jul 2026 18:28:27 +0200 Subject: [PATCH 14/14] Quantum Suggestions --- src/graphics.zig | 2 +- src/gui/tooltip.zig | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/graphics.zig b/src/graphics.zig index d933a68ead..bb1f852881 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -470,7 +470,7 @@ pub const draw = struct { // MARK: draw c.glDrawArrays(c.GL_TRIANGLE_STRIP, 0, 4); } - pub fn drawSlice(destMin: Vec2f, destMax: Vec2f, uvMin: Vec2f, uvMax: Vec2f) void { + fn drawSlice(destMin: Vec2f, destMax: Vec2f, uvMin: Vec2f, uvMax: Vec2f) void { boundSubImage(destMin, destMax - destMin, uvMin, uvMax - uvMin); } diff --git a/src/gui/tooltip.zig b/src/gui/tooltip.zig index 5d793ce3fa..02a47ca45c 100644 --- a/src/gui/tooltip.zig +++ b/src/gui/tooltip.zig @@ -25,27 +25,28 @@ pub fn globalDeinit() void { tooltipTexture.deinit(); } -pub fn render(guicomponent: *GuiComponent, pos: Vec2f) void { - const size = guicomponent.size() + Vec2f{cornerSize[0]*2, cornerSize[1]*2}; +pub fn render(guiComponent: *GuiComponent, pos: Vec2f) void { + const size = guiComponent.size() + Vec2f{cornerSize[0]*2, cornerSize[1]*2}; tooltipTexture.bindTo(0); const windowSize = main.Window.getWindowSize()/@as(Vec2f, @splat(gui.scale)); - var renderpos = pos + Vec2f{offsetFromMouse, 0}; - if (renderpos[0] + size[0] > windowSize[0]) { - renderpos = pos - Vec2f{size[0] + cornerSize[0]*2, 0}; + var renderPos = pos + Vec2f{offsetFromMouse, 0}; + if (renderPos[0] + size[0] > windowSize[0]) { + renderPos = pos - Vec2f{size[0] + cornerSize[0]*2, 0}; } - if (renderpos[1] + size[1] > windowSize[1]) { - renderpos[1] += windowSize[1] - (renderpos[1] + size[1]); + renderPos = @max(Vec2f{0, 0}, renderPos); + if (renderPos[1] + size[1] > windowSize[1]) { + renderPos[1] += windowSize[1] - (renderPos[1] + size[1]); } - draw.bound9SliceImage(renderpos, size, @floatFromInt(tooltipTexture.size()), cornerSize, 1); + draw.bound9SliceImage(renderPos, size, @floatFromInt(tooltipTexture.size()), cornerSize, 1); - const adjustment = renderpos - guicomponent.pos() + Vec2f{cornerSize[0], cornerSize[1]}; + const adjustment = renderPos - guiComponent.pos() + Vec2f{cornerSize[0], cornerSize[1]}; const oldTranslation = draw.setTranslation(adjustment); defer draw.restoreTranslation(oldTranslation); - const oldClip = draw.setClip(guicomponent.size()); + const oldClip = draw.setClip(guiComponent.size()); defer draw.restoreClip(oldClip); - guicomponent.render(guicomponent.pos()); + guiComponent.render(guiComponent.pos()); } pub fn renderFromText(text: []const u8, pos: Vec2f) void {