|
|
|
|
@ -35,6 +35,94 @@
|
|
|
|
|
|
|
|
|
|
namespace Magnum { |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for framebuffer clearing |
|
|
|
|
* |
|
|
|
|
* @see AbstractFramebuffer, FramebufferClearMask |
|
|
|
|
*/ |
|
|
|
|
enum class FramebufferClear: GLbitfield { |
|
|
|
|
Color = GL_COLOR_BUFFER_BIT, /**< Color */ |
|
|
|
|
Depth = GL_DEPTH_BUFFER_BIT, /**< Depth value */ |
|
|
|
|
Stencil = GL_STENCIL_BUFFER_BIT /**< Stencil value */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for clearing |
|
|
|
|
* |
|
|
|
|
* @see AbstractFramebuffer::clear() |
|
|
|
|
*/ |
|
|
|
|
typedef Corrade::Containers::EnumSet<FramebufferClear, GLbitfield, |
|
|
|
|
GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT> FramebufferClearMask; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for framebuffer blitting |
|
|
|
|
* |
|
|
|
|
* @see AbstractFramebuffer, FramebufferBlitMask |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
enum class FramebufferBlit: GLbitfield { |
|
|
|
|
ColorBuffer = GL_COLOR_BUFFER_BIT, /**< Color buffer */ |
|
|
|
|
DepthBuffer = GL_DEPTH_BUFFER_BIT, /**< Depth buffer */ |
|
|
|
|
StencilBuffer = GL_STENCIL_BUFFER_BIT /**< Stencil buffer */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for framebuffer blitting |
|
|
|
|
* |
|
|
|
|
* @see AbstractFramebuffer::blit() |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
typedef Corrade::Containers::EnumSet<FramebufferBlit, GLbitfield, |
|
|
|
|
GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT> FramebufferBlitMask; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief %Framebuffer blit filtering |
|
|
|
|
* |
|
|
|
|
* @see AbstractFramebuffer::blit() |
|
|
|
|
*/ |
|
|
|
|
enum class FramebufferBlitFilter: GLenum { |
|
|
|
|
Nearest = GL_NEAREST, /**< Nearest neighbor filtering */ |
|
|
|
|
Linear = GL_LINEAR /**< Linear interpolation filtering */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Target for binding framebuffer |
|
|
|
|
* |
|
|
|
|
* @see DefaultFramebuffer::bind(), Framebuffer::bind() |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
*/ |
|
|
|
|
enum class FramebufferTarget: GLenum { |
|
|
|
|
/**
|
|
|
|
|
* For reading only. |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_blit} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, |
|
|
|
|
* @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
#ifndef MAGNUM_TARGET_GLES2 |
|
|
|
|
Read = GL_READ_FRAMEBUFFER, |
|
|
|
|
#else |
|
|
|
|
Read = GL_READ_FRAMEBUFFER_APPLE, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* For drawing only. |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_blit} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, |
|
|
|
|
* @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
#ifndef MAGNUM_TARGET_GLES2 |
|
|
|
|
Draw = GL_DRAW_FRAMEBUFFER, |
|
|
|
|
#else |
|
|
|
|
Draw = GL_DRAW_FRAMEBUFFER_APPLE, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
ReadDraw = GL_FRAMEBUFFER /**< For both reading and drawing. */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@brief Base for default and named framebuffers |
|
|
|
|
|
|
|
|
|
@ -59,94 +147,6 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
AbstractFramebuffer& operator=(AbstractFramebuffer&&) = delete; |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for clearing |
|
|
|
|
* |
|
|
|
|
* @see ClearMask |
|
|
|
|
*/ |
|
|
|
|
enum class Clear: GLbitfield { |
|
|
|
|
Color = GL_COLOR_BUFFER_BIT, /**< Color */ |
|
|
|
|
Depth = GL_DEPTH_BUFFER_BIT, /**< Depth value */ |
|
|
|
|
Stencil = GL_STENCIL_BUFFER_BIT /**< Stencil value */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for clearing |
|
|
|
|
* |
|
|
|
|
* @see clear() |
|
|
|
|
*/ |
|
|
|
|
typedef Corrade::Containers::EnumSet<Clear, GLbitfield, |
|
|
|
|
GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT> ClearMask; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for blitting |
|
|
|
|
* |
|
|
|
|
* @see BlitMask |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
enum class Blit: GLbitfield { |
|
|
|
|
ColorBuffer = GL_COLOR_BUFFER_BIT, /**< Color buffer */ |
|
|
|
|
DepthBuffer = GL_DEPTH_BUFFER_BIT, /**< Depth buffer */ |
|
|
|
|
StencilBuffer = GL_STENCIL_BUFFER_BIT /**< Stencil buffer */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Mask for blitting |
|
|
|
|
* |
|
|
|
|
* @see blit() |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
typedef Corrade::Containers::EnumSet<Blit, GLbitfield, |
|
|
|
|
GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT> BlitMask; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Blit filtering |
|
|
|
|
* |
|
|
|
|
* @see blit() |
|
|
|
|
*/ |
|
|
|
|
enum class BlitFilter: GLenum { |
|
|
|
|
Nearest = GL_NEAREST, /**< Nearest neighbor filtering */ |
|
|
|
|
Linear = GL_LINEAR /**< Linear interpolation filtering */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Target for binding framebuffer |
|
|
|
|
* |
|
|
|
|
* @see DefaultFramebuffer::bind(), Framebuffer::bind() |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_object} |
|
|
|
|
*/ |
|
|
|
|
enum class Target: GLenum { |
|
|
|
|
/**
|
|
|
|
|
* For reading only. |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_blit} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, |
|
|
|
|
* @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
#ifndef MAGNUM_TARGET_GLES2 |
|
|
|
|
Read = GL_READ_FRAMEBUFFER, |
|
|
|
|
#else |
|
|
|
|
Read = GL_READ_FRAMEBUFFER_APPLE, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* For drawing only. |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_blit} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, |
|
|
|
|
* @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
#ifndef MAGNUM_TARGET_GLES2 |
|
|
|
|
Draw = GL_DRAW_FRAMEBUFFER, |
|
|
|
|
#else |
|
|
|
|
Draw = GL_DRAW_FRAMEBUFFER_APPLE, |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
ReadDraw = GL_FRAMEBUFFER /**< For both reading and drawing. */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Copy block of pixels |
|
|
|
|
* @param source Source framebuffer |
|
|
|
|
@ -156,9 +156,9 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
* @param mask Which buffers to perform blit operation on |
|
|
|
|
* @param filter Interpolation filter |
|
|
|
|
* |
|
|
|
|
* Binds @p source framebuffer to @ref Target "Target::Read" and |
|
|
|
|
* @p destination framebuffer to @ref Target "Target::Draw" and |
|
|
|
|
* performs blitting operation. See DefaultFramebuffer::mapForRead(), |
|
|
|
|
* Binds @p source framebuffer to @ref FramebufferTarget "FramebufferTarget::Read" |
|
|
|
|
* and @p destination framebuffer to @ref FramebufferTarget "FramebufferTarget::Draw" |
|
|
|
|
* and performs blitting operation. See DefaultFramebuffer::mapForRead(), |
|
|
|
|
* Framebuffer::mapForRead(), DefaultFramebuffer::mapForDraw() and |
|
|
|
|
* Framebuffer::mapForDraw() for specifying particular buffers for |
|
|
|
|
* blitting operation. |
|
|
|
|
@ -167,7 +167,7 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, BlitMask mask, BlitFilter filter); |
|
|
|
|
static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Copy block of pixels |
|
|
|
|
@ -179,14 +179,15 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
* Convenience alternative to above function when source rectangle is |
|
|
|
|
* the same as destination rectangle. As the image is copied |
|
|
|
|
* pixel-by-pixel, no interpolation is needed and thus |
|
|
|
|
* @ref BlitFilter "BlitFilter::Nearest" filtering is used by default. |
|
|
|
|
* @ref FramebufferBlitFilter "FramebufferBlitFilter::Nearest" |
|
|
|
|
* filtering is used by default. |
|
|
|
|
* @see @fn_gl{BlitFramebuffer} |
|
|
|
|
* @requires_gl30 %Extension @extension{EXT,framebuffer_blit} |
|
|
|
|
* @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or |
|
|
|
|
* @es_extension{NV,framebuffer_blit} |
|
|
|
|
*/ |
|
|
|
|
inline static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& rectangle, BlitMask mask) { |
|
|
|
|
blit(source, destination, rectangle, rectangle, mask, BlitFilter::Nearest); |
|
|
|
|
inline static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& rectangle, FramebufferBlitMask mask) { |
|
|
|
|
blit(source, destination, rectangle, rectangle, mask, FramebufferBlitFilter::Nearest); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
explicit AbstractFramebuffer() = default; |
|
|
|
|
@ -201,7 +202,7 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
* Framebuffer::mapForDraw(), @fn_gl{BindFramebuffer}, |
|
|
|
|
* @fn_gl{Viewport} |
|
|
|
|
*/ |
|
|
|
|
void bind(Target target); |
|
|
|
|
void bind(FramebufferTarget target); |
|
|
|
|
|
|
|
|
|
/** @brief Viewport rectangle */ |
|
|
|
|
inline Rectanglei viewport() const { return _viewport; } |
|
|
|
|
@ -229,7 +230,7 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
* Renderer::setClearStencil(), @fn_gl{BindFramebuffer}, |
|
|
|
|
* @fn_gl{Clear} |
|
|
|
|
*/ |
|
|
|
|
void clear(ClearMask mask); |
|
|
|
|
void clear(FramebufferClearMask mask); |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Read block of pixels from framebuffer to image |
|
|
|
|
@ -267,12 +268,12 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
#else |
|
|
|
|
protected: |
|
|
|
|
#endif |
|
|
|
|
void MAGNUM_LOCAL bindInternal(Target target); |
|
|
|
|
Target MAGNUM_LOCAL bindInternal(); |
|
|
|
|
void MAGNUM_LOCAL bindInternal(FramebufferTarget target); |
|
|
|
|
FramebufferTarget MAGNUM_LOCAL bindInternal(); |
|
|
|
|
void MAGNUM_LOCAL setViewportInternal(); |
|
|
|
|
|
|
|
|
|
static MAGNUM_LOCAL Target readTarget; |
|
|
|
|
static MAGNUM_LOCAL Target drawTarget; |
|
|
|
|
static MAGNUM_LOCAL FramebufferTarget readTarget; |
|
|
|
|
static MAGNUM_LOCAL FramebufferTarget drawTarget; |
|
|
|
|
|
|
|
|
|
typedef void(AbstractFramebuffer::*DrawBuffersImplementation)(GLsizei, const GLenum*); |
|
|
|
|
static MAGNUM_LOCAL DrawBuffersImplementation drawBuffersImplementation; |
|
|
|
|
@ -317,8 +318,8 @@ class MAGNUM_EXPORT AbstractFramebuffer {
|
|
|
|
|
|
|
|
|
|
inline AbstractFramebuffer::~AbstractFramebuffer() {} |
|
|
|
|
|
|
|
|
|
CORRADE_ENUMSET_OPERATORS(AbstractFramebuffer::ClearMask) |
|
|
|
|
CORRADE_ENUMSET_OPERATORS(AbstractFramebuffer::BlitMask) |
|
|
|
|
CORRADE_ENUMSET_OPERATORS(FramebufferClearMask) |
|
|
|
|
CORRADE_ENUMSET_OPERATORS(FramebufferBlitMask) |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|