X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flight.cpp;h=f9b45c87bfeac3bf5712dec6001fe29f7419d1f6;hb=48b1ab4fff00c49cc15d70a354eedb3d7a2f3e87;hp=39693c4091a6b1579885bf79104ef60e38ca0426;hpb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;p=libs%2Fgl.git diff --git a/source/light.cpp b/source/light.cpp index 39693c40..f9b45c87 100644 --- a/source/light.cpp +++ b/source/light.cpp @@ -1,5 +1,6 @@ -#include "except.h" +#include #include "light.h" +#include "lightunit.h" #include "misc.h" using namespace std; @@ -8,7 +9,6 @@ namespace Msp { namespace GL { Light::Light(): - ambient(0), diffuse(1), specular(1), position(0, 0, 1, 0), @@ -21,11 +21,6 @@ Light::Light(): attenuation[2] = 0; } -void Light::set_ambient(const Color &c) -{ - ambient = c; -} - void Light::set_diffuse(const Color &c) { diffuse = c; @@ -63,13 +58,13 @@ 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_AMBIENT, &ambient.r); glLightfv(l, GL_DIFFUSE, &diffuse.r); glLightfv(l, GL_SPECULAR, &specular.r); glLightfv(l, GL_POSITION, &position.x); @@ -79,46 +74,20 @@ 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 +const Light *Light::current(unsigned i) { - activate(i); - bind(); -} - -void Light::activate(unsigned i) -{ - static unsigned max_lights = get_i(GL_MAX_LIGHTS); - - if(i>=max_lights) - throw InvalidParameterValue("Light unit index out of range"); - - if(i>=current_lights.size()) - current_lights.resize(i+1); - - current_unit = i; -} - -void Light::unbind() -{ - 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()); } -unsigned Light::current_unit = 0; -vector Light::current_lights(1); - } // namespace GL } // namespace Msp