X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Flight.cpp;h=e910411f276e27ebd305f507513177787caebb25;hp=aeb17c5be4a604b79235ade3cd2423d34e83dfb0;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=05d70b38a546f35a7687cae6ae3fcd6ab78898b2 diff --git a/source/light.cpp b/source/light.cpp index aeb17c5b..e910411f 100644 --- a/source/light.cpp +++ b/source/light.cpp @@ -1,8 +1,6 @@ #include -#include #include #include "light.h" -#include "lightunit.h" #include "matrix.h" #include "misc.h" #include "programdata.h" @@ -25,44 +23,6 @@ Light::Light(): 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::update_matrix() { Vector3 up_dir; @@ -83,13 +43,11 @@ void Light::update_matrix() 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_matrix(const Matrix &m) @@ -98,14 +56,12 @@ void Light::set_matrix(const Matrix &m) position = matrix.column(3); spot_dir = normalize(-matrix.column(2).slice<3>(0)); direction = (position.w ? spot_dir : normalize(-position.slice<3>(0))); - update_parameter(POSITION|SPOT_DIR); update_matrix(); } void Light::set_position(const Vector4 &p) { position = p; - update_parameter(POSITION); if(!position.w) direction = normalize(-position.slice<3>(0)); update_matrix(); @@ -116,7 +72,6 @@ void Light::set_spot_direction(const Vector3 &d) spot_dir = normalize(d); if(position.w) direction = spot_dir; - update_parameter(SPOT_DIR); update_matrix(); } @@ -126,12 +81,6 @@ void Light::set_spot_exponent(float e) 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) @@ -140,7 +89,6 @@ void Light::set_spot_cutoff(const Geometry::Angle &c) throw invalid_argument("Light::set_spot_cutoff"); spot_cutoff = c; - update_parameter(SPOT_CUTOFF); } void Light::disable_spot_cutoff() @@ -153,7 +101,6 @@ 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 @@ -164,28 +111,52 @@ void Light::update_shader_data(ProgramData &shdata, const Matrix &view_matrix, u shdata.uniform(base+".specular", specular); } -void Light::bind_to(unsigned i) const + +Light::Loader::Loader(Light &l): + DataFile::ObjectLoader(l) +{ + add("attenuation", &Loader::attenuation); + add("diffuse", &Loader::diffuse); + add("position", &Loader::position); + add("specular", &Loader::specular); + add("spot_direction", &Loader::spot_direction); + add("spot_exponent", &Loader::spot_exponent); + add("spot_cutoff", &Loader::spot_cutoff); +} + +void Light::Loader::attenuation(float c, float l, float q) { - static Require _req(MSP_legacy_features); + obj.set_attenuation(c, l, q); +} - LightUnit &unit = LightUnit::get_unit(i); - if(unit.set_light(this)) - { - enable(GL_LIGHT0+unit.get_index()); - update_parameter(-1, unit.get_index()); - } +void Light::Loader::diffuse(float r, float g, float b) +{ + obj.set_diffuse(Color(r, g, b)); +} + +void Light::Loader::position(float x, float y, float z, float w) +{ + obj.set_position(Vector4(x, y, z, w)); +} + +void Light::Loader::specular(float r, float g, float b) +{ + obj.set_specular(Color(r, g, b)); +} + +void Light::Loader::spot_direction(float x, float y, float z) +{ + obj.set_spot_direction(Vector3(x, y, z)); } -const Light *Light::current(unsigned i) +void Light::Loader::spot_exponent(float e) { - return LightUnit::get_unit(i).get_light(); + obj.set_spot_exponent(e); } -void Light::unbind_from(unsigned i) +void Light::Loader::spot_cutoff(float c) { - LightUnit &unit = LightUnit::get_unit(i); - if(unit.set_light(0)) - disable(GL_LIGHT0+unit.get_index()); + obj.set_spot_cutoff(Geometry::Angle::from_degrees(c)); } } // namespace GL