]> git.tdb.fi Git - libs/gl.git/blob - source/texunit.cpp
TexUnit's constructor shouldn't be public
[libs/gl.git] / source / texunit.cpp
1 #include <stdexcept>
2 #include <msp/gl/extensions/arb_multitexture.h>
3 #include <msp/gl/extensions/arb_vertex_shader.h>
4 #include "gl.h"
5 #include "misc.h"
6 #include "texunit.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace GL {
12
13 vector<TexUnit> TexUnit::units;
14 TexUnit *TexUnit::cur_unit = 0;
15
16 TexUnit::TexUnit():
17         texture(0),
18         texenv(0)
19 {
20         fill(texgen, texgen+4, static_cast<const TexGen *>(0));
21 }
22
23 bool TexUnit::set_texture(const Texture *tex)
24 {
25         bool result = (tex!=texture);
26         texture = tex;
27         return result;
28 }
29
30 bool TexUnit::set_texenv(const TexEnv *env)
31 {
32         bool result = (texenv!=env);
33         texenv = env;
34         return result;
35 }
36
37 bool TexUnit::set_texgen(unsigned i, const TexGen *gen)
38 {
39         if(i>=4)
40                 throw out_of_range("TexUnit::set_texgen");
41         bool result = (texgen[i]!=gen);
42         texgen[i] = gen;
43         return result;
44 }
45
46 const TexGen *TexUnit::get_texgen(unsigned i)
47 {
48         if(i>=4)
49                 throw out_of_range("TexUnit::get_texgen");
50         return texgen[i];
51 }
52
53 void TexUnit::bind()
54 {
55         if(cur_unit!=this && (cur_unit || index))
56                 glActiveTexture(GL_TEXTURE0+index);
57         cur_unit = this;
58 }
59
60 unsigned TexUnit::get_n_units()
61 {
62         static int count = -1;
63         if(count<0)
64         {
65                 if(ARB_vertex_shader)
66                         count = get_i(GL_MAX_TEXTURE_IMAGE_UNITS);
67                 else if(ARB_multitexture)
68                         count = get_i(GL_MAX_TEXTURE_UNITS);
69                 else
70                         count = 1;
71         }
72         return count;
73 }
74
75 TexUnit &TexUnit::get_unit(unsigned n)
76 {
77         if(n>0)
78                 static Require _req(ARB_multitexture);
79         if(n>=get_n_units())
80                 throw out_of_range("TexUnit::get_unit");
81
82         if(units.size()<=n)
83         {
84                 unsigned i = units.size();
85                 units.resize(n+1, TexUnit());
86                 for(; i<units.size(); ++i)
87                         units[i].index = i;
88         }
89
90         return units[n];
91 }
92
93 TexUnit &TexUnit::current()
94 {
95         if(!cur_unit)
96                 get_unit(0).bind();
97         return *cur_unit;
98 }
99
100 TexUnit *TexUnit::find_unit(const Texture *tex)
101 {
102         for(vector<TexUnit>::iterator i=units.begin(); i!=units.end(); ++i)
103                 if(i->texture==tex)
104                         return &*i;
105         return 0;
106 }
107
108 TexUnit *TexUnit::find_unit(const TexEnv *env)
109 {
110         for(vector<TexUnit>::iterator i=units.begin(); i!=units.end(); ++i)
111                 if(i->texenv==env)
112                         return &*i;
113         return 0;
114 }
115
116 } // namespace GL
117 } // namespace Msp