]> git.tdb.fi Git - libs/gl.git/blobdiff - source/blend.cpp
Derive ProgramCompiler::DeclarationCombiner from BlockModifier
[libs/gl.git] / source / blend.cpp
index 854b2032d4e26ea31168beaf141790d6ffdb536f..df4043e29fcfc228a557a7a5f54238d1f302f5e2 100644 (file)
@@ -1,26 +1,66 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2008  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
+#include <msp/gl/extensions/ext_blend_minmax.h>
+#include <msp/gl/extensions/ext_blend_subtract.h>
 #include "blend.h"
-#include "extension.h"
-#include "version_1_2.h"
 
 namespace Msp {
 namespace GL {
 
-void blend_equation(BlendEquation eq)
+Blend::Blend():
+       eq(ADD),
+       src_factor(ONE),
+       dst_factor(ZERO)
+{ }
+
+Blend::Blend(BlendFactor sf, BlendFactor df):
+       eq(ADD),
+       src_factor(sf),
+       dst_factor(df)
+{ }
+
+Blend::Blend(BlendEquation e, BlendFactor sf, BlendFactor df):
+       eq(e),
+       src_factor(sf),
+       dst_factor(df)
+{
+       if(eq==MIN || eq==MAX)
+               static Require _req(EXT_blend_minmax);
+       else if(eq==SUBTRACT || eq==REVERSE_SUBTRACT)
+               static Require _req(EXT_blend_subtract);
+}
+
+void Blend::bind() const
+{
+       if(set_current(this))
+       {
+               glEnable(GL_BLEND);
+               if(EXT_blend_minmax)
+                       glBlendEquation(eq);
+               glBlendFunc(src_factor, dst_factor);
+       }
+}
+
+void Blend::unbind()
+{
+       if(set_current(0))
+               glDisable(GL_BLEND);
+}
+
+const Blend &Blend::alpha()
+{
+       static Blend blend(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
+       return blend;
+}
+
+const Blend &Blend::additive()
 {
-       static RequireVersion _ver(1, 2);
-       glBlendEquation(eq);
+       static Blend blend(ONE, ONE);
+       return blend;
 }
 
-void blend_func(BlendFactor src, BlendFactor dst)
+const Blend &Blend::additive_alpha()
 {
-       glBlendFunc(src, dst);
+       static Blend blend(SRC_ALPHA, ONE);
+       return blend;
 }
 
 } // namespace GL