-#include <stdexcept>
-#include <msp/gl/extensions/arb_multitexture.h>
-#include <msp/gl/extensions/arb_vertex_shader.h>
-#include "gl.h"
-#include "misc.h"
-#include "texture.h"
-#include "texunit.h"
-
-using namespace std;
-
-namespace Msp {
-namespace GL {
-
-vector<TexUnit> TexUnit::units;
-TexUnit *TexUnit::cur_unit = 0;
-
-TexUnit::TexUnit():
- texture(0),
- sampler(0)
-{ }
-
-bool TexUnit::set_texture(const Texture *tex)
-{
- bool result = (tex!=texture);
- texture = tex;
- return result;
-}
-
-bool TexUnit::set_sampler(const Sampler *samp)
-{
- bool result = (samp!=sampler);
- sampler = samp;
- return result;
-}
-
-void TexUnit::bind()
-{
- if(cur_unit!=this && (cur_unit || index))
- glActiveTexture(GL_TEXTURE0+index);
- cur_unit = this;
-}
-
-unsigned TexUnit::get_n_units()
-{
- static int count = -1;
- if(count<0)
- {
- if(ARB_vertex_shader)
- count = get_i(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
- else if(ARB_multitexture)
- count = get_i(GL_MAX_TEXTURE_UNITS);
- else
- count = 1;
- }
- return count;
-}
-
-TexUnit &TexUnit::get_unit(unsigned n)
-{
- if(n>0)
- static Require _req(ARB_multitexture);
- if(n>=get_n_units())
- throw out_of_range("TexUnit::get_unit");
-
- if(units.size()<=n)
- {
- unsigned i = units.size();
- units.resize(n+1, TexUnit());
- for(; i<units.size(); ++i)
- units[i].index = i;
- }
-
- return units[n];
-}
-
-TexUnit &TexUnit::current()
-{
- if(!cur_unit)
- get_unit(0).bind();
- return *cur_unit;
-}
-
-TexUnit *TexUnit::find_unit(const Texture *tex)
-{
- for(vector<TexUnit>::iterator i=units.begin(); i!=units.end(); ++i)
- if(i->texture==tex)
- return &*i;
- return 0;
-}
-
-} // namespace GL
-} // namespace Msp