]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/blend.h
Use default member initializers for simple types
[libs/gl.git] / source / core / blend.h
index e7b291e617dab5c2044e787c99ee7a09a7dfcac5..1d39b08fd30b586ba8889b402310ffbb13aae9c5 100644 (file)
@@ -1,69 +1,94 @@
 #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.
 */
-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