]> git.tdb.fi Git - libs/gl.git/blob - source/core/texunit.cpp
Unmanage texture if loading data directly
[libs/gl.git] / source / core / 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 "texture.h"
7 #include "texunit.h"
8
9 using namespace std;
10
11 namespace Msp {
12 namespace GL {
13
14 vector<TexUnit> TexUnit::units;
15 TexUnit *TexUnit::cur_unit = 0;
16
17 TexUnit::TexUnit():
18         texture(0),
19         sampler(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_sampler(const Sampler *samp)
30 {
31         bool result = (samp!=sampler);
32         sampler = samp;
33         return result;
34 }
35
36 void TexUnit::bind()
37 {
38         if(cur_unit!=this && (cur_unit || index))
39                 glActiveTexture(GL_TEXTURE0+index);
40         cur_unit = this;
41 }
42
43 unsigned TexUnit::get_n_units()
44 {
45         static int count = -1;
46         if(count<0)
47         {
48                 if(ARB_vertex_shader)
49                         count = get_i(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
50                 else if(ARB_multitexture)
51                         count = get_i(GL_MAX_TEXTURE_UNITS);
52                 else
53                         count = 1;
54         }
55         return count;
56 }
57
58 TexUnit &TexUnit::get_unit(unsigned n)
59 {
60         if(n>0)
61                 static Require _req(ARB_multitexture);
62         if(n>=get_n_units())
63                 throw out_of_range("TexUnit::get_unit");
64
65         if(units.size()<=n)
66         {
67                 unsigned i = units.size();
68                 units.resize(n+1, TexUnit());
69                 for(; i<units.size(); ++i)
70                         units[i].index = i;
71         }
72
73         return units[n];
74 }
75
76 TexUnit &TexUnit::current()
77 {
78         if(!cur_unit)
79                 get_unit(0).bind();
80         return *cur_unit;
81 }
82
83 TexUnit *TexUnit::find_unit(const Texture *tex)
84 {
85         for(vector<TexUnit>::iterator i=units.begin(); i!=units.end(); ++i)
86                 if(i->texture==tex)
87                         return &*i;
88         return 0;
89 }
90
91 } // namespace GL
92 } // namespace Msp