[1.14+] Fix resource pack loading during rendering (fixes #182)
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user