X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flight.cpp;h=d4b45aaf82cc66371c4a73f11174eaf7356af611;hb=126161d1d44ab9503bc747d24a07b7b9d15e527a;hp=5b0fa1d768c0601112ebf9dc91313a961ab49949;hpb=c1405286754104ddc044dddbb0a3505a9a5e3d4a;p=libs%2Fgl.git diff --git a/source/light.cpp b/source/light.cpp index 5b0fa1d7..d4b45aaf 100644 --- a/source/light.cpp +++ b/source/light.cpp @@ -1,65 +1,123 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include "light.h" +#include "lightunit.h" #include "misc.h" +using namespace std; + namespace Msp { namespace GL { Light::Light(): - ambient(0), diffuse(1), specular(1), - x(0), y(0), z(1), w(0), - sdx(0), sdy(0), sdz(-1), + position(0, 0, 1, 0), + spot_dir(0, 0, -1), spot_exp(0), spot_cutoff(180) -{ } +{ + attenuation[0] = 1; + attenuation[1] = 0; + attenuation[2] = 0; +} -void Light::set_ambient(const Color &c) +void Light::update_parameter(int mask, int index) const { - ambient=c; + if(index<0) + { + LightUnit *unit = LightUnit::find_unit(this); + if(!unit) + return; + + index = unit->get_index(); + } + + GLenum l = GL_LIGHT0+index; + if(mask&DIFFUSE) + glLightfv(l, GL_DIFFUSE, &diffuse.r); + if(mask&SPECULAR) + glLightfv(l, GL_SPECULAR, &specular.r); + if(mask&POSITION) + glLightfv(l, GL_POSITION, &position.x); + if(mask&SPOT_DIR) + glLightfv(l, GL_SPOT_DIRECTION, &spot_dir.x); + if(mask&SPOT_EXP) + glLightf(l, GL_SPOT_EXPONENT, spot_exp); + if(mask&SPOT_CUTOFF) + glLightf(l, GL_SPOT_CUTOFF, spot_cutoff); + if(mask&ATTENUATION) + { + glLightf(l, GL_CONSTANT_ATTENUATION, attenuation[0]); + glLightf(l, GL_LINEAR_ATTENUATION, attenuation[1]); + glLightf(l, GL_QUADRATIC_ATTENUATION, attenuation[2]); + } } void Light::set_diffuse(const Color &c) { - diffuse=c; + diffuse = c; + update_parameter(DIFFUSE); } void Light::set_specular(const Color &c) { - specular=c; + specular = c; + update_parameter(SPECULAR); } -void Light::set_position(float x_, float y_, float z_, float w_) +void Light::set_position(const Vector4 &p) { - x=x_; - y=y_; - z=z_; - w=w_; + position = p; + update_parameter(POSITION); } -void Light::apply() const +void Light::set_spot_direction(const Vector3 &d) { - apply_to(current); + spot_dir = d; + update_parameter(SPOT_DIR); } -void Light::apply_to(unsigned l) const +void Light::set_spot_exponent(float e) { - 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); + spot_exp = e; + update_parameter(SPOT_EXP); } -unsigned Light::current=0; +void Light::set_spot_cutoff(float c) +{ + spot_cutoff = c; + update_parameter(SPOT_CUTOFF); +} + +void Light::set_attenuation(float c, float l, float q) +{ + attenuation[0] = c; + attenuation[1] = l; + attenuation[2] = q; + update_parameter(ATTENUATION); +} + +void Light::bind_to(unsigned i) const +{ + LightUnit &unit = LightUnit::get_unit(i); + if(unit.set_light(this)) + { + enable(GL_LIGHT0+unit.get_index()); + update_parameter(-1, unit.get_index()); + } +} + +const Light *Light::current(unsigned i) +{ + return LightUnit::get_unit(i).get_light(); +} + +void Light::unbind_from(unsigned i) +{ + LightUnit &unit = LightUnit::get_unit(i); + if(unit.set_light(0)) + disable(GL_LIGHT0+unit.get_index()); +} } // namespace GL } // namespace Msp