Start renderer after screen activation

This commit is contained in:
2026-08-11 00:22:51 +01:00
parent 865a285e63
commit ee7848f96a
@@ -15,7 +15,6 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.Screenshot; import net.minecraft.client.Screenshot;
import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.GuiGraphicsExtractor;
@@ -36,8 +35,6 @@ public final class RenderCatalogClient implements ClientModInitializer {
private Path outputDir; private Path outputDir;
private int currentJobIndex; private int currentJobIndex;
private RenderScreen renderScreen; private RenderScreen renderScreen;
private int renderScreenDelayTicks = 60;
private boolean renderStarted;
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
@@ -63,21 +60,36 @@ public final class RenderCatalogClient implements ClientModInitializer {
Minecraft client = Minecraft.getInstance(); Minecraft client = Minecraft.getInstance();
renderScreen = new RenderScreen(); renderScreen = new RenderScreen();
ClientTickEvents.END_CLIENT_TICK.register(tickedClient -> { client.execute(() -> {
if (renderScreenDelayTicks > 0) { System.out.println("[renderer] opening render screen");
renderScreenDelayTicks--; client.setScreenAndShow(renderScreen);
if (renderScreenDelayTicks == 0) { });
System.out.println("[renderer] opening render screen");
tickedClient.setScreenAndShow(renderScreen); Thread renderStarter = new Thread(() -> {
long deadline = System.currentTimeMillis() + SCREEN_ACTIVATION_TIMEOUT_MILLIS;
while (System.currentTimeMillis() < deadline) {
if (renderScreen.activated) {
client.execute(() -> {
System.out.println("[renderer] starting render loop after screen activation");
renderCurrentJob(client, renderScreen);
});
return;
}
try {
Thread.sleep(100L);
} catch (InterruptedException exception) {
Thread.currentThread().interrupt();
return;
} }
} }
if (!renderStarted && tickedClient.screen == renderScreen) { System.err.println("[renderer] render screen never activated within " + SCREEN_ACTIVATION_TIMEOUT_MILLIS + "ms");
renderStarted = true; Runtime.getRuntime().halt(1);
System.out.println("[renderer] starting render loop from client tick"); }, "renderer-startup-watchdog");
renderCurrentJob(tickedClient, renderScreen); renderStarter.setDaemon(true);
} renderStarter.start();
});
Thread activationWatchdog = new Thread(() -> { Thread activationWatchdog = new Thread(() -> {
try { try {