commit 072d24f0f96a6a3c9679116f862671a7059f94f0
parent f3d22aa23eb9c212f8ec204f9fec77c1afc34ccb
Author: Oshgnacknak <osh@oshgnacknak.de>
Date: Fri, 9 Apr 2021 15:17:58 +0200
Render on MCs render-thread
Diffstat:
1 file changed, 46 insertions(+), 26 deletions(-)
diff --git a/src/main/java/de/oshgnacknak/create_ponder_wonder/commands/DumpPonsersCommand.java b/src/main/java/de/oshgnacknak/create_ponder_wonder/commands/DumpPonsersCommand.java
@@ -5,58 +5,78 @@ import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.simibubi.create.foundation.ponder.PonderWonderUI;
-import com.simibubi.create.foundation.ponder.PonderScene;
import de.oshgnacknak.create_ponder_wonder.CreatePonderWonder;
import de.oshgnacknak.create_ponder_wonder.PonderIndexer;
import de.oshgnacknak.create_ponder_wonder.RenderUtils;
+import io.netty.util.concurrent.GlobalEventExecutor;
+import io.netty.util.concurrent.Promise;
import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.NativeImage;
import net.minecraft.command.CommandSource;
+import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.util.concurrent.ExecutionException;
public class DumpPonsersCommand implements Command<CommandSource> {
- private static final int MAX_FRAMES = 10;
+ private static final int FPS = 60;
+ private static final int MAX_FRAMES = FPS*3;
private static final long MAX_PONDERS = 1;
@Override
public int run(CommandContext<CommandSource> context) throws CommandSyntaxException {
String path = StringArgumentType.getString(context, "path");
- List<PonderWonderUI> ponderUIs =
- PonderIndexer
+ PonderIndexer
.getPonders()
.limit(MAX_PONDERS)
.map(PonderWonderUI::new)
- .collect(Collectors.toList());
+ .forEach(ui -> renderPonderUI(path, ui));
- for (PonderWonderUI ponderUI : ponderUIs) {
- for (int frame = 0; frame < MAX_FRAMES; frame++) {
- renderPonderScene(path, ponderUI, frame);
- ponderUI.getActiveScene().tick();
- }
- }
return 0;
}
- private void renderPonderScene(String basePath, PonderWonderUI ponderWonderUI, int frame) {
+ private void renderPonderUI(String basePath, PonderWonderUI ponderWonderUI) {
try {
- Path path = Paths.get(
- basePath,
- CreatePonderWonder.MODID,
- ponderWonderUI.getActiveScene().getString("out"),
- String.format("%06d.png", frame));
- Files.createDirectories(path.getParent());
-
- RenderUtils.addRenderJob(
- ponderWonderUI::ponderWonderRenderWindow,
- path);
- } catch (Exception e) {
- throw new RuntimeException(e);
+ for (int frame = 0; frame < MAX_FRAMES; frame++) {
+ Promise<NativeImage> promise = renderUI(ponderWonderUI, frame);
+ NativeImage img = promise.get();
+
+ Path path = Paths.get(
+ basePath,
+ CreatePonderWonder.MODID,
+ ponderWonderUI.getActiveScene().getString("out"),
+ String.format("%06d.png", frame));
+
+ Files.createDirectories(path.getParent());
+ img.write(path);
+
+ if (frame % 3 == 2) {
+ ponderWonderUI.tick();
+ }
+ }
+ } catch (IOException | InterruptedException | ExecutionException e) {
+ CreatePonderWonder.LOGGER.error("Could not save image", e);
}
}
+
+ private Promise<NativeImage> renderUI(PonderWonderUI ponderWonderUI, int frame) {
+ Promise<NativeImage> promise = GlobalEventExecutor.INSTANCE.newPromise();
+
+ float pt = (frame % FPS) / (FPS / 3.0f);
+ Minecraft.getInstance().field_213275_aU.add(() -> {
+ try {
+ NativeImage img = RenderUtils.render(ms ->
+ ponderWonderUI.ponderWonderRenderWindow(ms, pt));
+ promise.setSuccess(img);
+ } catch (Exception e) {
+ promise.setFailure(e);
+ }
+ });
+
+ return promise;
+ }
}