From a908aca56331c180dbdd31f48a3849ffcc8672cf Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 23 Dec 2024 12:45:02 -0800 Subject: [PATCH] kittygfx: z-index handling fixes Fixes #2921 Our z-index handling was pretty much completely broken, hence I can't think of a better initial commit message. We were splitting the placements at the wrong points and just generally putting images in the wrong z-index. I'm shocked this didn't come up earlier. --- src/renderer/Metal.zig | 21 +++++++++++---------- src/renderer/OpenGL.zig | 21 +++++++++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index fbd6c401b..acb4b4df5 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -1721,21 +1721,22 @@ fn prepKittyGraphics( }.lessThan, ); - // Find our indices - self.image_bg_end = 0; - self.image_text_end = 0; + // Find our indices. The values are sorted by z so we can find the + // first placement out of bounds to find the limits. + var bg_end: ?u32 = null; + var text_end: ?u32 = null; const bg_limit = std.math.minInt(i32) / 2; for (self.image_placements.items, 0..) |p, i| { - if (self.image_bg_end == 0 and p.z >= bg_limit) { - self.image_bg_end = @intCast(i); + if (bg_end == null and p.z >= bg_limit) { + bg_end = @intCast(i); } - if (self.image_text_end == 0 and p.z >= 0) { - self.image_text_end = @intCast(i); + if (text_end == null and p.z >= 0) { + text_end = @intCast(i); } } - if (self.image_text_end == 0) { - self.image_text_end = @intCast(self.image_placements.items.len); - } + + self.image_bg_end = bg_end orelse 0; + self.image_text_end = text_end orelse self.image_bg_end; } fn prepKittyVirtualPlacement( diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 481f5b0db..0a5179b56 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -952,21 +952,22 @@ fn prepKittyGraphics( }.lessThan, ); - // Find our indices - self.image_bg_end = 0; - self.image_text_end = 0; + // Find our indices. The values are sorted by z so we can find the + // first placement out of bounds to find the limits. + var bg_end: ?u32 = null; + var text_end: ?u32 = null; const bg_limit = std.math.minInt(i32) / 2; for (self.image_placements.items, 0..) |p, i| { - if (self.image_bg_end == 0 and p.z >= bg_limit) { - self.image_bg_end = @intCast(i); + if (bg_end == null and p.z >= bg_limit) { + bg_end = @intCast(i); } - if (self.image_text_end == 0 and p.z >= 0) { - self.image_text_end = @intCast(i); + if (text_end == null and p.z >= 0) { + text_end = @intCast(i); } } - if (self.image_text_end == 0) { - self.image_text_end = @intCast(self.image_placements.items.len); - } + + self.image_bg_end = bg_end orelse 0; + self.image_text_end = text_end orelse self.image_bg_end; } fn prepKittyVirtualPlacement(