X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexenv.cpp;h=c8af55f85febad1b22c5560efb0c7f688fca405e;hb=67538c60b8baa6816b8ae2d343ae62d881e6c58d;hp=ff9ea197b982cdb6a092137f14c5c8f8709e2d68;hpb=dcd8bd3a16a4af8e77aa84877b3f8a4fb03b8c7e;p=libs%2Fgl.git diff --git a/source/texenv.cpp b/source/texenv.cpp index ff9ea197..c8af55f8 100644 --- a/source/texenv.cpp +++ b/source/texenv.cpp @@ -9,24 +9,48 @@ TexEnv::TexEnv(): color(0, 0, 0, 0) { } +TexEnv::~TexEnv() +{ + if(this!=&default_object()) + { + while(TexUnit *unit = TexUnit::find_unit(this)) + unbind_from(unit->get_index()); + } +} + const TexEnv &TexEnv::default_object() { static TexEnv obj; return obj; } +void TexEnv::update_parameter(int mask) const +{ + if(TexUnit::current().get_texenv()!=this) + { + TexUnit *unit = TexUnit::find_unit(this); + if(!unit) + return; + + unit->bind(); + } + + if(mask&MODE) + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); + if(mask&COLOR) + glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &color.r); +} + void TexEnv::set_mode(TexEnvMode m) { mode = m; - if(TexUnit::current().get_texenv()==this) - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); + update_parameter(MODE); } void TexEnv::set_color(const Color &c) { color = c; - if(TexUnit::current().get_texenv()==this) - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &color.r); + update_parameter(COLOR); } void TexEnv::bind_to(unsigned i) const @@ -35,8 +59,7 @@ void TexEnv::bind_to(unsigned i) const if(unit.set_texenv(this)) { unit.bind(); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &color.r); + update_parameter(-1); } }