package com.replaymod.render.rendering; import com.replaymod.render.RenderSettings; import com.replaymod.render.blend.BlendFrameCapturer; import com.replaymod.render.capturer.CubicOpenGlFrameCapturer; import com.replaymod.render.capturer.CubicPboOpenGlFrameCapturer; import com.replaymod.render.capturer.ODSFrameCapturer; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.SimpleOpenGlFrameCapturer; import com.replaymod.render.capturer.SimplePboOpenGlFrameCapturer; import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.capturer.StereoscopicPboOpenGlFrameCapturer; import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.frame.StereoscopicOpenGlFrame; import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.processor.CubicToBitmapProcessor; import com.replaymod.render.processor.DummyProcessor; import com.replaymod.render.processor.EquirectangularToBitmapProcessor; import com.replaymod.render.processor.ODSToBitmapProcessor; import com.replaymod.render.processor.OpenGlToBitmapProcessor; import com.replaymod.render.processor.StereoscopicToBitmapProcessor; import com.replaymod.render.utils.PixelBufferObject; import java.util.Map; 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); case BLEND: throw new UnsupportedOperationException("Use newBlendPipeline instead!"); } throw new UnsupportedOperationException("Unknown method: " + method); } public static Pipeline newDefaultPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED || settings.isDepthMap()) { capturer = new SimplePboOpenGlFrameCapturer(worldRenderer, renderInfo); } else { capturer = new SimpleOpenGlFrameCapturer(worldRenderer, renderInfo); } return new Pipeline<>(worldRenderer, capturer, new OpenGlToBitmapProcessor(), consumer); } public static Pipeline newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED || settings.isDepthMap()) { capturer = new StereoscopicPboOpenGlFrameCapturer(worldRenderer, renderInfo); } else { capturer = new StereoscopicOpenGlFrameCapturer(worldRenderer, renderInfo); } return new Pipeline<>(worldRenderer, capturer, new StereoscopicToBitmapProcessor(), consumer); } public static Pipeline newCubicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED || settings.isDepthMap()) { capturer = new CubicPboOpenGlFrameCapturer(worldRenderer, renderInfo, settings.getVideoWidth() / 4); } else { capturer = new CubicOpenGlFrameCapturer(worldRenderer, renderInfo, settings.getVideoWidth() / 4); } return new Pipeline<>(worldRenderer, capturer, new CubicToBitmapProcessor(), consumer); } public static Pipeline newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); EquirectangularToBitmapProcessor processor = new EquirectangularToBitmapProcessor(settings.getVideoWidth(), settings.getVideoHeight(), settings.getSphericalFovX()); FrameCapturer capturer; if (PixelBufferObject.SUPPORTED || settings.isDepthMap()) { capturer = new CubicPboOpenGlFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize()); } else { capturer = new CubicOpenGlFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize()); } return new Pipeline<>(worldRenderer, capturer, processor, consumer); } public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); ODSToBitmapProcessor processor = new ODSToBitmapProcessor(settings.getVideoWidth(), settings.getVideoHeight(), settings.getSphericalFovX()); //#if MC>=11600 boolean iris = net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded("iris"); FrameCapturer capturer = iris ? new com.replaymod.render.capturer.IrisODSFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize()) : new ODSFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize()); //#else //$$ FrameCapturer capturer = new ODSFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize()); //#endif return new Pipeline<>(worldRenderer, capturer, processor, consumer); } public static Pipeline newBlendPipeline(RenderInfo renderInfo) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer = new BlendFrameCapturer(worldRenderer, renderInfo); FrameConsumer consumer = new FrameConsumer() { @Override public void consume(Map channels) { } @Override public void close() { } @Override public boolean isParallelCapable() { return true; } }; return new Pipeline<>(worldRenderer, capturer, new DummyProcessor<>(), consumer); } }