From ee7e118dfd9142112f206dbaa4511fb8b82d9064 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Mon, 12 Oct 2015 22:03:23 +0200 Subject: [PATCH] Fix layering in GUI API --- .../johni0702/minecraft/gui/RenderInfo.java | 2 +- .../gui/container/AbstractGuiContainer.java | 5 +-- .../element/AbstractComposedGuiElement.java | 33 ++++++++++--------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java b/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java index 98fb0ec6..c1355d3f 100644 --- a/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java +++ b/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java @@ -38,7 +38,7 @@ public class RenderInfo { } public RenderInfo layer(int layer) { - return new RenderInfo(partialTick, mouseX, mouseY, layer); + return this.layer == layer ? this : new RenderInfo(partialTick, mouseX, mouseY, layer); } public void addTo(CrashReport crashReport) { 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 c656d1a9..f1b8b138 100644 --- a/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java +++ b/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java @@ -145,7 +145,7 @@ public abstract class AbstractGuiContainer> }); throw new ReportedException(crashReport); } - if (backgroundColor != null) { + if (backgroundColor != null && renderInfo.getLayer() == 0) { renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), backgroundColor); } for (final Map.Entry> e : layedOutElements.entrySet()) { @@ -164,7 +164,8 @@ public abstract class AbstractGuiContainer> try { 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()) + .layer(renderInfo.getLayer() - e.getKey().getLayer())); eRenderer.stopUsing(); } catch (Exception ex) { CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui"); diff --git a/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java b/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java index c4c5c860..51de9ef3 100644 --- a/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java +++ b/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java @@ -22,15 +22,20 @@ package de.johni0702.minecraft.gui.element; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Ordering; import de.johni0702.minecraft.gui.container.GuiContainer; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.ReportedException; +import javax.annotation.Nullable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; @@ -45,19 +50,15 @@ public abstract class AbstractComposedGuiElement maxLayer) { - maxLayer = elementMaxLayer; - } - } - return maxLayer; + return getLayer() + Ordering.natural().max(Iterables.concat(Collections.singleton(0), + Iterables.transform(getChildren(), new Function() { + + @Nullable + @Override + public Integer apply(GuiElement e) { + return e instanceof ComposedGuiElement ? ((ComposedGuiElement) e).getMaxLayer() : e.getLayer(); + } + }))); } @Override @@ -65,14 +66,14 @@ public abstract class AbstractComposedGuiElement C forEach(final Class ofType) { int maxLayer = getMaxLayer(); final List layers = new ArrayList(maxLayer + 1); - for (int i = 0; i <= maxLayer; i++) { + for (int i = maxLayer; i >= 0; i--) { layers.add(forEach(i, ofType)); } return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { boolean isGetter = method.getName().startsWith("get"); - Object handled = method.getReturnType().equals(Boolean.class) ? false : null; + Object handled = method.getReturnType().equals(boolean.class) ? false : null; for (final C layer : layers) { handled = method.invoke(layer, args); if (handled != null) { @@ -136,7 +137,7 @@ public abstract class AbstractComposedGuiElement