Ignore depth buffer when drawing screens (panels are properly Z sorted), partially fixes issues with TOP

This commit is contained in:
DBotThePony 2021-08-23 22:42:38 +07:00
parent 2753997898
commit a26ed5ec41
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 44 additions and 1 deletions

View File

@ -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<T extends MatteryMenu> 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();

View File

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

View File

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

View File

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

View File

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

View File

@ -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<T extends AbstractWidget> extends EditablePanel {
public interface WidgetFactory<T extends AbstractWidget> {
T create(MinecraftWidgetPanel<T> panel);
@ -89,7 +92,9 @@ public class MinecraftWidgetPanel<T extends AbstractWidget> 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