]> git.tdb.fi Git - libs/gl.git/blob - source/texunit.cpp
Fix an incorrect extension name
[libs/gl.git] / source / texunit.cpp
1 #include <stdexcept>
2 #include "extension.h"
3 #include "gl.h"
4 #include "texunit.h"
5 #include "version_1_3.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace GL {
11
12 vector<TexUnit> TexUnit::units;
13 TexUnit *TexUnit::cur_unit = 0;
14
15 TexUnit::TexUnit():
16         texture(0),
17         texenv(0)
18 {
19         fill(texgen, texgen+4, static_cast<const TexGen *>(0));
20 }
21
22 bool TexUnit::set_texture(const Texture *tex)
23 {
24         bool result = (tex!=texture);
25         texture = tex;
26         return result;
27 }
28
29 bool TexUnit::set_texenv(const TexEnv *env)
30 {
31         bool result = (texenv!=env);
32         texenv = env;
33         return result;
34 }
35
36 bool TexUnit::set_texgen(unsigned i, const TexGen *gen)
37 {
38         if(i>=4)
39                 throw invalid_argument("TexUnit::set_texgen");
40         bool result = (texgen[i]!=gen);
41         texgen[i] = gen;
42         return result;
43 }
44
45 const TexGen *TexUnit::get_texgen(unsigned i)
46 {
47         if(i>=4)
48                 throw invalid_argument("TexUnit::get_texgen");
49         return texgen[i];
50 }
51
52 unsigned TexUnit::get_n_units()
53 {
54         static int count = -1;
55         if(count<0)
56         {
57                 if(is_version_at_least(2, 0) || is_supported("GL_ARB_vertex_shader"))
58                         glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &count);
59                 else if(is_version_at_least(1, 3))
60                         glGetIntegerv(GL_MAX_TEXTURE_UNITS, &count);
61                 else
62                         count = 1;
63         }
64         return count;
65 }
66
67 TexUnit &TexUnit::activate(unsigned n)
68 {
69         if(n>=get_n_units())
70                 throw out_of_range("TexUnit::activate");
71
72         if(units.size()<=n)
73                 units.resize(n+1);
74
75         if(cur_unit!=&units[n] && (cur_unit || n))
76                 glActiveTexture(GL_TEXTURE0+n);
77         cur_unit = &units[n];
78
79         return units[n];
80 }
81
82 TexUnit &TexUnit::current()
83 {
84         if(!cur_unit)
85                 return activate(0);
86         return *cur_unit;
87 }
88
89 } // namespace GL
90 } // namespace Msp