package kenkron.antiqueatlasoverlay; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.HashMap; /** * The minimap render is a bit slow. The function that really takes time is * AtlasRenderHelper.drawAutotileCorner(...). This class makes it faster by * sorting the draw commands by texture, then * rendering all of the same textures of a map at once without re-binding. */ class SetTileRenderer { private final HashMap<ResourceLocation, ArrayList<TileCorner>> subjects = new HashMap<>(); private int tileHalfSize = 8; public SetTileRenderer(int tileHalfSize) { this.tileHalfSize = tileHalfSize; } public void addTileCorner(ResourceLocation texture, int x, int y, int u, int v) { ArrayList<TileCorner> set = subjects.computeIfAbsent(texture, k -> new ArrayList<>()); set.add(new TileCorner(x, y, u, v)); } public void draw() { for (ResourceLocation key : subjects.keySet()) { ArrayList<TileCorner> tca = subjects.get(key); //Effectively a call to GL11.glBindTexture(GL11.GL_TEXTURE_2D, p_94277_0_); Minecraft.getMinecraft().renderEngine.bindTexture(key); Tessellator tessellator = Tessellator.getInstance(); VertexBuffer renderer = tessellator.getBuffer(); renderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); for (TileCorner tc : tca) { drawInlineAutotileCorner(tc.x, tc.y, tc.u, tc.v); } tessellator.draw(); } } private void drawInlineAutotileCorner(int x, int y, int u, int v) { float minU = u / 4f; float maxU = (u + 1) / 4f; float minV = v / 6f; float maxV = (v + 1) / 6f; Tessellator tessellator = Tessellator.getInstance(); VertexBuffer renderer = tessellator.getBuffer(); renderer.pos(x + tileHalfSize, y + tileHalfSize, 0).tex(maxU, maxV).endVertex(); renderer.pos(x + tileHalfSize, y, 0).tex(maxU, minV).endVertex(); renderer.pos(x, y, 0).tex(minU, minV).endVertex(); renderer.pos(x, y + tileHalfSize, 0).tex(minU, maxV).endVertex(); } public class TileCorner { final int x, y, u, v; TileCorner(int x, int y, int u, int v) { this.x = x; this.y = y; this.u = u; this.v = v; } } }