Distributed under the LGPL
*/
+#include "except.h"
#include "light.h"
#include "misc.h"
+using namespace std;
+
namespace Msp {
namespace GL {
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