From aee486c4f3538357f2bf25ddbd117e45bd8ea188 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 3 Oct 2020 14:41:08 +0200 Subject: [PATCH] Stop assuming that our render pipeline will only process RGB frames For one, we have already switched to RGBA some time ago, so the name was technically incorrect already. But the main reason is that we'll want to use them for depth maps as well (and potentially maybe even for HDR images if that's possible with canvas?). --- .../advancedscreenshots/ScreenshotWriter.java | 6 +-- .../com/replaymod/render/VideoWriter.java | 6 +-- .../render/blend/BlendFrameCapturer.java | 8 ++-- .../MultiFramePboOpenGlFrameCapturer.java | 2 +- .../render/capturer/OpenGlFrameCapturer.java | 2 +- .../SimplePboOpenGlFrameCapturer.java | 2 +- .../frame/{RGBFrame.java => BitmapFrame.java} | 16 ++++--- .../replaymod/render/frame/OpenGlFrame.java | 10 +++-- .../render/gui/GuiVideoRenderer.java | 4 +- .../processor/CubicToBitmapProcessor.java | 35 ++++++++++++++++ .../render/processor/CubicToRGBProcessor.java | 33 --------------- ... => EquirectangularToBitmapProcessor.java} | 17 ++++---- ...ocessor.java => ODSToBitmapProcessor.java} | 21 +++++----- ...ssor.java => OpenGlToBitmapProcessor.java} | 11 ++--- .../StereoscopicToBitmapProcessor.java | 26 ++++++++++++ .../processor/StereoscopicToRGBProcessor.java | 27 ------------ .../replaymod/render/rendering/Pipelines.java | 42 +++++++++---------- .../render/rendering/VideoRenderer.java | 4 +- .../com/replaymod/render/utils/Utils.java | 29 ++++++++++--- 19 files changed, 165 insertions(+), 136 deletions(-) rename src/main/java/com/replaymod/render/frame/{RGBFrame.java => BitmapFrame.java} (63%) create mode 100644 src/main/java/com/replaymod/render/processor/CubicToBitmapProcessor.java delete mode 100644 src/main/java/com/replaymod/render/processor/CubicToRGBProcessor.java rename src/main/java/com/replaymod/render/processor/{EquirectangularToRGBProcessor.java => EquirectangularToBitmapProcessor.java} (90%) rename src/main/java/com/replaymod/render/processor/{ODSToRGBProcessor.java => ODSToBitmapProcessor.java} (55%) rename src/main/java/com/replaymod/render/processor/{OpenGlToRGBProcessor.java => OpenGlToBitmapProcessor.java} (74%) create mode 100644 src/main/java/com/replaymod/render/processor/StereoscopicToBitmapProcessor.java delete mode 100644 src/main/java/com/replaymod/render/processor/StereoscopicToRGBProcessor.java diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java index b79dfe9c..363bbf23 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -4,7 +4,7 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; import com.replaymod.extras.ReplayModExtras; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.replay.ReplayModReplay; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; @@ -14,7 +14,7 @@ import net.minecraft.util.crash.CrashReport; import java.io.File; import java.io.IOException; -public class ScreenshotWriter implements FrameConsumer { +public class ScreenshotWriter implements FrameConsumer { private final File outputFile; @@ -23,7 +23,7 @@ public class ScreenshotWriter implements FrameConsumer { } @Override - public void consume(RGBFrame frame) { + public void consume(BitmapFrame frame) { // skip the first frame, in which not all chunks are properly loaded if (frame.getFrameId() == 0) return; diff --git a/src/main/java/com/replaymod/render/VideoWriter.java b/src/main/java/com/replaymod/render/VideoWriter.java index 1d306a36..62f6119a 100644 --- a/src/main/java/com/replaymod/render/VideoWriter.java +++ b/src/main/java/com/replaymod/render/VideoWriter.java @@ -1,7 +1,7 @@ package com.replaymod.render; import com.replaymod.core.versions.MCVer; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.render.rendering.VideoRenderer; import com.replaymod.render.utils.ByteBufferPool; @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit; import static com.replaymod.render.ReplayModRender.LOGGER; import static org.apache.commons.lang3.Validate.isTrue; -public class VideoWriter implements FrameConsumer { +public class VideoWriter implements FrameConsumer { private final VideoRenderer renderer; private final RenderSettings settings; @@ -103,7 +103,7 @@ public class VideoWriter implements FrameConsumer { } @Override - public void consume(RGBFrame frame) { + public void consume(BitmapFrame frame) { try { checkSize(frame.getSize()); channel.write(frame.getByteBuffer()); diff --git a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java index 3b31b127..76dc8045 100644 --- a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java +++ b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java @@ -3,14 +3,14 @@ package com.replaymod.render.blend; import com.replaymod.core.versions.MCVer; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import java.io.IOException; -public class BlendFrameCapturer implements FrameCapturer { +public class BlendFrameCapturer implements FrameCapturer { protected final WorldRenderer worldRenderer; protected final RenderInfo renderInfo; protected int framesDone; @@ -26,7 +26,7 @@ public class BlendFrameCapturer implements FrameCapturer { } @Override - public RGBFrame process() { + public BitmapFrame process() { if (framesDone == 0) { BlendState.getState().setup(); } @@ -37,7 +37,7 @@ public class BlendFrameCapturer implements FrameCapturer { worldRenderer.renderWorld(MCVer.getRenderPartialTicks(), null); BlendState.getState().postFrame(framesDone); - return new RGBFrame(framesDone++, new Dimension(0, 0), ByteBufferPool.allocate(0)); + return new BitmapFrame(framesDone++, new Dimension(0, 0), 0, ByteBufferPool.allocate(0)); } @Override diff --git a/src/main/java/com/replaymod/render/capturer/MultiFramePboOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/MultiFramePboOpenGlFrameCapturer.java index c552df43..873f1fbb 100644 --- a/src/main/java/com/replaymod/render/capturer/MultiFramePboOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/MultiFramePboOpenGlFrameCapturer.java @@ -53,7 +53,7 @@ public abstract class MultiFramePboOpenGlFrameCapturer { + + @Override + public BitmapFrame process(CubicOpenGlFrame rawFrame) { + int size = rawFrame.getLeft().getSize().getWidth(); + int bpp = rawFrame.getLeft().getBytesPerPixel(); + int width = size * 4; + int height = size * 3; + ByteBuffer result = ByteBufferPool.allocate(width * height * bpp); + openGlBytesToBitmap(rawFrame.getLeft(), 0, size, result, width); + openGlBytesToBitmap(rawFrame.getFront(), size, size, result, width); + openGlBytesToBitmap(rawFrame.getRight(), size * 2, size, result, width); + openGlBytesToBitmap(rawFrame.getBack(), size * 3, size, result, width); + openGlBytesToBitmap(rawFrame.getTop(), size, 0, result, width); + openGlBytesToBitmap(rawFrame.getBottom(), size, size * 2, result, width); + ByteBufferPool.release(rawFrame.getLeft().getByteBuffer()); + ByteBufferPool.release(rawFrame.getRight().getByteBuffer()); + ByteBufferPool.release(rawFrame.getFront().getByteBuffer()); + ByteBufferPool.release(rawFrame.getBack().getByteBuffer()); + ByteBufferPool.release(rawFrame.getTop().getByteBuffer()); + ByteBufferPool.release(rawFrame.getBottom().getByteBuffer()); + return new BitmapFrame(rawFrame.getFrameId(), new Dimension(width, height), bpp, result); + } +} diff --git a/src/main/java/com/replaymod/render/processor/CubicToRGBProcessor.java b/src/main/java/com/replaymod/render/processor/CubicToRGBProcessor.java deleted file mode 100644 index b014f77b..00000000 --- a/src/main/java/com/replaymod/render/processor/CubicToRGBProcessor.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.replaymod.render.processor; - -import com.replaymod.render.frame.CubicOpenGlFrame; -import com.replaymod.render.frame.RGBFrame; -import com.replaymod.render.utils.ByteBufferPool; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; - -import java.nio.ByteBuffer; - -import static com.replaymod.render.utils.Utils.openGlBytesToRBG; - -public class CubicToRGBProcessor extends AbstractFrameProcessor { - @Override - public RGBFrame process(CubicOpenGlFrame rawFrame) { - int size = rawFrame.getLeft().getSize().getWidth(); - int width = size * 4; - int height = size * 3; - ByteBuffer result = ByteBufferPool.allocate(width * height * 4); - openGlBytesToRBG(rawFrame.getLeft().getByteBuffer(), size, 0, size, result, width); - openGlBytesToRBG(rawFrame.getFront().getByteBuffer(), size, size, size, result, width); - openGlBytesToRBG(rawFrame.getRight().getByteBuffer(), size, size * 2, size, result, width); - openGlBytesToRBG(rawFrame.getBack().getByteBuffer(), size, size * 3, size, result, width); - openGlBytesToRBG(rawFrame.getTop().getByteBuffer(), size, size, 0, result, width); - openGlBytesToRBG(rawFrame.getBottom().getByteBuffer(), size, size, size * 2, result, width); - ByteBufferPool.release(rawFrame.getLeft().getByteBuffer()); - ByteBufferPool.release(rawFrame.getRight().getByteBuffer()); - ByteBufferPool.release(rawFrame.getFront().getByteBuffer()); - ByteBufferPool.release(rawFrame.getBack().getByteBuffer()); - ByteBufferPool.release(rawFrame.getTop().getByteBuffer()); - ByteBufferPool.release(rawFrame.getBottom().getByteBuffer()); - return new RGBFrame(rawFrame.getFrameId(), new Dimension(width, height), result); - } -} diff --git a/src/main/java/com/replaymod/render/processor/EquirectangularToRGBProcessor.java b/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java similarity index 90% rename from src/main/java/com/replaymod/render/processor/EquirectangularToRGBProcessor.java rename to src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java index b0e4cf2e..62b78e62 100644 --- a/src/main/java/com/replaymod/render/processor/EquirectangularToRGBProcessor.java +++ b/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java @@ -1,7 +1,7 @@ package com.replaymod.render.processor; import com.replaymod.render.frame.CubicOpenGlFrame; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import org.apache.commons.lang3.Validate; @@ -10,7 +10,7 @@ import java.nio.ByteBuffer; import static java.lang.Math.PI; -public class EquirectangularToRGBProcessor extends AbstractFrameProcessor { +public class EquirectangularToBitmapProcessor extends AbstractFrameProcessor { private static final byte IMAGE_BACK = 0; private static final byte IMAGE_FRONT = 1; private static final byte IMAGE_LEFT = 2; @@ -26,7 +26,7 @@ public class EquirectangularToRGBProcessor extends AbstractFrameProcessor { - private final EquirectangularToRGBProcessor processor; +public class ODSToBitmapProcessor extends AbstractFrameProcessor { + private final EquirectangularToBitmapProcessor processor; - public ODSToRGBProcessor(int outputWidth, int outputHeight, int sphericalFovX) { - processor = new EquirectangularToRGBProcessor(outputWidth, outputHeight / 2, sphericalFovX); + public ODSToBitmapProcessor(int outputWidth, int outputHeight, int sphericalFovX) { + processor = new EquirectangularToBitmapProcessor(outputWidth, outputHeight / 2, sphericalFovX); } @Override - public RGBFrame process(ODSOpenGlFrame rawFrame) { - RGBFrame leftFrame = processor.process(rawFrame.getLeft()); - RGBFrame rightFrame = processor.process(rawFrame.getRight()); + public BitmapFrame process(ODSOpenGlFrame rawFrame) { + BitmapFrame leftFrame = processor.process(rawFrame.getLeft()); + BitmapFrame rightFrame = processor.process(rawFrame.getRight()); ReadableDimension size = new Dimension(leftFrame.getSize().getWidth(), leftFrame.getSize().getHeight() * 2); - ByteBuffer result = ByteBufferPool.allocate(size.getWidth() * size.getHeight() * 4); + int bpp = rawFrame.getLeft().getLeft().getBytesPerPixel(); + ByteBuffer result = ByteBufferPool.allocate(size.getWidth() * size.getHeight() * bpp); result.put(leftFrame.getByteBuffer()); result.put(rightFrame.getByteBuffer()); result.rewind(); ByteBufferPool.release(leftFrame.getByteBuffer()); ByteBufferPool.release(rightFrame.getByteBuffer()); - return new RGBFrame(rawFrame.getFrameId(), size, result); + return new BitmapFrame(rawFrame.getFrameId(), size, bpp, result); } @Override diff --git a/src/main/java/com/replaymod/render/processor/OpenGlToRGBProcessor.java b/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java similarity index 74% rename from src/main/java/com/replaymod/render/processor/OpenGlToRGBProcessor.java rename to src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java index cc32c5d8..6cb60f5e 100644 --- a/src/main/java/com/replaymod/render/processor/OpenGlToRGBProcessor.java +++ b/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java @@ -1,21 +1,22 @@ package com.replaymod.render.processor; import com.replaymod.render.frame.OpenGlFrame; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import java.nio.ByteBuffer; -public class OpenGlToRGBProcessor extends AbstractFrameProcessor { +public class OpenGlToBitmapProcessor extends AbstractFrameProcessor { private byte[] row, rowSwap; @Override - public RGBFrame process(OpenGlFrame rawFrame) { + public BitmapFrame process(OpenGlFrame rawFrame) { // Flip whole image in place ReadableDimension size = rawFrame.getSize(); - int rowSize = size.getWidth() * 4; + int bpp = rawFrame.getBytesPerPixel(); + int rowSize = size.getWidth() * bpp; if (row == null || row.length < rowSize) { row = new byte[rowSize]; rowSwap = new byte[rowSize]; @@ -37,6 +38,6 @@ public class OpenGlToRGBProcessor extends AbstractFrameProcessor { + @Override + public BitmapFrame process(StereoscopicOpenGlFrame rawFrame) { + ReadableDimension size = rawFrame.getLeft().getSize(); + int width = size.getWidth(); + int bpp = rawFrame.getLeft().getBytesPerPixel(); + ByteBuffer result = ByteBufferPool.allocate(width * 2 * size.getHeight() * bpp); + openGlBytesToBitmap(rawFrame.getLeft(), 0, 0, result, width * 2); + openGlBytesToBitmap(rawFrame.getRight(), size.getWidth(), 0, result, width * 2); + ByteBufferPool.release(rawFrame.getLeft().getByteBuffer()); + ByteBufferPool.release(rawFrame.getRight().getByteBuffer()); + return new BitmapFrame(rawFrame.getFrameId(), new Dimension(width * 2, size.getHeight()), bpp, result); + } +} diff --git a/src/main/java/com/replaymod/render/processor/StereoscopicToRGBProcessor.java b/src/main/java/com/replaymod/render/processor/StereoscopicToRGBProcessor.java deleted file mode 100644 index 5e6a1f61..00000000 --- a/src/main/java/com/replaymod/render/processor/StereoscopicToRGBProcessor.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.replaymod.render.processor; - -import com.replaymod.render.frame.RGBFrame; -import com.replaymod.render.frame.StereoscopicOpenGlFrame; -import com.replaymod.render.utils.ByteBufferPool; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; - -import java.nio.ByteBuffer; - -import static com.replaymod.render.utils.Utils.openGlBytesToRBG; - -public class StereoscopicToRGBProcessor extends AbstractFrameProcessor { - @Override - public RGBFrame process(StereoscopicOpenGlFrame rawFrame) { - ReadableDimension size = rawFrame.getLeft().getSize(); - int width = size.getWidth(); - ByteBuffer leftBuffer = rawFrame.getLeft().getByteBuffer(); - ByteBuffer rightBuffer = rawFrame.getRight().getByteBuffer(); - ByteBuffer result = ByteBufferPool.allocate(width * 2 * size.getHeight() * 4); - openGlBytesToRBG(leftBuffer, width, 0, 0, result, width * 2); - openGlBytesToRBG(rightBuffer, width, size.getWidth(), 0, result, width * 2); - ByteBufferPool.release(leftBuffer); - ByteBufferPool.release(rightBuffer); - return new RGBFrame(rawFrame.getFrameId(), new Dimension(width * 2, size.getHeight()), result); - } -} diff --git a/src/main/java/com/replaymod/render/rendering/Pipelines.java b/src/main/java/com/replaymod/render/rendering/Pipelines.java index 51c4a2a8..5cd0de6f 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipelines.java +++ b/src/main/java/com/replaymod/render/rendering/Pipelines.java @@ -14,19 +14,19 @@ 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.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.frame.StereoscopicOpenGlFrame; import com.replaymod.render.hooks.EntityRendererHandler; -import com.replaymod.render.processor.CubicToRGBProcessor; +import com.replaymod.render.processor.CubicToBitmapProcessor; import com.replaymod.render.processor.DummyProcessor; -import com.replaymod.render.processor.EquirectangularToRGBProcessor; -import com.replaymod.render.processor.ODSToRGBProcessor; -import com.replaymod.render.processor.OpenGlToRGBProcessor; -import com.replaymod.render.processor.StereoscopicToRGBProcessor; +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; public class Pipelines { - public static Pipeline newPipeline(RenderSettings.RenderMethod method, RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newPipeline(RenderSettings.RenderMethod method, RenderInfo renderInfo, FrameConsumer consumer) { switch (method) { case DEFAULT: return newDefaultPipeline(renderInfo, consumer); @@ -44,7 +44,7 @@ public class Pipelines { throw new UnsupportedOperationException("Unknown method: " + method); } - public static Pipeline newDefaultPipeline(RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newDefaultPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; @@ -53,10 +53,10 @@ public class Pipelines { } else { capturer = new SimpleOpenGlFrameCapturer(worldRenderer, renderInfo); } - return new Pipeline<>(worldRenderer, capturer, new OpenGlToRGBProcessor(), consumer); + return new Pipeline<>(worldRenderer, capturer, new OpenGlToBitmapProcessor(), consumer); } - public static Pipeline newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; @@ -65,10 +65,10 @@ public class Pipelines { } else { capturer = new StereoscopicOpenGlFrameCapturer(worldRenderer, renderInfo); } - return new Pipeline<>(worldRenderer, capturer, new StereoscopicToRGBProcessor(), consumer); + return new Pipeline<>(worldRenderer, capturer, new StereoscopicToBitmapProcessor(), consumer); } - public static Pipeline newCubicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newCubicPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); FrameCapturer capturer; @@ -77,14 +77,14 @@ public class Pipelines { } else { capturer = new CubicOpenGlFrameCapturer(worldRenderer, renderInfo, settings.getVideoWidth() / 4); } - return new Pipeline<>(worldRenderer, capturer, new CubicToRGBProcessor(), consumer); + return new Pipeline<>(worldRenderer, capturer, new CubicToBitmapProcessor(), consumer); } - public static Pipeline newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); - EquirectangularToRGBProcessor processor = new EquirectangularToRGBProcessor(settings.getVideoWidth(), + EquirectangularToBitmapProcessor processor = new EquirectangularToBitmapProcessor(settings.getVideoWidth(), settings.getVideoHeight(), settings.getSphericalFovX()); FrameCapturer capturer; @@ -96,11 +96,11 @@ public class Pipelines { return new Pipeline<>(worldRenderer, capturer, processor, consumer); } - public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { + public static Pipeline newODSPipeline(RenderInfo renderInfo, FrameConsumer consumer) { RenderSettings settings = renderInfo.getRenderSettings(); WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo); - ODSToRGBProcessor processor = new ODSToRGBProcessor(settings.getVideoWidth(), + ODSToBitmapProcessor processor = new ODSToBitmapProcessor(settings.getVideoWidth(), settings.getVideoHeight(), settings.getSphericalFovX()); FrameCapturer capturer = @@ -108,13 +108,13 @@ public class Pipelines { return new Pipeline<>(worldRenderer, capturer, processor, consumer); } - public static Pipeline newBlendPipeline(RenderInfo renderInfo) { + 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() { + FrameCapturer capturer = new BlendFrameCapturer(worldRenderer, renderInfo); + FrameConsumer consumer = new FrameConsumer() { @Override - public void consume(RGBFrame frame) { + public void consume(BitmapFrame frame) { } @Override diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 1e1481a1..de2110b5 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -13,7 +13,7 @@ import com.replaymod.render.VideoWriter; import com.replaymod.render.blend.BlendState; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.events.ReplayRenderCallback; -import com.replaymod.render.frame.RGBFrame; +import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.metadata.MetadataInjector; @@ -124,7 +124,7 @@ public class VideoRenderer implements RenderInfo { this.renderingPipeline = Pipelines.newPipeline(settings.getRenderMethod(), this, videoWriter = new VideoWriter(this) { @Override - public void consume(RGBFrame frame) { + public void consume(BitmapFrame frame) { gui.updatePreview(frame); super.consume(frame); } diff --git a/src/main/java/com/replaymod/render/utils/Utils.java b/src/main/java/com/replaymod/render/utils/Utils.java index 19f3187c..8dd5e2a1 100644 --- a/src/main/java/com/replaymod/render/utils/Utils.java +++ b/src/main/java/com/replaymod/render/utils/Utils.java @@ -1,24 +1,41 @@ package com.replaymod.render.utils; +import com.replaymod.render.frame.OpenGlFrame; + import java.nio.ByteBuffer; public class Utils { /** * Copies the rgb image (flipped vertically) to the specified position in the target buffer - * @param buffer Source image - * @param bufferWidth Source image width + * @param source Source image * @param xOffset X offset in target image * @param yOffset Y offset in target image * @param to Target image * @param width Target image width */ - public static void openGlBytesToRBG(ByteBuffer buffer, int bufferWidth, int xOffset, int yOffset, ByteBuffer to, int width) { - byte[] rowBuf = new byte[bufferWidth * 4]; + public static void openGlBytesToBitmap(OpenGlFrame source, int xOffset, int yOffset, ByteBuffer to, int width) { + openGlBytesToBitmap( + source.getByteBuffer(), source.getSize().getWidth(), source.getBytesPerPixel(), + xOffset, yOffset, to, width); + } + + /** + * Copies the rgb image (flipped vertically) to the specified position in the target buffer + * @param buffer Source image + * @param bufferWidth Source image width + * @param bbp Bytes per pixel + * @param xOffset X offset in target image + * @param yOffset Y offset in target image + * @param to Target image + * @param width Target image width + */ + public static void openGlBytesToBitmap(ByteBuffer buffer, int bufferWidth, int bbp, int xOffset, int yOffset, ByteBuffer to, int width) { + byte[] rowBuf = new byte[bufferWidth * bbp]; // Copy image flipped vertically to target buffer - int rows = buffer.remaining() / 4 / bufferWidth; + int rows = buffer.remaining() / bbp / bufferWidth; for (int i = 0; i < rows; i++) { buffer.get(rowBuf); - to.position(((yOffset + rows - i - 1) * width + xOffset) * 4); + to.position(((yOffset + rows - i - 1) * width + xOffset) * bbp); to.put(rowBuf); } to.rewind();