Prevent drawing outside of renderer via glScissor
This commit is contained in:
@@ -34,6 +34,8 @@ public interface GuiRenderer {
|
|||||||
|
|
||||||
ReadableDimension getSize();
|
ReadableDimension getSize();
|
||||||
|
|
||||||
|
void setDrawingArea(int x, int y, int width, int height);
|
||||||
|
|
||||||
void bindTexture(ResourceLocation location);
|
void bindTexture(ResourceLocation location);
|
||||||
|
|
||||||
void bindTexture(ITextureObject texture);
|
void bindTexture(ITextureObject texture);
|
||||||
|
|||||||
@@ -26,11 +26,13 @@ import lombok.NonNull;
|
|||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
import net.minecraft.client.gui.FontRenderer;
|
||||||
import net.minecraft.client.gui.Gui;
|
import net.minecraft.client.gui.Gui;
|
||||||
|
import net.minecraft.client.gui.ScaledResolution;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
import net.minecraft.client.renderer.WorldRenderer;
|
import net.minecraft.client.renderer.WorldRenderer;
|
||||||
import net.minecraft.client.renderer.texture.ITextureObject;
|
import net.minecraft.client.renderer.texture.ITextureObject;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
import org.lwjgl.util.Color;
|
import org.lwjgl.util.Color;
|
||||||
import org.lwjgl.util.*;
|
import org.lwjgl.util.*;
|
||||||
|
|
||||||
@@ -42,9 +44,9 @@ public class MinecraftGuiRenderer implements GuiRenderer {
|
|||||||
private final Gui gui = new Gui();
|
private final Gui gui = new Gui();
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ReadableDimension size;
|
private final ScaledResolution size;
|
||||||
|
|
||||||
public MinecraftGuiRenderer(ReadableDimension size) {
|
public MinecraftGuiRenderer(ScaledResolution size) {
|
||||||
this.size = size;
|
this.size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +57,31 @@ public class MinecraftGuiRenderer implements GuiRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReadableDimension getSize() {
|
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
|
@Override
|
||||||
|
|||||||
@@ -25,10 +25,8 @@ package de.johni0702.minecraft.gui;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import net.minecraft.client.renderer.texture.ITextureObject;
|
import net.minecraft.client.renderer.texture.ITextureObject;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import org.lwjgl.util.Point;
|
import org.lwjgl.opengl.GL11;
|
||||||
import org.lwjgl.util.ReadableColor;
|
import org.lwjgl.util.*;
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public class OffsetGuiRenderer implements GuiRenderer {
|
public class OffsetGuiRenderer implements GuiRenderer {
|
||||||
|
|
||||||
@@ -58,6 +56,33 @@ public class OffsetGuiRenderer implements GuiRenderer {
|
|||||||
return size;
|
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
|
@Override
|
||||||
public void bindTexture(ResourceLocation location) {
|
public void bindTexture(ResourceLocation location) {
|
||||||
renderer.bindTexture(location);
|
renderer.bindTexture(location);
|
||||||
|
|||||||
@@ -161,7 +161,9 @@ public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
|||||||
final ReadableDimension eSize = e.getValue().getRight();
|
final ReadableDimension eSize = e.getValue().getRight();
|
||||||
try {
|
try {
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize);
|
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize);
|
||||||
|
eRenderer.startUsing();
|
||||||
e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY()));
|
e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY()));
|
||||||
|
eRenderer.stopUsing();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui");
|
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui");
|
||||||
renderInfo.addTo(crashReport);
|
renderInfo.addTo(crashReport);
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ public abstract class AbstractGuiOverlay<T extends AbstractGuiOverlay<T>> extend
|
|||||||
|| screenSize.getWidth() != res.getScaledWidth()
|
|| screenSize.getWidth() != res.getScaledWidth()
|
||||||
|| screenSize.getHeight() != res.getScaledHeight()) {
|
|| screenSize.getHeight() != res.getScaledHeight()) {
|
||||||
screenSize = new Dimension(res.getScaledWidth(), 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);
|
Keyboard.enableRepeatEvents(true);
|
||||||
}
|
}
|
||||||
screenSize = new Dimension(width, height);
|
screenSize = new Dimension(width, height);
|
||||||
renderer = new MinecraftGuiRenderer(screenSize);
|
renderer = new MinecraftGuiRenderer(new ScaledResolution(mc, mc.displayWidth, mc.displayHeight));
|
||||||
}
|
}
|
||||||
|
|
||||||
public T getWrapper() {
|
public T getWrapper() {
|
||||||
|
|||||||
Reference in New Issue
Block a user