+++ /dev/null
-#include <stdexcept>
-#include "arb_multitexture.h"
-#include "arb_vertex_shader.h"
-#include "gl.h"
-#include "texunit.h"
-
-using namespace std;
-
-namespace Msp {
-namespace GL {
-
-vector<TexUnit> TexUnit::units;
-TexUnit *TexUnit::cur_unit = 0;
-
-TexUnit::TexUnit():
- texture(0),
- texenv(0)
-{
- fill(texgen, texgen+4, static_cast<const TexGen *>(0));
-}
-
-bool TexUnit::set_texture(const Texture *tex)
-{
- bool result = (tex!=texture);
- texture = tex;
- return result;
-}
-
-bool TexUnit::set_texenv(const TexEnv *env)
-{
- bool result = (texenv!=env);
- texenv = env;
- return result;
-}
-
-bool TexUnit::set_texgen(unsigned i, const TexGen *gen)
-{
- if(i>=4)
- throw out_of_range("TexUnit::set_texgen");
- bool result = (texgen[i]!=gen);
- texgen[i] = gen;
- return result;
-}
-
-const TexGen *TexUnit::get_texgen(unsigned i)
-{
- if(i>=4)
- throw out_of_range("TexUnit::get_texgen");
- return texgen[i];
-}
-
-unsigned TexUnit::get_n_units()
-{
- static int count = -1;
- if(count<0)
- {
- if(ARB_vertex_shader)
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &count);
- else if(ARB_multitexture)
- glGetIntegerv(GL_MAX_TEXTURE_UNITS, &count);
- else
- count = 1;
- }
- return count;
-}
-
-TexUnit &TexUnit::activate(unsigned n)
-{
- if(n>0)
- static Require _req(ARB_multitexture);
- if(n>=get_n_units())
- throw out_of_range("TexUnit::activate");
-
- if(units.size()<=n)
- units.resize(n+1);
-
- if(cur_unit!=&units[n] && (cur_unit || n))
- glActiveTexture(GL_TEXTURE0+n);
- cur_unit = &units[n];
-
- return units[n];
-}
-
-TexUnit &TexUnit::current()
-{
- if(!cur_unit)
- return activate(0);
- return *cur_unit;
-}
-
-} // namespace GL
-} // namespace Msp