package com.replaymod.render.rendering; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.*; import com.replaymod.render.frame.*; import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.processor.*; import com.replaymod.render.utils.PixelBufferObject; import lombok.experimental.UtilityClass; @UtilityClass public class Pipelines { public static Pipeline newPipeline(RenderSettings.RenderMethod method, RenderInfo renderInfo, FrameConsumer consumer) { switch (method) { case DEFAULT: return newDefaultPipeline(renderInfo, consumer); case STEREOSCOPIC: return newStereoscopicPipeline(renderInfo, consumer); case CUBIC: return newCubicPipeline(renderInfo, consumer); case EQUIRECTANGULAR: return newEquirectangularPipeline(renderInfo, consumer); case ODS: return newODSPipeline(renderInfo, consumer); } throw new UnsupportedOperationException("Unknown method: " + method); } public static Pipeline newDefaultPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); } else { capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); } return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer); } public static Pipeline newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); } else { capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo); } return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer); } public static Pipeline newCubicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); } else { capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer); } public static Pipeline newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED) { capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); } else { capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(capturer, new EquirectangularToRGBProcessor(settings.getVideoWidth() / 4), consumer); } public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); FrameCapturer capturer = new ODSFrameCapturer(new EntityRendererHandler(settings), renderInfo, settings.getVideoWidth() / 4); return new Pipeline<>(capturer, new ODSToRGBProcessor(settings.getVideoWidth() / 4), consumer); } }