X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexenv.cpp;h=51adf9fb4aee45f1aa40e93effbad084e3c3b4d4;hb=5a93cc603eef43617a10b76bc9c19a3272ac1d49;hp=ff77e8cead0d6afb77fe51fd837b960377be8096;hpb=6fd9b09f47ff6a07bd5ca7f9e8887db3486bfcb1;p=libs%2Fgl.git diff --git a/source/texenv.cpp b/source/texenv.cpp index ff77e8ce..51adf9fb 100644 --- a/source/texenv.cpp +++ b/source/texenv.cpp @@ -5,21 +5,43 @@ namespace Msp { namespace GL { TexEnv::TexEnv(): - mode(MODULATE) + mode(MODULATE), + color(0, 0, 0, 0) { } +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 @@ -28,8 +50,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); } } @@ -40,14 +61,7 @@ const TexEnv *TexEnv::current(unsigned i) void TexEnv::unbind_from(unsigned i) { - TexUnit &unit = TexUnit::get_unit(i); - if(unit.set_texenv(0)) - { - unit.bind(); - Color black(0, 0, 0, 0); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, MODULATE); - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &black.r); - } + default_object().bind_to(i); } } // namespace GL