X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Flight.cpp;fp=source%2Flight.cpp;h=f9b45c87bfeac3bf5712dec6001fe29f7419d1f6;hp=2192536450fdfd3a3d69235a02f641848833b16e;hb=48b1ab4fff00c49cc15d70a354eedb3d7a2f3e87;hpb=6fd9b09f47ff6a07bd5ca7f9e8887db3486bfcb1 diff --git a/source/light.cpp b/source/light.cpp index 21925364..f9b45c87 100644 --- a/source/light.cpp +++ b/source/light.cpp @@ -1,5 +1,6 @@ #include #include "light.h" +#include "lightunit.h" #include "misc.h" using namespace std; @@ -7,9 +8,6 @@ using namespace std; namespace Msp { namespace GL { -unsigned Light::current_unit = 0; -vector Light::current_lights(1); - Light::Light(): diffuse(1), specular(1), @@ -60,11 +58,12 @@ void Light::set_attenuation(float c, float l, float q) attenuation[2] = q; } -void Light::bind() const +void Light::bind_to(unsigned i) const { - if(current_lights[current_unit]!=this) + LightUnit &unit = LightUnit::get_unit(i); + if(unit.set_light(this)) { - GLenum l = GL_LIGHT0+current_unit; + GLenum l = GL_LIGHT0+unit.get_index(); enable(l); glLightfv(l, GL_DIFFUSE, &diffuse.r); glLightfv(l, GL_SPECULAR, &specular.r); @@ -75,42 +74,19 @@ void Light::bind() const glLightf(l, GL_CONSTANT_ATTENUATION, attenuation[0]); glLightf(l, GL_LINEAR_ATTENUATION, attenuation[1]); glLightf(l, GL_QUADRATIC_ATTENUATION, attenuation[2]); - current_lights[current_unit] = this; } } -void Light::bind_to(unsigned i) const -{ - activate(i); - bind(); -} - -void Light::activate(unsigned i) -{ - static unsigned max_lights = get_i(GL_MAX_LIGHTS); - - if(i>=max_lights) - throw out_of_range("Light::activate"); - - if(i>=current_lights.size()) - current_lights.resize(i+1); - - current_unit = i; -} - -void Light::unbind() +const Light *Light::current(unsigned i) { - if(current_lights[current_unit]) - { - disable(GL_LIGHT0+current_unit); - current_lights[current_unit] = 0; - } + return LightUnit::get_unit(i).get_light(); } void Light::unbind_from(unsigned i) { - activate(i); - unbind(); + LightUnit &unit = LightUnit::get_unit(i); + if(unit.set_light(0)) + disable(GL_LIGHT0+unit.get_index()); } } // namespace GL