create_ponder_wonder

Exports Create ponders to disk.
git clone git://git.oshgnacknak.de/create_ponder_wonder.git
Log | Files | Refs | README

commit 072d24f0f96a6a3c9679116f862671a7059f94f0
parent f3d22aa23eb9c212f8ec204f9fec77c1afc34ccb
Author: Oshgnacknak <osh@oshgnacknak.de>
Date:   Fri,  9 Apr 2021 15:17:58 +0200

Render on MCs render-thread

Diffstat:
Msrc/main/java/de/oshgnacknak/create_ponder_wonder/commands/DumpPonsersCommand.java | 72++++++++++++++++++++++++++++++++++++++++++++++--------------------------
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; + } }