]> git.tdb.fi Git - libs/gl.git/blob - source/texenv.cpp
Enhance the extension generator to support different APIs
[libs/gl.git] / source / texenv.cpp
1 #include "texenv.h"
2 #include "texunit.h"
3
4 namespace Msp {
5 namespace GL {
6
7 TexEnv::TexEnv():
8         mode(MODULATE),
9         color(0, 0, 0, 0)
10 { }
11
12 TexEnv::~TexEnv()
13 {
14         if(this!=&default_object())
15         {
16                 while(TexUnit *unit = TexUnit::find_unit(this))
17                         unbind_from(unit->get_index());
18         }
19 }
20
21 const TexEnv &TexEnv::default_object()
22 {
23         static TexEnv obj;
24         return obj;
25 }
26
27 void TexEnv::update_parameter(int mask) const
28 {
29         if(TexUnit::current().get_texenv()!=this)
30         {
31                 TexUnit *unit = TexUnit::find_unit(this);
32                 if(!unit)
33                         return;
34
35                 unit->bind();
36         }
37
38         if(mask&MODE)
39                 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode);
40         if(mask&COLOR)
41                 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &color.r);
42 }
43
44 void TexEnv::set_mode(TexEnvMode m)
45 {
46         mode = m;
47         update_parameter(MODE);
48 }
49
50 void TexEnv::set_color(const Color &c)
51 {
52         color = c;
53         update_parameter(COLOR);
54 }
55
56 void TexEnv::bind_to(unsigned i) const
57 {
58         TexUnit &unit = TexUnit::get_unit(i);
59         if(unit.set_texenv(this))
60         {
61                 unit.bind();
62                 update_parameter(-1);
63         }
64 }
65
66 const TexEnv *TexEnv::current(unsigned i)
67 {
68         return TexUnit::get_unit(i).get_texenv();
69 }
70
71 void TexEnv::unbind_from(unsigned i)
72 {
73         default_object().bind_to(i);
74 }
75
76 } // namespace GL
77 } // namespace Msp