Prevent drawing outside of renderer via glScissor

This commit is contained in:
johni0702
2015-10-11 10:42:56 +02:00
parent 1563af3d46
commit d64ea95089
6 changed files with 64 additions and 9 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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() {