package eu.crushedpixel.replaymod.video.rendering; import eu.crushedpixel.replaymod.opengl.PixelBufferObject; import eu.crushedpixel.replaymod.settings.RenderOptions; import eu.crushedpixel.replaymod.video.EntityRendererHandler; import eu.crushedpixel.replaymod.video.capturer.*; import eu.crushedpixel.replaymod.video.frame.CubicOpenGlFrame; import eu.crushedpixel.replaymod.video.frame.OpenGlFrame; import eu.crushedpixel.replaymod.video.frame.RGBFrame; import eu.crushedpixel.replaymod.video.frame.StereoscopicOpenGlFrame; import eu.crushedpixel.replaymod.video.processor.CubicToRGBProcessor; import eu.crushedpixel.replaymod.video.processor.EquirectangularToRGBProcessor; import eu.crushedpixel.replaymod.video.processor.OpenGlToRGBProcessor; import eu.crushedpixel.replaymod.video.processor.StereoscopicToRGBProcessor; import lombok.experimental.UtilityClass; @UtilityClass public class Pipelines { public enum Preset { DEFAULT, STEREOSCOPIC, CUBIC, EQUIRECTANGULAR } public static Pipeline newPipeline(Preset preset, RenderInfo renderInfo, FrameConsumer consumer) { switch (preset) { case DEFAULT: return newDefaultPipeline(renderInfo, consumer); case STEREOSCOPIC: return newStereoscopicPipeline(renderInfo, consumer); case CUBIC: return newCubicPipeline(renderInfo, consumer); case EQUIRECTANGULAR: return newEquirectangularPipeline(renderInfo, consumer); } throw new UnsupportedOperationException("Unknown preset: " + preset); } public static Pipeline newDefaultPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderOptions options = renderInfo.getRenderOptions(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo); } else { capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo); } return new Pipeline(capturer, new OpenGlToRGBProcessor(), consumer); } public static Pipeline newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderOptions options = renderInfo.getRenderOptions(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo); } else { capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo); } return new Pipeline(capturer, new StereoscopicToRGBProcessor(), consumer); } public static Pipeline newCubicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderOptions options = renderInfo.getRenderOptions(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo, options.getWidth() / 4); } else { capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo, options.getWidth() / 4); } return new Pipeline(capturer, new CubicToRGBProcessor(), consumer); } public static Pipeline newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderOptions options = renderInfo.getRenderOptions(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo, options.getWidth() / 4); } else { capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(options), renderInfo, options.getWidth() / 4); } return new Pipeline(capturer, new EquirectangularToRGBProcessor(options.getWidth() / 4), consumer); } }