]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/rendertarget.h
Rearrange soucre files into subdirectories
[libs/gl.git] / source / render / rendertarget.h
diff --git a/source/render/rendertarget.h b/source/render/rendertarget.h
new file mode 100644 (file)
index 0000000..7d796a3
--- /dev/null
@@ -0,0 +1,89 @@
+#ifndef RENDERTARGET_H_
+#define RENDERTARGET_H_
+
+#include "framebuffer.h"
+#include "texture2d.h"
+
+namespace Msp {
+namespace GL {
+
+enum RenderOutput
+{
+       RENDER_COLOR = 0|3,
+       RENDER_DEPTH = 192|12
+};
+
+class RenderTargetFormat
+{
+private:
+       enum { MAX_OUTPUTS = 7 };
+
+       unsigned char count;
+       unsigned char outputs[MAX_OUTPUTS];
+
+public:
+       RenderTargetFormat();
+       RenderTargetFormat(RenderOutput);
+
+       RenderTargetFormat operator,(RenderOutput) const;
+       RenderTargetFormat operator,(PixelFormat) const;
+
+       bool empty() const { return !count; }
+       const unsigned char *begin() const { return outputs; }
+       const unsigned char *end() const { return outputs+count; }
+       int index(RenderOutput) const;
+};
+
+inline RenderTargetFormat operator,(RenderOutput o1, RenderOutput o2)
+{ return (RenderTargetFormat(o1), o2); }
+
+inline RenderTargetFormat operator,(RenderOutput o, PixelFormat f)
+{ return (RenderTargetFormat(o), f); }
+
+inline unsigned get_output_type(unsigned char o)
+{ return o>>4; }
+
+PixelFormat get_output_pixelformat(unsigned char);
+
+
+class RenderTarget
+{
+private:
+       union TargetBuffer
+       {
+               Texture2D *texture;
+               Renderbuffer *buffer;
+       };
+
+       unsigned width;
+       unsigned height;
+       unsigned samples;
+       RenderTargetFormat format;
+       std::vector<TargetBuffer> buffers;
+       Framebuffer fbo;
+
+public:
+       RenderTarget(unsigned, unsigned, RenderOutput);
+       RenderTarget(unsigned, unsigned, const RenderTargetFormat & = (RENDER_COLOR, RENDER_DEPTH));
+       RenderTarget(unsigned, unsigned, unsigned, const RenderTargetFormat & = (RENDER_COLOR, RENDER_DEPTH));
+private:
+       RenderTarget(const RenderTarget &);
+       RenderTarget &operator=(const RenderTarget &);
+       void init(unsigned, unsigned, unsigned, const RenderTargetFormat &);
+public:
+       ~RenderTarget();
+
+       unsigned get_width() const { return width; }
+       unsigned get_height() const { return height; }
+       const RenderTargetFormat &get_format() const { return format; }
+       Framebuffer &get_framebuffer() { return fbo; }
+       void set_texture_filter(TextureFilter);
+       const Texture2D &get_target_texture(unsigned) const;
+       const Texture2D &get_target_texture(RenderOutput) const;
+       void blit_from(const RenderTarget &);
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif