]> git.tdb.fi Git - libs/gl.git/blobdiff - source/light.cpp
Convert Light to object model
[libs/gl.git] / source / light.cpp
index 5b0fa1d768c0601112ebf9dc91313a961ab49949..899e22c9853d964ed7c0a591d4585cbfb2591c0c 100644 (file)
@@ -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<const Light *> Light::current_lights(1);
 
 } // namespace GL
 } // namespace Msp