From ee8cf4fa67785982da93065948e7db25d1614342 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 13:13:23 +0000 Subject: [PATCH 1/3] Initial plan From f5ca039223fae77698ba39c2898b03f45307d205 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:46:40 +0000 Subject: [PATCH 2/3] Fix item export resolution not scaling with size parameter Agent-Logs-Url: https://github.com/CyclopsMC/IconExporter/sessions/6001cadd-a522-48b8-8f45-57605a0bf0eb Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com> --- .../client/gui/ScreenIconExporter.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java b/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java index 21ef950..16ac678 100644 --- a/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java +++ b/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java @@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.fog.FogRenderer; +import net.minecraft.client.renderer.state.WindowRenderState; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.Tag; @@ -98,8 +99,13 @@ protected boolean shouldExport(Identifier resourceLocation) { } public Queue createExportTasks() { - float scaleModified = (float) (this.scaleImage / this.scaleGui); - int scaleModifiedRounded = (int) Math.ceil(scaleModified); + // Compute a guiScale that makes the item atlas render at scaleImage pixels per slot. + // GuiRenderer uses slotTextureSize = 16 * guiScale, so guiScale = scaleImage / 16 gives + // slotTextureSize = scaleImage. With this guiScale, items drawn at natural 16x16 GUI units + // will occupy exactly scaleImage x scaleImage physical pixels. + int newGuiScale = Math.max(1, this.scaleImage / 16); + // Natural item slot size in GUI units (rendered at newGuiScale px/unit = scaleImage px). + int drawSize = 16; // Initialize our output folder File baseDir = new File(Minecraft.getInstance().gameDirectory, "icon-exports-x" + this.scaleImage); @@ -118,9 +124,13 @@ public Queue createExportTasks() { exportTasks.add((guiGraphics) -> { taskProcessed.set(taskProcessed.get() + 1); signalStatus(tasks, taskProcessed); - guiGraphics.fill(0, 0, scaleModifiedRounded, scaleModifiedRounded, BACKGROUND_COLOR); - ItemRenderUtil.renderFluid(guiGraphics, fluidEntry.getValue(), scaleModified, this.helpers); + WindowRenderState windowRenderState = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState; + int originalGuiScale = windowRenderState.guiScale; + windowRenderState.guiScale = newGuiScale; + guiGraphics.fill(0, 0, drawSize, drawSize, BACKGROUND_COLOR); + ItemRenderUtil.renderFluid(guiGraphics, fluidEntry.getValue(), drawSize, this.helpers); flushRenderBuffer(); + windowRenderState.guiScale = originalGuiScale; ImageExportUtil.exportImageFromScreenshot(baseDir, baseFilename, this.scaleImage, BACKGROUND_COLOR, this.mod); }); } @@ -140,9 +150,13 @@ public Queue createExportTasks() { exportTasks.add((guiGraphics) -> { taskProcessed.set(taskProcessed.get() + 1); signalStatus(tasks, taskProcessed); - guiGraphics.fill(0, 0, scaleModifiedRounded, scaleModifiedRounded, BACKGROUND_COLOR); - ItemRenderUtil.renderItem(guiGraphics, itemStack, scaleModified); + WindowRenderState windowRenderState = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState; + int originalGuiScale = windowRenderState.guiScale; + windowRenderState.guiScale = newGuiScale; + guiGraphics.fill(0, 0, drawSize, drawSize, BACKGROUND_COLOR); + ItemRenderUtil.renderItem(guiGraphics, itemStack, drawSize); flushRenderBuffer(); + windowRenderState.guiScale = originalGuiScale; ImageExportUtil.exportImageFromScreenshot(baseDir, baseFilename, this.scaleImage, BACKGROUND_COLOR, this.mod); if (!itemStack.getComponents().isEmpty() && GeneralConfig.fileNameHashComponents) { ImageExportUtil.exportNbtFile(lookupProvider, baseDir, baseFilename, itemStack.getComponentsPatch(), this.mod, this.helpers); From 5f82500b34357681d836819bef0a02df21889c46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:58:31 +0000 Subject: [PATCH 3/3] Address code review: rename newGuiScale to exportGuiScale, capture windowRenderState once Agent-Logs-Url: https://github.com/CyclopsMC/IconExporter/sessions/6001cadd-a522-48b8-8f45-57605a0bf0eb Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com> --- .../iconexporter/client/gui/ScreenIconExporter.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java b/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java index 16ac678..7ec0d18 100644 --- a/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java +++ b/loader-common/src/main/java/org/cyclops/iconexporter/client/gui/ScreenIconExporter.java @@ -103,9 +103,11 @@ public Queue createExportTasks() { // GuiRenderer uses slotTextureSize = 16 * guiScale, so guiScale = scaleImage / 16 gives // slotTextureSize = scaleImage. With this guiScale, items drawn at natural 16x16 GUI units // will occupy exactly scaleImage x scaleImage physical pixels. - int newGuiScale = Math.max(1, this.scaleImage / 16); - // Natural item slot size in GUI units (rendered at newGuiScale px/unit = scaleImage px). + int exportGuiScale = Math.max(1, this.scaleImage / 16); + // Natural item slot size in GUI units (rendered at exportGuiScale px/unit = scaleImage px). int drawSize = 16; + // Captured once; windowRenderState is a stable final field of the singleton GameRenderState. + WindowRenderState windowRenderState = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState; // Initialize our output folder File baseDir = new File(Minecraft.getInstance().gameDirectory, "icon-exports-x" + this.scaleImage); @@ -124,9 +126,8 @@ public Queue createExportTasks() { exportTasks.add((guiGraphics) -> { taskProcessed.set(taskProcessed.get() + 1); signalStatus(tasks, taskProcessed); - WindowRenderState windowRenderState = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState; int originalGuiScale = windowRenderState.guiScale; - windowRenderState.guiScale = newGuiScale; + windowRenderState.guiScale = exportGuiScale; guiGraphics.fill(0, 0, drawSize, drawSize, BACKGROUND_COLOR); ItemRenderUtil.renderFluid(guiGraphics, fluidEntry.getValue(), drawSize, this.helpers); flushRenderBuffer(); @@ -150,9 +151,8 @@ public Queue createExportTasks() { exportTasks.add((guiGraphics) -> { taskProcessed.set(taskProcessed.get() + 1); signalStatus(tasks, taskProcessed); - WindowRenderState windowRenderState = Minecraft.getInstance().gameRenderer.getGameRenderState().windowRenderState; int originalGuiScale = windowRenderState.guiScale; - windowRenderState.guiScale = newGuiScale; + windowRenderState.guiScale = exportGuiScale; guiGraphics.fill(0, 0, drawSize, drawSize, BACKGROUND_COLOR); ItemRenderUtil.renderItem(guiGraphics, itemStack, drawSize); flushRenderBuffer();