From e2a2d2a9df95adee36c63d8bad80bd3ed23effd7 Mon Sep 17 00:00:00 2001 From: slprime <31038811+slprime@users.noreply.github.com> Date: Mon, 19 Oct 2026 15:47:52 +0300 Subject: [PATCH] Batch 9-slice quads in DrawableResource (#1082) --- .../java/codechicken/nei/GuiNEIButton.java | 40 ++-- .../codechicken/nei/config/IMCHandler.java | 6 +- .../nei/drawable/DrawableBuilder.java | 6 +- .../nei/drawable/DrawableResource.java | 188 ++++++++---------- .../codechicken/nei/recipe/HandlerInfo.java | 30 ++- 5 files changed, 145 insertions(+), 125 deletions(-) diff --git a/src/main/java/codechicken/nei/GuiNEIButton.java b/src/main/java/codechicken/nei/GuiNEIButton.java index 8039ac13..039e8957 100644 --- a/src/main/java/codechicken/nei/GuiNEIButton.java +++ b/src/main/java/codechicken/nei/GuiNEIButton.java @@ -7,40 +7,36 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import codechicken.nei.drawable.DrawableBuilder; +import codechicken.nei.drawable.DrawableResource; + public class GuiNEIButton extends GuiButton { protected static final ResourceLocation guiTex = new ResourceLocation("textures/gui/widgets.png"); + private static final DrawableResource[] BACKGROUNDS = new DrawableResource[3]; + + static { + for (int state = 0; state < BACKGROUNDS.length; state++) { + BACKGROUNDS[state] = new DrawableBuilder(guiTex, 0, 46 + state * 20, 200, 20).setSlices(2, 2, 2, 2).build(); + } + } public GuiNEIButton(int i, int j, int k, int l, int i1, String s) { super(i, j, k, l, i1, s); } + protected DrawableResource getBackground(int mouseX, int mouseY, boolean mouseOver) { + return BACKGROUNDS[getHoverState(mouseOver)]; + } + public void drawButton(Minecraft minecraft, int x, int y) { if (!visible) return; - minecraft.renderEngine.bindTexture(guiTex); - GL11.glColor4f(1, 1, 1, 1); boolean mouseOver = x >= xPosition && y >= yPosition && x < xPosition + width && y < yPosition + height; - int k = getHoverState(mouseOver); - drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2); // top left - drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2); // top - // right - drawTexturedModalRect( - xPosition, - yPosition + height / 2, - 0, - 46 + k * 20 + 20 - height / 2, - width / 2, - height / 2); // bottom left - drawTexturedModalRect( - xPosition + width / 2, - yPosition + height / 2, - 200 - width / 2, - 46 + k * 20 + 20 - height / 2, - width / 2, - height / 2); // bottom right - mouseDragged(minecraft, x, y); + GL11.glColor4f(1, 1, 1, 1); + getBackground(x, y, mouseOver).draw(xPosition, yPosition, width, height); + mouseDragged(minecraft, x, y); drawContent(minecraft, x, y, mouseOver); } @@ -55,7 +51,7 @@ public class GuiNEIButton extends GuiButton { return ColorUtils.buttonLabelNormal.getColor(); } - protected void drawContent(Minecraft minecraft, int y, int x, boolean mouseOver) { + protected void drawContent(Minecraft minecraft, int x, int y, boolean mouseOver) { FontRenderer fontrenderer = minecraft.fontRenderer; int color = getTextColour(mouseOver); diff --git a/src/main/java/codechicken/nei/config/IMCHandler.java b/src/main/java/codechicken/nei/config/IMCHandler.java index 8fb56a4c..d4eee409 100644 --- a/src/main/java/codechicken/nei/config/IMCHandler.java +++ b/src/main/java/codechicken/nei/config/IMCHandler.java @@ -74,7 +74,11 @@ public class IMCHandler { tag.getInteger("imageX"), tag.getInteger("imageY"), tag.getInteger("imageWidth"), - tag.getInteger("imageHeight")); + tag.getInteger("imageHeight"), + tag.hasKey("imageTextureWidth") ? tag.getInteger("imageTextureWidth") + : HandlerInfo.DEFAULT_IMAGE_TEXTURE_SIZE, + tag.hasKey("imageTextureHeight") ? tag.getInteger("imageTextureHeight") + : HandlerInfo.DEFAULT_IMAGE_TEXTURE_SIZE); } if (!info.hasImageOrItem()) { final String itemName = tag.getString("itemName"); diff --git a/src/main/java/codechicken/nei/drawable/DrawableBuilder.java b/src/main/java/codechicken/nei/drawable/DrawableBuilder.java index f5355986..42a176fe 100644 --- a/src/main/java/codechicken/nei/drawable/DrawableBuilder.java +++ b/src/main/java/codechicken/nei/drawable/DrawableBuilder.java @@ -21,11 +21,15 @@ public class DrawableBuilder { private int sliceBottom = 0; public DrawableBuilder(String resourceLocation, int u, int v, int width, int height) { + this(new ResourceLocation(resourceLocation), u, v, width, height); + } + + public DrawableBuilder(ResourceLocation resource, int u, int v, int width, int height) { this.u = u; this.v = v; this.width = width; this.height = height; - this.resourceLocation = new ResourceLocation(resourceLocation); + this.resourceLocation = resource; } public DrawableBuilder setTextureSize(int width, int height) { diff --git a/src/main/java/codechicken/nei/drawable/DrawableResource.java b/src/main/java/codechicken/nei/drawable/DrawableResource.java index ccb47ecb..09ad9ac3 100644 --- a/src/main/java/codechicken/nei/drawable/DrawableResource.java +++ b/src/main/java/codechicken/nei/drawable/DrawableResource.java @@ -1,7 +1,7 @@ package codechicken.nei.drawable; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; @@ -73,6 +73,14 @@ public class DrawableResource extends Image { return height + paddingTop + paddingBottom; } + public int getTextureWidth() { + return this.textureWidth; + } + + public int getTextureHeight() { + return this.textureHeight; + } + public void bindTexture() { Minecraft.getMinecraft().getTextureManager().bindTexture(this.resourceLocation); } @@ -88,7 +96,10 @@ public class DrawableResource extends Image { GL11.glEnable(GL11.GL_TEXTURE_2D); bindTexture(); - drawModalRectWithCustomSizedTexture(xOffset + maskLeft, yOffset + maskTop, maskLeft, maskTop, width, height); + final Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + addQuad(tessellator, xOffset + maskLeft, yOffset + maskTop, maskLeft, maskTop, width, height); + tessellator.draw(); if (!is2DTexture) GL11.glDisable(GL11.GL_TEXTURE_2D); } @@ -118,14 +129,30 @@ public class DrawableResource extends Image { GL11.glEnable(GL11.GL_TEXTURE_2D); bindTexture(); - // middle parts + final Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + for (int tileW = 0; tileW <= tileWidthCount; tileW++) { final int tileWidthSize = (tileW == tileWidthCount) ? remainderWidth : middleWidth; final int x = xOffset + sliceLeft + tileW * middleWidth; + // border top + addQuad(tessellator, x, yOffset, sliceLeft, 0, tileWidthSize, sliceTop); + // border bottom + addQuad( + tessellator, + x, + yOffset + sliceTop + tileHeight, + sliceLeft, + sliceTop + middleHeight, + tileWidthSize, + sliceBottom); + + // middle parts for (int tileH = 0; tileH <= tileHeightCount; tileH++) { final int tileHeightSize = (tileH == tileHeightCount) ? remainderHeight : middleHeight; - drawModalRectWithCustomSizedTexture( + addQuad( + tessellator, x, yOffset + sliceTop + tileH * middleHeight, sliceLeft, @@ -135,114 +162,75 @@ public class DrawableResource extends Image { } } - // border top - if (sliceTop > 0) { - for (int tileW = 0; tileW <= tileWidthCount; tileW++) { - final int tileWidthSize = (tileW == tileWidthCount) ? remainderWidth : middleWidth; - drawModalRectWithCustomSizedTexture( - xOffset + sliceLeft + tileW * middleWidth, - yOffset, - sliceLeft, - 0, - tileWidthSize, - sliceTop); - } - } + for (int tileH = 0; tileH <= tileHeightCount; tileH++) { + final int tileHeightSize = (tileH == tileHeightCount) ? remainderHeight : middleHeight; + final int y = yOffset + sliceTop + tileH * middleHeight; - // border bottom - if (sliceBottom > 0) { - for (int tileW = 0; tileW <= tileWidthCount; tileW++) { - final int tileWidthSize = (tileW == tileWidthCount) ? remainderWidth : middleWidth; - drawModalRectWithCustomSizedTexture( - xOffset + sliceLeft + tileW * middleWidth, - yOffset + sliceTop + tileHeight, - sliceLeft, - sliceTop + middleHeight, - tileWidthSize, - sliceBottom); - } - } - - // border left - if (sliceLeft > 0) { - for (int tileH = 0; tileH <= tileHeightCount; tileH++) { - final int tileHeightSize = (tileH == tileHeightCount) ? remainderHeight : middleHeight; - drawModalRectWithCustomSizedTexture( - xOffset, - yOffset + sliceTop + tileH * middleHeight, - 0, - sliceTop, - sliceLeft, - tileHeightSize); - } - } - - // border right - if (sliceRight > 0) { - for (int tileH = 0; tileH <= tileHeightCount; tileH++) { - final int tileHeightSize = (tileH == tileHeightCount) ? remainderHeight : middleHeight; - drawModalRectWithCustomSizedTexture( - xOffset + sliceLeft + tileWidth, - yOffset + sliceTop + tileH * middleHeight, - sliceLeft + middleWidth, - sliceTop, - sliceRight, - tileHeightSize); - } + // border left + addQuad(tessellator, xOffset, y, 0, sliceTop, sliceLeft, tileHeightSize); + // border right + addQuad( + tessellator, + xOffset + sliceLeft + tileWidth, + y, + sliceLeft + middleWidth, + sliceTop, + sliceRight, + tileHeightSize); } // angle left-top - if (sliceLeft > 0 && sliceTop > 0) { - drawModalRectWithCustomSizedTexture(xOffset, yOffset, 0, 0, sliceLeft, sliceTop); - } - + addQuad(tessellator, xOffset, yOffset, 0, 0, sliceLeft, sliceTop); // angle right-top - if (sliceRight > 0 && sliceTop > 0) { - drawModalRectWithCustomSizedTexture( - xOffset + sliceLeft + tileWidth, - yOffset, - sliceLeft + middleWidth, - 0, - sliceRight, - sliceTop); - } - + addQuad( + tessellator, + xOffset + sliceLeft + tileWidth, + yOffset, + sliceLeft + middleWidth, + 0, + sliceRight, + sliceTop); // angle left-bottom - if (sliceLeft > 0 && sliceBottom > 0) { - drawModalRectWithCustomSizedTexture( - xOffset, - yOffset + sliceTop + tileHeight, - 0, - sliceTop + middleHeight, - sliceLeft, - sliceBottom); - } - + addQuad( + tessellator, + xOffset, + yOffset + sliceTop + tileHeight, + 0, + sliceTop + middleHeight, + sliceLeft, + sliceBottom); // angle right-bottom - if (sliceRight > 0 && sliceBottom > 0) { - drawModalRectWithCustomSizedTexture( - xOffset + sliceLeft + tileWidth, - yOffset + sliceTop + tileHeight, - sliceLeft + middleWidth, - sliceTop + middleHeight, - sliceRight, - sliceBottom); - } + addQuad( + tessellator, + xOffset + sliceLeft + tileWidth, + yOffset + sliceTop + tileHeight, + sliceLeft + middleWidth, + sliceTop + middleHeight, + sliceRight, + sliceBottom); + + tessellator.draw(); if (!is2DTexture) GL11.glDisable(GL11.GL_TEXTURE_2D); } } - private void drawModalRectWithCustomSizedTexture(int xOffset, int yOffset, int u, int v, int width, int height) { - Gui.func_146110_a( - xOffset + this.paddingLeft, - yOffset + this.paddingTop, - this.x + u, - this.y + v, - width, - height, - this.textureWidth, - this.textureHeight); + private void addQuad(Tessellator tessellator, int xOffset, int yOffset, int u, int v, int width, int height) { + if (width <= 0 || height <= 0) return; + + final float scaleU = 1.0F / this.textureWidth; + final float scaleV = 1.0F / this.textureHeight; + final int x = xOffset + this.paddingLeft; + final int y = yOffset + this.paddingTop; + final float u0 = (this.x + u) * scaleU; + final float u1 = (this.x + u + width) * scaleU; + final float v0 = (this.y + v) * scaleV; + final float v1 = (this.y + v + height) * scaleV; + + tessellator.addVertexWithUV(x, y + height, 0.0D, u0, v1); + tessellator.addVertexWithUV(x + width, y + height, 0.0D, u1, v1); + tessellator.addVertexWithUV(x + width, y, 0.0D, u1, v0); + tessellator.addVertexWithUV(x, y, 0.0D, u0, v0); } } diff --git a/src/main/java/codechicken/nei/recipe/HandlerInfo.java b/src/main/java/codechicken/nei/recipe/HandlerInfo.java index 19abee05..752e95d5 100644 --- a/src/main/java/codechicken/nei/recipe/HandlerInfo.java +++ b/src/main/java/codechicken/nei/recipe/HandlerInfo.java @@ -12,6 +12,7 @@ public class HandlerInfo { public static int DEFAULT_HEIGHT = 65; public static int DEFAULT_WIDTH = 166; + public static final int DEFAULT_IMAGE_TEXTURE_SIZE = 256; @Deprecated public static int DEFAULT_MAX_PER_PAGE = 1; @@ -70,9 +71,22 @@ public class HandlerInfo { } public boolean setImage(String resourceLocation, int imageX, int imageY, int imageWidth, int imageHeight) { + return setImage( + resourceLocation, + imageX, + imageY, + imageWidth, + imageHeight, + DEFAULT_IMAGE_TEXTURE_SIZE, + DEFAULT_IMAGE_TEXTURE_SIZE); + } + + public boolean setImage(String resourceLocation, int imageX, int imageY, int imageWidth, int imageHeight, + int textureWidth, int textureHeight) { if (hasImageOrItem()) return false; - this.image = new DrawableBuilder(resourceLocation, imageX, imageY, imageWidth, imageHeight).build(); + this.image = new DrawableBuilder(resourceLocation, imageX, imageY, imageWidth, imageHeight) + .setTextureSize(textureWidth, textureHeight).build(); return true; } @@ -211,6 +225,20 @@ public class HandlerInfo { return this; } + public Builder setDisplayImage(ResourceLocation location, int imageX, int imageY, int imageWidth, + int imageHeight, int textureWidth, int textureHeight) { + this.info.itemStack = null; + this.info.setImage( + location.toString(), + imageX, + imageY, + imageWidth, + imageHeight, + textureWidth, + textureHeight); + return this; + } + @Deprecated public Builder setUseCustomScroll(boolean useCustomScroll) { this.info.setUseCustomScroll(useCustomScroll);