[1.14+] Fix resource pack loading during rendering (fixes #182)

This commit is contained in:
Jonas Herzig
2020-06-28 19:11:49 +02:00
parent 72b44c368b
commit 6038d3c4df
2 changed files with 53 additions and 14 deletions

View File

@@ -8,6 +8,10 @@ import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Queue; import java.util.Queue;
//#if MC>=11400
import java.util.concurrent.CompletableFuture;
//#endif
//#if MC<11400 //#if MC<11400
//$$ import java.util.concurrent.FutureTask; //$$ import java.util.concurrent.FutureTask;
//#endif //#endif
@@ -24,6 +28,13 @@ public interface MinecraftAccessor {
@Accessor("renderTickCounter") @Accessor("renderTickCounter")
void setTimer(RenderTickCounter value); void setTimer(RenderTickCounter value);
//#if MC>=11400
@Accessor
CompletableFuture<Void> getResourceReloadFuture();
@Accessor
void setResourceReloadFuture(CompletableFuture<Void> value);
//#endif
//#if MC>=11400 //#if MC>=11400
@Accessor @Accessor
Queue<Runnable> getRenderTaskQueue(); Queue<Runnable> getRenderTaskQueue();

View File

@@ -40,7 +40,9 @@ import org.lwjgl.opengl.GL11;
//#if MC>=11400 //#if MC>=11400
import com.replaymod.render.mixin.MainWindowAccessor; import com.replaymod.render.mixin.MainWindowAccessor;
import net.minecraft.client.gui.screen.Screen;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import java.util.concurrent.CompletableFuture;
//#else //#else
//$$ import net.minecraft.client.gui.ScaledResolution; //$$ import net.minecraft.client.gui.ScaledResolution;
//$$ import org.lwjgl.input.Mouse; //$$ import org.lwjgl.input.Mouse;
@@ -213,7 +215,15 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
if (!settings.isHighPerformance() || framesDone % fps == 0) { 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 // 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() { private void executeTaskQueue() {
//#if MC>=11400 //#if MC>=11400
while (true) {
while (mc.overlay != null) {
drawGui();
((MinecraftMethodAccessor) mc).replayModExecuteTaskQueue();
}
CompletableFuture<Void> resourceReloadFuture = ((MinecraftAccessor) mc).getResourceReloadFuture();
if (resourceReloadFuture != null) {
((MinecraftAccessor) mc).setResourceReloadFuture(null);
mc.reloadResources().thenRun(() -> resourceReloadFuture.complete(null));
continue;
}
break;
}
((MCVer.MinecraftMethodAccessor) mc).replayModExecuteTaskQueue(); ((MCVer.MinecraftMethodAccessor) mc).replayModExecuteTaskQueue();
//#else //#else
//$$ Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks(); //$$ Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
@@ -420,14 +444,14 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
} }
public void drawGui() { public boolean drawGui() {
do { do {
//#if MC>=11400 //#if MC>=11400
if (GLFW.glfwWindowShouldClose(getWindow(mc).getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { if (GLFW.glfwWindowShouldClose(getWindow(mc).getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#else //#else
//$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).getCrashReporter() != null) { //$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#endif //#endif
return; return false;
} }
// Resize the GUI framebuffer if the display size changed // 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 mouseX = (int) mc.mouse.getX() * getWindow(mc).getScaledWidth() / displayWidth;
int mouseY = (int) mc.mouse.getY() * getWindow(mc).getScaledHeight() / displayHeight; int mouseY = (int) mc.mouse.getY() * getWindow(mc).getScaledHeight() / displayHeight;
gui.toMinecraft().tick(); if (mc.overlay != null) {
gui.toMinecraft().render(mouseX, mouseY, 0); 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 //#else
//$$ int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; //$$ int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
//$$ int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; //$$ int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
@@ -544,15 +578,9 @@ public class VideoRenderer implements RenderInfo {
//$$ Mouse.setGrabbed(false); //$$ Mouse.setGrabbed(false);
//$$ } //$$ }
//#endif //#endif
if (paused) {
try { return !hasFailed() && !cancelled;
Thread.sleep(50); } while (true);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
} while (paused && !hasFailed() && !cancelled);
} }
private boolean displaySizeChanged() { private boolean displaySizeChanged() {