]> git.tdb.fi Git - libs/gl.git/blob - source/blend.cpp
Add some more premade blend modes
[libs/gl.git] / source / blend.cpp
1 #include <msp/gl/extensions/ext_blend_minmax.h>
2 #include <msp/gl/extensions/ext_blend_subtract.h>
3 #include "blend.h"
4
5 namespace Msp {
6 namespace GL {
7
8 Blend::Blend():
9         eq(ADD),
10         src_factor(ONE),
11         dst_factor(ZERO)
12 { }
13
14 Blend::Blend(BlendFactor sf, BlendFactor df):
15         eq(ADD),
16         src_factor(sf),
17         dst_factor(df)
18 { }
19
20 Blend::Blend(BlendEquation e, BlendFactor sf, BlendFactor df):
21         eq(e),
22         src_factor(sf),
23         dst_factor(df)
24 {
25         if(eq==MIN || eq==MAX)
26                 static Require _req(EXT_blend_minmax);
27         else if(eq==SUBTRACT || eq==REVERSE_SUBTRACT)
28                 static Require _req(EXT_blend_subtract);
29 }
30
31 void Blend::bind() const
32 {
33         if(set_current(this))
34         {
35                 glEnable(GL_BLEND);
36                 if(EXT_blend_minmax)
37                         glBlendEquation(eq);
38                 glBlendFunc(src_factor, dst_factor);
39         }
40 }
41
42 void Blend::unbind()
43 {
44         if(set_current(0))
45                 glDisable(GL_BLEND);
46 }
47
48 const Blend &Blend::alpha()
49 {
50         static Blend blend(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
51         return blend;
52 }
53
54 const Blend &Blend::additive()
55 {
56         static Blend blend(ONE, ONE);
57         return blend;
58 }
59
60 const Blend &Blend::additive_alpha()
61 {
62         static Blend blend(SRC_ALPHA, ONE);
63         return blend;
64 }
65
66 } // namespace GL
67 } // namespace Msp