From 95dc94d1082f84db745f675e30cf2a7a1818ff3d Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:41:35 -0400 Subject: [PATCH] fix gui rendering, fix sounds being null, reimplement crosshair rendering --- README.md | 11 ++-- libs/mcef-2.x.jar | Bin 194678 -> 197581 bytes src/main/java/net/montoyo/wd/WebDisplays.java | 15 ++--- .../net/montoyo/wd/client/ClientProxy.java | 34 +++++----- .../net/montoyo/wd/client/gui/GuiServer.java | 20 +++--- .../montoyo/wd/client/gui/RenderRecipe.java | 8 +-- .../net/montoyo/wd/client/gui/WDScreen.java | 3 + .../wd/client/gui/controls/CheckBox.java | 8 +-- .../wd/client/gui/controls/Control.java | 58 ++++++++++++------ .../wd/client/gui/controls/ControlGroup.java | 5 ++ .../montoyo/wd/client/gui/controls/List.java | 46 ++++++++------ .../wd/client/gui/controls/UpgradeGroup.java | 7 ++- .../montoyo/wd/entity/TileEntityScreen.java | 3 +- 13 files changed, 129 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index fd03953..e270dc5 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ # WebDisplays for Minecraft 1.19.2 -This is a fork of the Web Displays mod from 1.12, updated to work on 1.19, and with some bug fixes and reworking. +This is a fork of the Web Displays mod from 1.12, updated to work in newer versions, and with some bug fixes and reworking. ### Wiki * The Wiki that details all blocks/items can be found on my website https://montoyo.net/wdwiki/ ### Delayed things * Plugin API -* The Shop -* CC Interface, if CC gets updated... +* The Shop (what) * Center camera to screen when using keyboard * minePad management: check GuiContainer.draggedStack for minePad * In-game command to add/remove blacklisted domains -* Config: RPMP (Real pixels per Minecraft pixels) -* Disable miniserv in solo +* Config: RPMP (Real pixels per Minecraft pixels) (what) +* CC Interface (for when it's actually possible, since the screens are client only currently, but a config option is planned to change that) +* Redstone controls (same reason as CC interface) +* Redo minisrv logic? diff --git a/libs/mcef-2.x.jar b/libs/mcef-2.x.jar index 6e2a0fe0c8292d0b2c24821b8ef9e22e61312e93..ba5160d3f85b2580fa09e4443d1052a51a1cf38b 100644 GIT binary patch delta 39208 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

W_?$s43yc*hgyG|D^BAHd5M99ccu(EBJD7@-Qv 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 delta 36610 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 diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index d4bb46c..e3d1edb 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -169,12 +169,12 @@ public class WebDisplays { } public void onRegisterSounds() { - registerSound("keyboard_type"); - registerSound( "upgrade_add"); - registerSound( "upgrade_del"); - registerSound("screencfg_open"); - registerSound("server"); - registerSound("ironic"); + soundTyping = registerSound("keyboard_type"); + soundUpgradeAdd = registerSound( "upgrade_add"); + soundUpgradeDel = registerSound( "upgrade_del"); + soundScreenCfg = registerSound("screencfg_open"); + soundServer = registerSound("server"); + soundIronic = registerSound("ironic"); } ArrayList> serverStartedDimensions = new ArrayList<>(); @@ -377,11 +377,12 @@ public class WebDisplays { public static DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, "webdisplays"); - private static void registerSound(String resName) { + private static SoundEvent registerSound(String resName) { ResourceLocation resLoc = new ResourceLocation("webdisplays", resName); SoundEvent ret = SoundEvent.createVariableRangeEvent(resLoc); SOUNDS.register(resName, () -> ret); + return ret; } private static void registerTrigger(Criterion ... criteria) { diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index b4f3705..06fab8f 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -138,12 +138,11 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS return; if (!LaserPointerRenderer.isOn()) { - RenderSystem.setShaderTexture(0, new ResourceLocation( - "webdisplays:textures/gui/cursors.png" - )); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); - -// blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, 240, 240, 15, 15, offset); + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, 240, 240, 15, 15, 256, 256); ci.cancel(); return; } @@ -154,9 +153,16 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS BlockPos bpos = result.getBlockPos(); - if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) + if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) { + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, 240, 240, 15, 15, 256, 256); + ci.cancel(); return; - + } + Vector3i pos = new Vector3i(result.getBlockPos()); BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; @@ -166,19 +172,17 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS TileEntityScreen.Screen sc = te.getScreen(side); if (sc == null) return; -// if (sc.mouseType == 1) return; - + int coordX = sc.mouseType * 15; int coordY = coordX / 256; coordX -= coordY * 256; - RenderSystem.setShaderTexture(0, new ResourceLocation( - "webdisplays:textures/gui/cursors.png" - )); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); - -// blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, coordX, coordY, 15, 15, offset); - + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, coordX, coordY, 15, 15, 256, 256); + ci.cancel(); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index 6f6c23d..4a2e71c 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -96,8 +96,8 @@ public class GuiServer extends WDScreen { } @Override - public void render(GuiGraphics poseStack, int mouseX, int mouseY, float ptt) { - super.render(poseStack, mouseX, mouseY, ptt); + public void render(GuiGraphics graphics, int mouseX, int mouseY, float ptt) { + super.render(graphics, mouseX, mouseY, ptt); int x = (width - 256) / 2; int y = (height - 176) / 2; @@ -105,27 +105,27 @@ public class GuiServer extends WDScreen { // RenderSystem.enableTexture(); RenderSystem.setShaderTexture(0, BG_IMAGE); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); -// blit(poseStack, x, y, 0, 0, 256, 176); - + graphics.blit(BG_IMAGE, x, y, 0, 0, 256, 256); + x += 18; y += 18; for (int i = 0; i < lines.size(); i++) { if (selectedLine == i) { drawWhiteQuad(x - 1, y - 2, font.width(lines.get(i)) + 1, 12); - poseStack.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFF129700, false); + graphics.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFF129700, false); } else - poseStack.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFFFFFFFF, false); + graphics.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFFFFFFFF, false); y += 12; } if (!promptLocked) { if (queue.isEmpty()) { - x = poseStack.drawString(Minecraft.getInstance().font, userPrompt, x, y, 0xFFFFFFFF, false); - x = poseStack.drawString(Minecraft.getInstance().font, prompt, x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, userPrompt, x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, prompt, x, y, 0xFFFFFFFF, false); } else { - x = poseStack.drawString(Minecraft.getInstance().font, tr("press_for_more"), x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, tr("press_for_more"), x, y, 0xFFFFFFFF, false); } } @@ -137,7 +137,7 @@ public class GuiServer extends WDScreen { RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.setShaderTexture(0, FG_IMAGE); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); -// blit(poseStack,(width - 256) / 2, (height - 176) / 2, 0, 0, 256, 176); +// blit(graphics,(width - 256) / 2, (height - 176) / 2, 0, 0, 256, 176); } private void drawWhiteQuad(int x, int y, int w, int h) { diff --git a/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java index f06fc89..8ff2535 100644 --- a/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java +++ b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java @@ -100,15 +100,15 @@ public class RenderRecipe extends Screen { int x = this.x + 30 + sx * 18; int y = this.y + 17 + sy * 18; -// renderItem.renderAndDecorateItem(minecraft.player, is, x, y, 0); -// renderItem.renderGuiItemDecorations(font, is, x, y, null); + context.renderItem(is, x, y); + context.renderItemDecorations(font, is, x, y); } } } if(recipeResult != null) { -// renderItem.renderAndDecorateItem(minecraft.player, recipeResult, x + 124, y + 35, 0); -// renderItem.renderGuiItemDecorations(font, recipeResult, x + 124, y + 35, null); + context.renderItem(recipeResult, x, y); + context.renderItemDecorations(font, recipeResult, x, y); } // GlStateManager.enableLighting(); diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java index 7c6842a..e2e4cf3 100644 --- a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -7,6 +7,7 @@ package net.montoyo.wd.client.gui; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -116,6 +117,8 @@ public abstract class WDScreen extends Screen { if(defaultBackground) renderBackground(poseStack); + RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); + for(Control ctrl: controls) ctrl.draw(poseStack, mouseX, mouseY, ptt); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java b/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java index 98aefc1..0d14ca1 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; @@ -81,12 +82,11 @@ public class CheckBox extends BasicControl { if(visible) { // GlStateManager.disableAlpha(); poseStack.pose().pushPose(); - RenderSystem.setShaderTexture(2, checked ? texChecked : texUnchecked); - RenderSystem.bindTexture(2); RenderSystem.enableBlend(); - fillTexturedRect(poseStack.pose(), x, y, WIDTH, HEIGHT, 0.0, 0.0, 1.0, 1.0); + poseStack.blit( + checked ? texChecked : texUnchecked, x, y, 0, 0, 0, WIDTH, HEIGHT, WIDTH, HEIGHT + ); RenderSystem.disableBlend(); - RenderSystem.bindTexture(-1); poseStack.pose().popPose(); boolean inside = (!disabled && mouseX >= x && mouseX <= x + WIDTH + 2 + labelW && mouseY >= y && mouseY < y + HEIGHT); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java index 589a415..d8da990 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java @@ -11,6 +11,10 @@ import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.resources.language.I18n; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -20,6 +24,9 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.utilities.Bounds; import org.joml.Matrix4f; +import java.util.Arrays; + +import static com.mojang.math.Axis.XP; import static org.lwjgl.opengl.GL11.*; @OnlyIn(Dist.CLIENT) @@ -109,7 +116,7 @@ public abstract class Control { public abstract int getHeight(); public abstract void setPos(int x, int y); - public void fillRect(int x, double y, int w, int h, int color) { + public void fillRect(MultiBufferSource.BufferSource source, int x, double y, int w, int h, int color) { double x1 = (double) x; double y1 = (double) y; double x2 = (double) (x + w); @@ -119,34 +126,38 @@ public abstract class Control { int g = (color >> 8 ) & 0xFF; int b = color & 0xFF; - RenderSystem.setShaderColor(((float) r) / 255.f, ((float) g) / 255.f, ((float) b) / 255.f, ((float) a) / 255.f); + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); + RenderSystem.setShaderColor(1, 1, 1, 1f); // RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); - vBuffer.vertex(x1, y2, 0.0).endVertex(); - vBuffer.vertex(x2, y2, 0.0).endVertex(); - vBuffer.vertex(x2, y1, 0.0).endVertex(); - vBuffer.vertex(x1, y1, 0.0).endVertex(); - tessellator.end(); + VertexConsumer consumer = source.getBuffer(RenderType.gui()); + consumer.vertex(x1, y2, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x2, y2, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x2, y1, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x1, y1, 0.0).color(r, g, b, a).endVertex(); + + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); RenderSystem.disableBlend(); // RenderSystem.enableTexture(); } public void fillTexturedRect(PoseStack poseStack, int x, int y, int w, int h, double u1, double v1, double u2, double v2) { - double x1 = (double) x; - double y1 = (double) y; - double x2 = (double) (x + w); - double y2 = (double) (y + h); + float x1 = x; + float y1 = y; + float x2 = (x + w); + float y2 = (y + h); - vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); - vBuffer.vertex(x1, y2, 0.0).uv((float) u1, (float) v2).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x2, y2, 0.0).uv((float) u2, (float) v2).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x2, y1, 0.0).uv((float) u2, (float) v1).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x1, y1, 0.0).uv((float) u1, (float) v1).color(255, 255, 255, 255).endVertex(); - tessellator.end(); + RenderSystem.setShader(GameRenderer::getPositionColorTexShader); + Matrix4f p = poseStack.last().pose(); + vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); + vBuffer.vertex(p, x1, y2, 0.0f).color(255, 255, 255, 255).uv((float) u1, (float) v2).endVertex(); + vBuffer.vertex(p, x2, y2, 0.0f).color(255, 255, 255, 255).uv((float) u2, (float) v2).endVertex(); + vBuffer.vertex(p, x2, y1, 0.0f).color(255, 255, 255, 255).uv((float) u2, (float) v1).endVertex(); + vBuffer.vertex(p, x1, y1, 0.0f).color(255, 255, 255, 255).uv((float) u1, (float) v1).endVertex(); + BufferUploader.drawWithShader(vBuffer.end()); } public static void blend(boolean enable) { @@ -178,6 +189,7 @@ public abstract class Control { int g = (color >> 8 ) & 0xFF; int b = color & 0xFF; + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); RenderSystem.setShaderColor(((float) r) / 255.f, ((float) g) / 255.f, ((float) b) / 255.f, ((float) a) / 255.f); // RenderSystem.enableTexture(); RenderSystem.enableBlend(); @@ -209,13 +221,15 @@ public abstract class Control { vBuffer.vertex(x2 - sz, y1, 0.0).endVertex(); tessellator.end(); + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); + RenderSystem.disableBlend(); // RenderSystem.enableTexture(); } public GuiGraphics beginFramebuffer(RenderTarget fbo, float vpW, float vpH) { GuiGraphics tmpGraphics = new GuiGraphics(Minecraft.getInstance(), Minecraft.getInstance().renderBuffers().bufferSource()); - + fbo.bindWrite(true); RenderSystem.backupProjectionMatrix(); @@ -226,7 +240,10 @@ public abstract class Control { PoseStack poseStack = tmpGraphics.pose(); poseStack.pushPose(); poseStack.setIdentity(); -// poseStack.mulPose(Vector3f.XP.rotationDegrees(180.0f)); + poseStack.mulPose(XP.rotationDegrees(180.0f)); + RenderSystem.getModelViewStack().pushPose(); + RenderSystem.getModelViewStack().last().pose().set(poseStack.last().pose()); + RenderSystem.getModelViewStack().last().normal().set(poseStack.last().normal()); RenderSystem.applyModelViewMatrix(); if(!fbo.useDepth) @@ -243,6 +260,7 @@ public abstract class Control { RenderSystem.colorMask(true, true, true, true); RenderSystem.restoreProjectionMatrix(); poseStack.pose().popPose(); + RenderSystem.getModelViewStack().popPose(); RenderSystem.applyModelViewMatrix(); fbo.unbindWrite(); mc.getMainRenderTarget().bindWrite(true); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index e8425f2..bc73c4c 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -15,6 +15,8 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.utilities.Bounds; import org.lwjgl.opengl.GL11; +import java.util.Arrays; + import static org.lwjgl.opengl.GL11.*; public class ControlGroup extends Container { @@ -102,6 +104,7 @@ public class ControlGroup extends Container { if(visible) { poseStack.pose().pushPose(); + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); RenderSystem.setShaderColor(0.5f, 0.5f, 0.5f, 1.f); // RenderSystem.disableTexture(); RenderSystem.enableBlend(); @@ -161,6 +164,8 @@ public class ControlGroup extends Container { vBuffer.vertex(x2 - 1.0, y1, 0.0).endVertex(); tessellator.end(); + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); + RenderSystem.disableBlend(); // RenderSystem.enableTexture(); poseStack.pose().popPose(); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/List.java b/src/main/java/net/montoyo/wd/client/gui/controls/List.java index b707751..b2e6764 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/List.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/List.java @@ -10,12 +10,16 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; import net.montoyo.wd.client.gui.loading.JsonOWrapper; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import java.util.ArrayList; -import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; -import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.*; public class List extends BasicControl { @@ -97,19 +101,20 @@ public class List extends BasicControl { if(fbo != null) fbo.destroyBuffers(); - fbo = new TextureTarget(parent.screen2DisplayX(width), parent.screen2DisplayY(height), false, Minecraft.ON_OSX); + fbo = new TextureTarget(parent.screen2DisplayX(width), parent.screen2DisplayY(height), true, Minecraft.ON_OSX); fbo.setFilterMode(GL_NEAREST); - fbo.bindWrite(false); + fbo.bindWrite(true); RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); fbo.unbindWrite(); update = true; } - private void renderToFBO() { - GuiGraphics poseStack = beginFramebuffer(fbo, width, height); - poseStack.pose().pushPose(); - fillRect(0, 0, width, height, COLOR_BLACK); + private void renderToFBO(MultiBufferSource.BufferSource source) { + GuiGraphics graphics = beginFramebuffer(fbo, width, height); + GL11.glColorMask(true, true, true, true); + RenderSystem.applyModelViewMatrix(); + graphics.fill(0, 0, width, height, COLOR_BLACK); RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); int offset = 4 - getYOffset(); @@ -121,13 +126,15 @@ public class List extends BasicControl { break; int color = (i == selected) ? selColor : COLOR_WHITE; - poseStack.drawString(font, content.get(i).text, 4, i * 12 + offset, color); + graphics.drawString(font, content.get(i).text, 4, i * 12 + offset, color); } } - drawBorder(poseStack, 0, 0, width, height, 0xFF808080); - endFramebuffer(poseStack, fbo); - poseStack.pose().popPose(); + graphics.renderOutline(0, 0, width, height, 0xFF808080); + RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 + RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); + graphics.flush(); + endFramebuffer(graphics, fbo); } @Override @@ -312,19 +319,18 @@ public class List extends BasicControl { } @Override - public void draw(GuiGraphics poseStack, int mouseX, int mouseY, float ptt) { + public void draw(GuiGraphics graphics, int mouseX, int mouseY, float ptt) { if(visible) { - if(update) { - renderToFBO(); +// if(update) { + renderToFBO(graphics.bufferSource()); update = false; - } +// } - fbo.bindRead(); //TODO: Make sure is right + RenderSystem.setShaderTexture(0, fbo.getColorTextureId()); RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); - fillTexturedRect(poseStack.pose(), x, y, width, height, 0.0, 1.0, 1.0, 0.0); - fbo.unbindRead(); + fillTexturedRect(graphics.pose(), x, y, width, height, 0.0, 1.0, 1.0, 0.0); - fillRect(x + width - 5, y + 1 + scrollPos, 4, scrollSize, (scrolling || isInScrollbar(mouseX, mouseY)) ? 0xFF202020 : 0xFF404040); + fillRect(graphics.bufferSource(), x + width - 5, y + 1 + scrollPos, 4, scrollSize, (scrolling || isInScrollbar(mouseX, mouseY)) ? 0xFF202020 : 0xFF404040); } } diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java index 8f54a08..6780e13 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java @@ -7,6 +7,7 @@ package net.montoyo.wd.client.gui.controls; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.world.item.ItemStack; import net.montoyo.wd.client.gui.loading.JsonOWrapper; @@ -33,10 +34,10 @@ public class UpgradeGroup extends BasicControl { for(ItemStack is: upgrades) { if(is == overStack && !disabled) - fillRect(x, y, 16, 16, 0x80FF0000); + fillRect(poseStack.bufferSource(), x, y, 16, 16, 0x80FF0000); -// renderItem.renderAndDecorateItem(mc.player, is, x, y, 0); -// renderItem.renderAndDecorateItem(is, font.lineHeight, x, y); //TODO is lineHeight right? + poseStack.renderItem(is, x, y); + poseStack.renderItemDecorations(font, is, x, y); x += 18; } } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 368a467..24ce5d4 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -6,6 +6,7 @@ package net.montoyo.wd.entity; import com.cinemamod.mcef.MCEF; import com.cinemamod.mcef.MCEFBrowser; +import com.cinemamod.mcef.MCEFCursorChangeListener; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -233,7 +234,7 @@ public class TileEntityScreen extends BlockEntity { else mcefBrowser.resize(resolution.x, resolution.y); - mcefBrowser.setCursorChangeListener((type) -> mouseType = type); + mcefBrowser.setCursorChangeListener((MCEFCursorChangeListener) (type) -> mouseType = type); } doTurnOnAnim = doAnim;