#ifndef FRAME_BUFFER_HPP
#define FRAME_BUFFER_HPP
#include "Constants.hpp"
#include "GlUser.hpp"
#include "Texture.hpp"
#include <vector>
namespace wren {
class TextureRtt;
class Viewport;
class FrameBuffer : public GlUser {
public:
struct RenderBuffer {
explicit RenderBuffer(const Texture::GlFormatParams ¶ms) : mGlName(0), mGlFormatParams(params) {}
unsigned int mGlName;
Texture::GlFormatParams mGlFormatParams;
};
struct DrawBuffer {
DrawBuffer(bool isRenderBuffer, size_t storageIndex) :
mIsRenderBuffer(isRenderBuffer),
mIsEnabled(true),
mStorageIndex(storageIndex),
mGlNamePbo(0) {}
bool mIsRenderBuffer;
bool mIsEnabled;
size_t mStorageIndex;
unsigned int mGlNamePbo;
};
static FrameBuffer *createFrameBuffer() { return new FrameBuffer(); }
static void deleteFrameBuffer(FrameBuffer *frameBuffer);
static void swapTexture(TextureRtt *texture);
void appendOutputTexture(TextureRtt *texture);
void appendOutputTextureDisable(TextureRtt *texture);
void appendOutputRenderBuffer(WrTextureInternalFormat format);
void setDepthTexture(TextureRtt *texture) { mDepthTexture = texture; }
void enableDepthBuffer(bool enable) { mIsDepthBufferEnabled = enable; }
void enableCopying(size_t index, bool enable);
void enableDrawBuffer(size_t index, bool enable);
void disableAllDrawBuffers();
void setSize(int width, int height) {
mWidth = width;
mHeight = height;
}
TextureRtt *outputTexture(size_t index) const {
assert(index < mOutputTextures.size());
return mOutputTextures[index];
}
const std::vector<TextureRtt *> &outputTextures() const { return mOutputTextures; }
TextureRtt *depthTexture() const { return mDepthTexture; }
bool isCopyingEnabled() const { return mIsCopyingEnabled; }
int width() const { return mWidth; }
int height() const { return mHeight; }
unsigned int glName() const { return mGlName; }
void setup();
void blitToScreen();
void bind();
void release();
void initiateCopyToPbo();
void copyContents(size_t index, void *data);
void copyPixel(size_t index, int x, int y, void *data, bool flipY = true);
void copyDepthPixel(int x, int y, void *data, bool flipY = true);
void blit(size_t index, bool blitColor = true, bool blitDepth = false, bool blitStencil = false, int srcX = 0, int srcY = 0,
int srcWidth = 0, int srcHeight = 0, int destX = 0, int destY = 0, int destWidth = 0, int destHeight = 0) const;
private:
FrameBuffer();
~FrameBuffer() {}
const Texture::GlFormatParams &drawBufferFormat(size_t index) const;
void prepareGl() override;
void cleanupGl() override;
unsigned int mGlName;
unsigned int mGlNameDepthBuffer;
bool mIsDepthBufferEnabled;
bool mIsCopyingEnabled;
int mWidth;
int mHeight;
TextureRtt *mDepthTexture;
std::vector<TextureRtt *> mOutputTextures;
std::vector<RenderBuffer> mOutputRenderBuffers;
std::vector<DrawBuffer> mOutputDrawBuffers;
};
}
#endif