Prevent drawing outside of renderer via glScissor
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -161,7 +161,9 @@ public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
||||
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);
|
||||
|
||||
@@ -199,7 +199,7 @@ public abstract class AbstractGuiOverlay<T extends AbstractGuiOverlay<T>> extend
|
||||
|| screenSize.getWidth() != res.getScaledWidth()
|
||||
|| screenSize.getHeight() != res.getScaledHeight()) {
|
||||
screenSize = new Dimension(res.getScaledWidth(), res.getScaledHeight());
|
||||
renderer = new MinecraftGuiRenderer(screenSize);
|
||||
renderer = new MinecraftGuiRenderer(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ public abstract class AbstractGuiScreen<T extends AbstractGuiScreen<T>> 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() {
|
||||
|
||||
Reference in New Issue
Block a user