#ifndef MSP_GL_BLEND_H_
#define MSP_GL_BLEND_H_
+#include <msp/datafile/objectloader.h>
#include <msp/strings/lexicalcast.h>
-#include "bindable.h"
-#include "gl.h"
-#include <msp/gl/extensions/ext_blend_minmax.h>
+#include "color.h"
namespace Msp {
namespace GL {
enum BlendEquation
{
- ADD = GL_FUNC_ADD,
- SUBTRACT = GL_FUNC_SUBTRACT,
- REVERSE_SUBTRACT = GL_FUNC_REVERSE_SUBTRACT,
- MIN = GL_MIN,
- MAX = GL_MAX
+ ADD,
+ SUBTRACT,
+ REVERSE_SUBTRACT,
+ MIN,
+ MAX
};
enum BlendFactor
{
- ZERO = GL_ZERO,
- ONE = GL_ONE,
- SRC_COLOR = GL_SRC_COLOR,
- ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR,
- SRC_ALPHA = GL_SRC_ALPHA,
- ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA,
- DST_COLOR = GL_DST_COLOR,
- ONE_MINUS_DST_COLOR = GL_ONE_MINUS_DST_COLOR,
- DST_ALPHA = GL_DST_ALPHA,
- ONE_MINUS_DST_ALPHA = GL_ONE_MINUS_DST_ALPHA,
- CONSTANT_COLOR = GL_CONSTANT_COLOR,
- ONE_MINUS_CONSTANT_COLOR = GL_ONE_MINUS_CONSTANT_COLOR,
- CONSTANT_ALPHA = GL_CONSTANT_ALPHA,
- ONE_MINUS_CONSTANT_ALPHA = GL_ONE_MINUS_CONSTANT_ALPHA
+ ZERO,
+ ONE,
+ SRC_COLOR,
+ ONE_MINUS_SRC_COLOR,
+ SRC_ALPHA,
+ ONE_MINUS_SRC_ALPHA,
+ DST_COLOR,
+ ONE_MINUS_DST_COLOR,
+ DST_ALPHA,
+ ONE_MINUS_DST_ALPHA,
+ CONSTANT_COLOR,
+ ONE_MINUS_CONSTANT_COLOR,
+ CONSTANT_ALPHA,
+ ONE_MINUS_CONSTANT_ALPHA
+};
+
+enum ColorWriteMask
+{
+ WRITE_NONE = 0,
+ WRITE_RED = 1,
+ WRITE_GREEN = 2,
+ WRITE_BLUE = 4,
+ WRITE_ALPHA = 8,
+ WRITE_ALL = 15
};
/**
-Blends incoming fragments with those already in the framebuffer.
+Blends incoming fragment color values with those already in the framebuffer.
*/
-class Blend: public Bindable<Blend>
+struct Blend
{
-private:
- BlendEquation eq;
- BlendFactor src_factor;
- BlendFactor dst_factor;
+ class Loader: public DataFile::ObjectLoader<Blend>
+ {
+ public:
+ Loader(Blend &);
+
+ private:
+ void constant(float, float, float, float);
+ void equation(BlendEquation);
+ void factors(BlendFactor, BlendFactor);
+ };
+
+ bool enabled = false;
+ BlendEquation equation = ADD;
+ BlendFactor src_factor = ONE;
+ BlendFactor dst_factor = ZERO;
+ Color constant = { 0.0f, 0.0f, 0.0f, 0.0f };
+ ColorWriteMask write_mask = WRITE_ALL;
-public:
- Blend();
+ Blend() = default;
Blend(BlendFactor, BlendFactor);
Blend(BlendEquation, BlendFactor, BlendFactor);
+};
- void bind() const;
- static void unbind();
+inline ColorWriteMask operator|(ColorWriteMask m1, ColorWriteMask m2)
+{ return static_cast<ColorWriteMask>(static_cast<int>(m1)|static_cast<int>(m2)); }
- static const Blend &alpha();
- static const Blend &additive();
- static const Blend &additive_alpha();
-};
+void operator>>(const LexicalConverter &, BlendEquation &);
+void operator<<(LexicalConverter &, BlendEquation);
void operator>>(const LexicalConverter &, BlendFactor &);
void operator<<(LexicalConverter &, BlendFactor);
+void operator>>(const LexicalConverter &, ColorWriteMask &);
+void operator<<(LexicalConverter &, ColorWriteMask);
+
} // namespace GL
} // namespace Msp
+#include "blend_backend.h"
+
#endif