X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Flight.cpp;h=4ba581e029f0083068e1517b1b870b4d7b552c18;hp=f74b3acb149071238d9053d41a400141854085d5;hb=HEAD;hpb=47cfca889482f00093ee6fdeaf4f478dc5ea90f2 diff --git a/source/light.cpp b/source/light.cpp deleted file mode 100644 index f74b3acb..00000000 --- a/source/light.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include -#include -#include -#include "light.h" -#include "lightunit.h" -#include "matrix.h" -#include "misc.h" -#include "programdata.h" - -using namespace std; - -namespace Msp { -namespace GL { - -Light::Light(): - diffuse(1), - specular(1), - position(0, 0, 1, 0), - spot_dir(0, 0, -1), - spot_exp(0), - spot_cutoff(Geometry::Angle::straight()) -{ - attenuation[0] = 1; - attenuation[1] = 0; - attenuation[2] = 0; -} - -Light::~Light() -{ - while(LightUnit *unit = LightUnit::find_unit(this)) - unbind_from(unit->get_index()); -} - -void Light::update_parameter(int mask, int index) const -{ - 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.degrees()); - 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; - update_parameter(DIFFUSE); -} - -void Light::set_specular(const Color &c) -{ - specular = c; - update_parameter(SPECULAR); -} - -void Light::set_position(const Vector4 &p) -{ - position = p; - update_parameter(POSITION); -} - -void Light::set_spot_direction(const Vector3 &d) -{ - spot_dir = normalize(d); - update_parameter(SPOT_DIR); -} - -void Light::set_spot_exponent(float e) -{ - if(e<0) - throw invalid_argument("Light::set_spot_exponent"); - - spot_exp = e; - update_parameter(SPOT_EXP); -} - -void Light::set_spot_cutoff(float c) -{ - set_spot_cutoff(Geometry::Angle::from_degrees(c)); -} - -void Light::set_spot_cutoff(const Geometry::Angle &c) -{ - if(c::zero() || (c>Geometry::Angle::right() && c!=Geometry::Angle::straight())) - throw invalid_argument("Light::set_spot_cutoff"); - - spot_cutoff = c; - update_parameter(SPOT_CUTOFF); -} - -void Light::disable_spot_cutoff() -{ - set_spot_cutoff(Geometry::Angle::straight()); -} - -void Light::set_attenuation(float c, float l, float q) -{ - attenuation[0] = c; - attenuation[1] = l; - attenuation[2] = q; - update_parameter(ATTENUATION); -} - -void Light::update_shader_data(ProgramData &shdata, const Matrix &view_matrix, unsigned i) const -{ - string base = format("light_sources[%d]", i); - shdata.uniform(base+".position", view_matrix*position); - shdata.uniform(base+".diffuse", diffuse); - shdata.uniform(base+".specular", specular); -} - -void Light::bind_to(unsigned i) const -{ - static Require _req(MSP_legacy_features); - - 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