PonderRenderer.java (1866B)
1 package de.oshgnacknak.create_ponder_wonder; 2 3 import com.simibubi.create.foundation.ponder.PonderScene; 4 import com.simibubi.create.foundation.ponder.PonderWonderUI; 5 import io.netty.util.concurrent.GlobalEventExecutor; 6 import io.netty.util.concurrent.Promise; 7 import net.minecraft.client.Minecraft; 8 import net.minecraft.client.renderer.texture.NativeImage; 9 10 import java.util.Iterator; 11 import java.util.concurrent.ExecutionException; 12 13 public class PonderRenderer implements Iterable<PonderRenderer.RenderResult>, Iterator<PonderRenderer.RenderResult> { 14 15 private static final int FPS = 60; 16 private static final int MAX_FRAMES = Integer.MAX_VALUE; 17 18 private final PonderWonderUI ponder; 19 private int frame; 20 21 public PonderRenderer(PonderScene ponder) { 22 this.ponder = new PonderWonderUI(ponder); 23 this.frame = 0; 24 } 25 26 @Override 27 public Iterator<RenderResult> iterator() { 28 return this; 29 } 30 31 @Override 32 public boolean hasNext() { 33 return !ponder.isFinished() && frame < MAX_FRAMES; 34 } 35 36 @Override 37 public RenderResult next() { 38 Promise<RenderResult> promise = GlobalEventExecutor.INSTANCE.newPromise(); 39 40 Minecraft.getInstance().field_213275_aU.add(() -> { 41 try { 42 float pt = (frame % PonderRenderer.FPS) / (PonderRenderer.FPS / 3.0f); 43 NativeImage img = RenderUtils.render(ms -> 44 ponder.ponderWonderRenderWindow(ms, pt)); 45 promise.setSuccess(new RenderResult(img, frame)); 46 47 if (frame % 3 == 2) { 48 ponder.tick(); 49 } 50 frame++; 51 } catch (Throwable e) { 52 promise.setFailure(e); 53 } 54 }); 55 56 try { 57 return promise.get(); 58 } catch (InterruptedException | ExecutionException e) { 59 throw new RuntimeException(e); 60 } 61 } 62 63 public static class RenderResult { 64 public final NativeImage image; 65 public final int frame; 66 67 public RenderResult(NativeImage image, int frame) { 68 this.image = image; 69 this.frame = frame; 70 } 71 } 72 }