#include "bindable.h"
#include "gl.h"
#include "texturecube.h"
+#include <msp/gl/extensions/ext_framebuffer_object.h>
+#include <msp/gl/extensions/msp_stereo_rendering.h>
namespace Msp {
namespace GL {
enum FramebufferAttachment
{
- COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0_EXT,
- COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1_EXT,
- COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2_EXT,
- COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3_EXT,
- DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT,
- STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT
+ COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0,
+ COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1,
+ COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2,
+ COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3,
+ DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT,
+ STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT
};
enum FramebufferStatus
{
- FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT,
- FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT,
- FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT,
- FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT,
- FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT,
- FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT,
- FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED_EXT,
- FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT
+ FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
+ FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
+ FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS,
+ FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS,
+ FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER,
+ FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER,
+ FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED,
+ FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE
};
enum BufferBits
{
COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT,
DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT,
- STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT,
- ACCUM_BUFFER_BIT = GL_ACCUM_BUFFER_BIT
+ STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT
};
enum RWBuffer
FRONT_AND_BACK = GL_FRONT_AND_BACK
};
+class framebuffer_incomplete: public std::runtime_error
+{
+public:
+ framebuffer_incomplete(FramebufferStatus);
+ virtual ~framebuffer_incomplete() throw() { }
+};
+
/**
Framebuffer objects can be used to perform offscreen rendering. The most
common application is rendering to a texture, which can then be used for
void clear();
};
+ struct Viewport
+ {
+ int left;
+ int bottom;
+ unsigned width;
+ unsigned height;
+
+ Viewport();
+ };
+
unsigned id;
std::vector<Attachment> attachments;
unsigned width;
unsigned height;
+ Viewport view;
mutable unsigned dirty;
Framebuffer(unsigned);
or one of the error status codes otherwise. */
FramebufferStatus check_status() const;
+ /** Ensures that the framebuffer is complete, throwing an exception if it
+ isn't. */
+ void require_complete() const;
+
+ void viewport(int, int, unsigned, unsigned);
+ void reset_viewport();
+
void clear(BufferBits);
/** Blits a region from another framebuffer into this one. If the source