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

View File

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

View File

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

View File

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

View File

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

View File

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