From 6038d3c4dfb399f1791e07b3d15d5279517a0a2c Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 28 Jun 2020 19:11:49 +0200 Subject: [PATCH] [1.14+] Fix resource pack loading during rendering (fixes #182) --- .../core/mixin/MinecraftAccessor.java | 11 ++++ .../render/rendering/VideoRenderer.java | 56 ++++++++++++++----- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java index df00bccb..1ec58296 100644 --- a/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java +++ b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java @@ -8,6 +8,10 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Queue; +//#if MC>=11400 +import java.util.concurrent.CompletableFuture; +//#endif + //#if MC<11400 //$$ import java.util.concurrent.FutureTask; //#endif @@ -24,6 +28,13 @@ public interface MinecraftAccessor { @Accessor("renderTickCounter") void setTimer(RenderTickCounter value); + //#if MC>=11400 + @Accessor + CompletableFuture getResourceReloadFuture(); + @Accessor + void setResourceReloadFuture(CompletableFuture value); + //#endif + //#if MC>=11400 @Accessor Queue getRenderTaskQueue(); diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index f2c0f575..1d3234fb 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -40,7 +40,9 @@ import org.lwjgl.opengl.GL11; //#if MC>=11400 import com.replaymod.render.mixin.MainWindowAccessor; +import net.minecraft.client.gui.screen.Screen; import org.lwjgl.glfw.GLFW; +import java.util.concurrent.CompletableFuture; //#else //$$ import net.minecraft.client.gui.ScaledResolution; //$$ import org.lwjgl.input.Mouse; @@ -213,7 +215,15 @@ public class VideoRenderer implements RenderInfo { //#endif if (!settings.isHighPerformance() || framesDone % fps == 0) { - drawGui(); + while (drawGui() && paused) { + try { + //noinspection BusyWait + Thread.sleep(50); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } } // Updating the timer will cause the timeline player to update the game state @@ -388,6 +398,20 @@ public class VideoRenderer implements RenderInfo { private void executeTaskQueue() { //#if MC>=11400 + while (true) { + while (mc.overlay != null) { + drawGui(); + ((MinecraftMethodAccessor) mc).replayModExecuteTaskQueue(); + } + + CompletableFuture resourceReloadFuture = ((MinecraftAccessor) mc).getResourceReloadFuture(); + if (resourceReloadFuture != null) { + ((MinecraftAccessor) mc).setResourceReloadFuture(null); + mc.reloadResources().thenRun(() -> resourceReloadFuture.complete(null)); + continue; + } + break; + } ((MCVer.MinecraftMethodAccessor) mc).replayModExecuteTaskQueue(); //#else //$$ Queue> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks(); @@ -420,14 +444,14 @@ public class VideoRenderer implements RenderInfo { //#endif } - public void drawGui() { + public boolean drawGui() { do { //#if MC>=11400 if (GLFW.glfwWindowShouldClose(getWindow(mc).getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { //#else //$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).getCrashReporter() != null) { //#endif - return; + return false; } // Resize the GUI framebuffer if the display size changed @@ -500,8 +524,18 @@ public class VideoRenderer implements RenderInfo { int mouseX = (int) mc.mouse.getX() * getWindow(mc).getScaledWidth() / displayWidth; int mouseY = (int) mc.mouse.getY() * getWindow(mc).getScaledHeight() / displayHeight; - gui.toMinecraft().tick(); - gui.toMinecraft().render(mouseX, mouseY, 0); + if (mc.overlay != null) { + Screen orgScreen = mc.currentScreen; + try { + mc.currentScreen = gui.toMinecraft(); + mc.overlay.render(mouseX, mouseY, 0); + } finally { + mc.currentScreen = orgScreen; + } + } else { + gui.toMinecraft().tick(); + gui.toMinecraft().render(mouseX, mouseY, 0); + } //#else //$$ int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; //$$ int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; @@ -544,15 +578,9 @@ public class VideoRenderer implements RenderInfo { //$$ Mouse.setGrabbed(false); //$$ } //#endif - if (paused) { - try { - Thread.sleep(50); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - } - } while (paused && !hasFailed() && !cancelled); + + return !hasFailed() && !cancelled; + } while (true); } private boolean displaySizeChanged() {