diff --git a/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java b/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java index 9fe56c0a..9c1b5b49 100644 --- a/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java +++ b/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java @@ -34,6 +34,8 @@ public interface GuiRenderer { ReadableDimension getSize(); + void setDrawingArea(int x, int y, int width, int height); + void bindTexture(ResourceLocation location); void bindTexture(ITextureObject texture); diff --git a/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java b/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java index cef6a6b0..0af0b4ef 100644 --- a/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java +++ b/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java @@ -26,11 +26,13 @@ import lombok.NonNull; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; import org.lwjgl.util.Color; import org.lwjgl.util.*; @@ -42,9 +44,9 @@ public class MinecraftGuiRenderer implements GuiRenderer { private final Gui gui = new Gui(); @NonNull - private final ReadableDimension size; + private final ScaledResolution size; - public MinecraftGuiRenderer(ReadableDimension size) { + public MinecraftGuiRenderer(ScaledResolution size) { this.size = size; } @@ -55,7 +57,31 @@ public class MinecraftGuiRenderer implements GuiRenderer { @Override public ReadableDimension getSize() { - return size; + return new ReadableDimension() { + @Override + public int getWidth() { + return size.getScaledWidth(); + } + + @Override + public int getHeight() { + return size.getScaledHeight(); + } + + @Override + public void getSize(WritableDimension dest) { + dest.setSize(getWidth(), getHeight()); + } + }; + } + + @Override + public void setDrawingArea(int x, int y, int width, int height) { + // glScissor origin is bottom left corner whereas otherwise it's top left + y = size.getScaledHeight() - y - height; + + int f = size.getScaleFactor(); + GL11.glScissor(x * f, y * f, width * f, height * f); } @Override diff --git a/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java b/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java index 405c2846..9d84af65 100644 --- a/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java +++ b/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java @@ -25,10 +25,8 @@ package de.johni0702.minecraft.gui; import lombok.NonNull; import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.util.ResourceLocation; -import org.lwjgl.util.Point; -import org.lwjgl.util.ReadableColor; -import org.lwjgl.util.ReadableDimension; -import org.lwjgl.util.ReadablePoint; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.*; public class OffsetGuiRenderer implements GuiRenderer { @@ -58,6 +56,33 @@ public class OffsetGuiRenderer implements GuiRenderer { return size; } + @Override + public void setDrawingArea(int x, int y, int width, int height) { + int x2 = x + width; + int y2 = y + height; + // Convert and clamp top and left border + x = Math.max(0, x + position.getX()); + y = Math.max(0, y + position.getY()); + // Clamp and convert bottom and right border + x2 = Math.min(x2, size.getWidth()) + position.getX(); + y2 = Math.min(y2, size.getHeight()) + position.getY(); + // Make sure bottom and top / right and left aren't flipped + x2 = Math.max(x2, x); + y2 = Math.max(y2, y); + // Pass to parent + renderer.setDrawingArea(x, y, x2 - x, y2 - y); + } + + public void startUsing() { + GL11.glPushAttrib(GL11.GL_SCISSOR_BIT); + GL11.glEnable(GL11.GL_SCISSOR_TEST); + setDrawingArea(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE); + } + + public void stopUsing() { + GL11.glPopAttrib(); + } + @Override public void bindTexture(ResourceLocation location) { renderer.bindTexture(location); diff --git a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java index 20afabaf..d20d3578 100644 --- a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java +++ b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java @@ -161,7 +161,9 @@ public abstract class AbstractGuiContainer> final ReadableDimension eSize = e.getValue().getRight(); try { OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize); + eRenderer.startUsing(); e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY())); + eRenderer.stopUsing(); } catch (Exception ex) { CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui"); renderInfo.addTo(crashReport); diff --git a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java index 6c5853d4..946ff6a3 100644 --- a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java +++ b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java @@ -199,7 +199,7 @@ public abstract class AbstractGuiOverlay> extend || screenSize.getWidth() != res.getScaledWidth() || screenSize.getHeight() != res.getScaledHeight()) { screenSize = new Dimension(res.getScaledWidth(), res.getScaledHeight()); - renderer = new MinecraftGuiRenderer(screenSize); + renderer = new MinecraftGuiRenderer(res); } } } diff --git a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java index 71a639af..b560a699 100644 --- a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java +++ b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java @@ -220,7 +220,7 @@ public abstract class AbstractGuiScreen> extends Keyboard.enableRepeatEvents(true); } screenSize = new Dimension(width, height); - renderer = new MinecraftGuiRenderer(screenSize); + renderer = new MinecraftGuiRenderer(new ScaledResolution(mc, mc.displayWidth, mc.displayHeight)); } public T getWrapper() {