X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flight.cpp;h=899e22c9853d964ed7c0a591d4585cbfb2591c0c;hb=efe80f5a696b4a3be2378dc6d635c89676afa12d;hp=5b0fa1d768c0601112ebf9dc91313a961ab49949;hpb=c1405286754104ddc044dddbb0a3505a9a5e3d4a;p=libs%2Fgl.git diff --git a/source/light.cpp b/source/light.cpp index 5b0fa1d7..899e22c9 100644 --- a/source/light.cpp +++ b/source/light.cpp @@ -5,9 +5,12 @@ Copyright © 2007 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ +#include "except.h" #include "light.h" #include "misc.h" +using namespace std; + namespace Msp { namespace GL { @@ -44,22 +47,50 @@ void Light::set_position(float x_, float y_, float z_, float w_) w=w_; } -void Light::apply() const +void Light::bind() const +{ + if(current_lights[current_unit]!=this) + { + GLenum l=GL_LIGHT0+current_unit; + enable(l); + glLightfv(l, GL_AMBIENT, &ambient.r); + glLightfv(l, GL_DIFFUSE, &diffuse.r); + glLightfv(l, GL_SPECULAR, &specular.r); + glLightfv(l, GL_POSITION, &x); + current_lights[current_unit]=this; + } +} + +void Light::bind_to(unsigned i) const +{ + activate(i); + bind(); +} + +void Light::activate(unsigned i) { - apply_to(current); + 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::apply_to(unsigned l) const +void Light::unbind() { - l+=GL_LIGHT0; - enable(l); - glLightfv(l, GL_AMBIENT, &ambient.r); - glLightfv(l, GL_DIFFUSE, &diffuse.r); - glLightfv(l, GL_SPECULAR, &specular.r); - glLightfv(l, GL_POSITION, &x); + if(current_lights[current_unit]) + { + disable(GL_LIGHT0+current_unit); + current_lights[current_unit]=0; + } } -unsigned Light::current=0; +unsigned Light::current_unit=0; +vector Light::current_lights(1); } // namespace GL } // namespace Msp