]> git.tdb.fi Git - libs/gl.git/blob - source/texunit.cpp
Exception fixes
[libs/gl.git] / source / texunit.cpp
1 #include <stdexcept>
2 #include "arb_multitexture.h"
3 #include "arb_vertex_shader.h"
4 #include "gl.h"
5 #include "texunit.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 out_of_range("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 out_of_range("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(ARB_vertex_shader)
58                         glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &count);
59                 else if(ARB_multitexture)
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>0)
70                 static Require _req(ARB_multitexture);
71         if(n>=get_n_units())
72                 throw out_of_range("TexUnit::activate");
73
74         if(units.size()<=n)
75                 units.resize(n+1);
76
77         if(cur_unit!=&units[n] && (cur_unit || n))
78                 glActiveTexture(GL_TEXTURE0+n);
79         cur_unit = &units[n];
80
81         return units[n];
82 }
83
84 TexUnit &TexUnit::current()
85 {
86         if(!cur_unit)
87                 return activate(0);
88         return *cur_unit;
89 }
90
91 } // namespace GL
92 } // namespace Msp