From a26ed5ec4150e0701fecfc59babfa98fd301c197 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 23 Aug 2021 22:42:38 +0700 Subject: [PATCH] Ignore depth buffer when drawing screens (panels are properly Z sorted), partially fixes issues with TOP --- .../dbotthepony/mc/otm/screen/MatteryScreen.java | 14 ++++++++++++++ .../ru/dbotthepony/mc/otm/screen/RenderHelper.java | 11 ++++++++++- .../mc/otm/screen/panels/AbstractSlotPanel.java | 7 +++++++ .../mc/otm/screen/panels/FramePanel.java | 5 +++++ .../mc/otm/screen/panels/MatteryWidgetPanel.java | 3 +++ .../mc/otm/screen/panels/MinecraftWidgetPanel.java | 5 +++++ 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java index 97c1d0038..0fa4529a8 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java @@ -33,6 +33,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; +import static org.lwjgl.opengl.GL11.GL_LESS; +import static org.lwjgl.opengl.GL13.GL_TEXTURE0; + /** * This class encapsulate most of logic for handling EditablePanel and it's children * It inherits AbstractContainerScreen, but most of methods of AbstractContainerScreen are re implemented or straight removed @@ -455,14 +459,24 @@ public abstract class MatteryScreen extends AbstractConta } } + RenderSystem.defaultBlendFunc(); + RenderSystem.enableBlend(); + RenderSystem.enableDepthTest(); + RenderSystem.enableTexture(); + RenderSystem.activeTexture(GL_TEXTURE0); + float depth = -900f; for (var panel : panels) { + RenderSystem.depthFunc(GL_ALWAYS); + panel.set3DDepth(depth); RenderSystem.setShaderColor(1F, 1F, 1F, 1F); depth = Math.max(depth, panel.render(pose, mouse_x, mouse_y, flag)); } + RenderSystem.depthFunc(GL_LESS); + net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.GuiContainerEvent.DrawBackground(this, pose, mouse_x, mouse_y)); RenderSystem.disableDepthTest(); diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java index 23673cb2f..6394a4daf 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java @@ -7,6 +7,9 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; +import static org.lwjgl.opengl.GL11.GL_LESS; + /** * I am too lazy to learn how Mojang's API works * so I just recreate part of GMod's API in here @@ -59,6 +62,11 @@ public class RenderHelper { float v1 ) { RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.enableTexture(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + RenderSystem.depthFunc(GL_ALWAYS); var builder = Tesselator.getInstance().getBuilder(); builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); @@ -450,6 +458,8 @@ public class RenderHelper { RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.depthFunc(GL_ALWAYS); + var tess = Tesselator.getInstance(); BufferBuilder builder = tess.getBuilder(); @@ -462,7 +472,6 @@ public class RenderHelper { tess.end(); - RenderSystem.disableBlend(); RenderSystem.enableTexture(); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java index a996b23f3..a529f0193 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java @@ -19,6 +19,9 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; +import static org.lwjgl.opengl.GL11.GL_LESS; + public abstract class AbstractSlotPanel extends EditablePanel { public AbstractSlotPanel(@Nonnull MatteryScreen screen, @Nullable EditablePanel parent, float x, float y, float width, float height) { super(screen, parent, x, y, width, height); @@ -55,11 +58,15 @@ public abstract class AbstractSlotPanel extends EditablePanel { system_stack.translate(parent_x + 1, parent_y + 1, 0); RenderSystem.applyModelViewMatrix(); + RenderSystem.depthFunc(GL_LESS); + // Thanks Mojang // Very cool // (for int x, int y, which are then cast into doubles anyway) screen.getItemRenderer().blitOffset = accumulated_depth - 100; // force item to draw only 50 units "above" background screen.getItemRenderer().renderAndDecorateItem(Minecraft.getInstance().player, itemstack, 0, 0, (int) (parent_x + parent_y * 1000) /* some kind of indexing ? */); + + RenderSystem.depthFunc(GL_ALWAYS); screen.getItemRenderer().renderGuiItemDecorations(screen.getFont(), itemstack, 0, 0, count_override); // too big accumulations can lead to Z near clipping issues diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FramePanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FramePanel.java index 7269c04f8..c81d07615 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FramePanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FramePanel.java @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.screen.panels; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.narration.NarratableEntry; @@ -14,6 +15,8 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; + public class FramePanel extends EditablePanel implements NarratableEntry { public enum FrameTabPosition { TOP(28, 28,28, 32), @@ -239,7 +242,9 @@ public class FramePanel extends EditablePanel implements NarratableEntry { // RenderSystem.enableDepthTest(); // title + RenderSystem.depthFunc(GL_ALWAYS); screen.getFont().draw(stack, title, 8, 5, 4210752); + RenderSystem.depthFunc(GL_ALWAYS); } @Override diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MatteryWidgetPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MatteryWidgetPanel.java index 7c5b92a52..7e999a7e4 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MatteryWidgetPanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MatteryWidgetPanel.java @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.screen.panels; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import ru.dbotthepony.mc.otm.menu.MatteryMenu; import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget; @@ -8,6 +9,8 @@ import ru.dbotthepony.mc.otm.screen.MatteryScreen; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; + public class MatteryWidgetPanel extends EditablePanel { public final AbstractWidget widget; diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MinecraftWidgetPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MinecraftWidgetPanel.java index 82798da98..f51e85202 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MinecraftWidgetPanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/MinecraftWidgetPanel.java @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.screen.panels; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.screens.Screen; @@ -10,6 +11,8 @@ import ru.dbotthepony.mc.otm.screen.MatteryScreen; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import static org.lwjgl.opengl.GL11.GL_ALWAYS; + public class MinecraftWidgetPanel extends EditablePanel { public interface WidgetFactory { T create(MinecraftWidgetPanel panel); @@ -89,7 +92,9 @@ public class MinecraftWidgetPanel extends EditablePane @Override protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) { + RenderSystem.depthFunc(GL_ALWAYS); getOrCreateWidget().render(stack, (int) mouse_x, (int) mouse_y, flag); + RenderSystem.depthFunc(GL_ALWAYS); } @Override