Remove duplicate code between Simple and MultiFrame PBO capturer
This commit is contained in:
@@ -4,7 +4,7 @@ import com.replaymod.render.frame.CubicOpenGlFrame;
|
|||||||
import com.replaymod.render.frame.OpenGlFrame;
|
import com.replaymod.render.frame.OpenGlFrame;
|
||||||
|
|
||||||
public class CubicPboOpenGlFrameCapturer extends
|
public class CubicPboOpenGlFrameCapturer extends
|
||||||
MultiFramePboOpenGlFrameCapturer<CubicOpenGlFrame, CubicOpenGlFrameCapturer.Data> {
|
PboOpenGlFrameCapturer<CubicOpenGlFrame, CubicOpenGlFrameCapturer.Data> {
|
||||||
|
|
||||||
private final int frameSize;
|
private final int frameSize;
|
||||||
public CubicPboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, int frameSize) {
|
public CubicPboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, int frameSize) {
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import org.lwjgl.opengl.GL12;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
public abstract class MultiFramePboOpenGlFrameCapturer<F extends Frame, D extends Enum<D> & CaptureData>
|
public abstract class PboOpenGlFrameCapturer<F extends Frame, D extends Enum<D> & CaptureData>
|
||||||
extends OpenGlFrameCapturer<F, D> {
|
extends OpenGlFrameCapturer<F, D> {
|
||||||
private final D[] data;
|
private final D[] data;
|
||||||
private PixelBufferObject pbo, otherPBO;
|
private PixelBufferObject pbo, otherPBO;
|
||||||
|
|
||||||
public MultiFramePboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, Class<D> type, int framePixels) {
|
public PboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, Class<D> type, int framePixels) {
|
||||||
super(worldRenderer, renderInfo);
|
super(worldRenderer, renderInfo);
|
||||||
|
|
||||||
data = type.getEnumConstants();
|
data = type.getEnumConstants();
|
||||||
@@ -1,81 +1,20 @@
|
|||||||
package com.replaymod.render.capturer;
|
package com.replaymod.render.capturer;
|
||||||
|
|
||||||
import com.replaymod.render.frame.OpenGlFrame;
|
import com.replaymod.render.frame.OpenGlFrame;
|
||||||
import com.replaymod.render.utils.ByteBufferPool;
|
|
||||||
import com.replaymod.render.utils.PixelBufferObject;
|
|
||||||
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.lwjgl.opengl.GL12;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
public class SimplePboOpenGlFrameCapturer extends PboOpenGlFrameCapturer<OpenGlFrame, SimplePboOpenGlFrameCapturer.SinglePass> {
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
public class SimplePboOpenGlFrameCapturer extends OpenGlFrameCapturer<OpenGlFrame, CaptureData> {
|
|
||||||
private final int bufferSize;
|
|
||||||
private PixelBufferObject pbo, otherPBO;
|
|
||||||
|
|
||||||
public SimplePboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) {
|
public SimplePboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) {
|
||||||
super(worldRenderer, renderInfo);
|
super(worldRenderer, renderInfo, SinglePass.class,
|
||||||
|
renderInfo.getFrameSize().getWidth() * renderInfo.getFrameSize().getHeight());
|
||||||
ReadableDimension size = renderInfo.getFrameSize();
|
|
||||||
bufferSize = size.getHeight() * size.getWidth() * 4;
|
|
||||||
pbo = new PixelBufferObject(bufferSize, PixelBufferObject.Usage.READ);
|
|
||||||
otherPBO = new PixelBufferObject(bufferSize, PixelBufferObject.Usage.READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void swapPBOs() {
|
|
||||||
PixelBufferObject old = pbo;
|
|
||||||
pbo = otherPBO;
|
|
||||||
otherPBO = old;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDone() {
|
protected OpenGlFrame create(OpenGlFrame[] from) {
|
||||||
return framesDone >= renderInfo.getTotalFrames() + 2;
|
return from[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public enum SinglePass implements CaptureData {
|
||||||
public OpenGlFrame process() {
|
SINGLE_PASS
|
||||||
OpenGlFrame frame = null;
|
|
||||||
|
|
||||||
if (framesDone > 1) {
|
|
||||||
// Read pbo to memory
|
|
||||||
pbo.bind();
|
|
||||||
ByteBuffer pboBuffer = pbo.mapReadOnly();
|
|
||||||
ByteBuffer buffer = ByteBufferPool.allocate(bufferSize);
|
|
||||||
buffer.put(pboBuffer);
|
|
||||||
buffer.rewind();
|
|
||||||
pbo.unmap();
|
|
||||||
pbo.unbind();
|
|
||||||
frame = new OpenGlFrame(framesDone - 2, frameSize, 4, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (framesDone < renderInfo.getTotalFrames()) {
|
|
||||||
// Then fill it again
|
|
||||||
renderFrame(framesDone, renderInfo.updateForNextFrame());
|
|
||||||
}
|
|
||||||
|
|
||||||
framesDone++;
|
|
||||||
swapPBOs();
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected OpenGlFrame captureFrame(int frameId, CaptureData data) {
|
|
||||||
pbo.bind();
|
|
||||||
|
|
||||||
frameBuffer().beginWrite(true);
|
|
||||||
GL11.glReadPixels(0, 0, getFrameWidth(), getFrameHeight(), GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, 0);
|
|
||||||
frameBuffer().endWrite();
|
|
||||||
|
|
||||||
pbo.unbind();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws IOException {
|
|
||||||
super.close();
|
|
||||||
pbo.delete();
|
|
||||||
otherPBO.delete();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.replaymod.render.frame.OpenGlFrame;
|
|||||||
import com.replaymod.render.frame.StereoscopicOpenGlFrame;
|
import com.replaymod.render.frame.StereoscopicOpenGlFrame;
|
||||||
|
|
||||||
public class StereoscopicPboOpenGlFrameCapturer
|
public class StereoscopicPboOpenGlFrameCapturer
|
||||||
extends MultiFramePboOpenGlFrameCapturer<StereoscopicOpenGlFrame, StereoscopicOpenGlFrameCapturer.Data> {
|
extends PboOpenGlFrameCapturer<StereoscopicOpenGlFrame, StereoscopicOpenGlFrameCapturer.Data> {
|
||||||
|
|
||||||
public StereoscopicPboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) {
|
public StereoscopicPboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) {
|
||||||
super(worldRenderer, renderInfo, StereoscopicOpenGlFrameCapturer.Data.class,
|
super(worldRenderer, renderInfo, StereoscopicOpenGlFrameCapturer.Data.class,
|
||||||
|
|||||||
Reference in New Issue
Block a user