X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmaterials%2Flight.cpp;h=24bd8fa9c443483f581a8ed72b59a5df6e00445d;hp=7c78b393fc32431b43904ed1dcdd14409446bb94;hb=adc26a2e141a2853b6c5025130c46a46cece4b84;hpb=e6e6f0fe81a2f92985e65ae0de708974194d81a3 diff --git a/source/materials/light.cpp b/source/materials/light.cpp index 7c78b393..24bd8fa9 100644 --- a/source/materials/light.cpp +++ b/source/materials/light.cpp @@ -1,7 +1,8 @@ #include #include +#include "directionallight.h" #include "light.h" -#include "programdata.h" +#include "pointlight.h" using namespace std; @@ -9,35 +10,9 @@ namespace Msp { namespace GL { Light::Light(): - color(1), - transmittance(1), - position(0, 0, 1, 0), - spot_dir(0, 0, -1), - spot_exp(0), - spot_cutoff(Geometry::Angle::straight()), + color(1.0f), generation(0) -{ - attenuation[0] = 1; - attenuation[1] = 0; - attenuation[2] = 0; -} - -void Light::update_matrix() -{ - Vector3 up_dir; - if(20*abs(direction.z)>abs(direction.x)+abs(direction.y)) - up_dir.y = 1; - else - up_dir.z = 1; - Vector3 right_dir = normalize(cross(direction, up_dir)); - - Vector4 columns[4]; - columns[0] = compose(right_dir, 0.0f); - columns[1] = compose(cross(right_dir, direction), 0.0f); - columns[2] = compose(-direction, 0.0f); - columns[3] = position; - matrix = Matrix::from_columns(columns); -} +{ } void Light::set_color(const Color &c) { @@ -45,95 +20,32 @@ void Light::set_color(const Color &c) ++generation; } -void Light::set_transmittance(const Color &t) -{ - transmittance = t; - ++generation; -} - -void Light::set_matrix(const Matrix &m) -{ - Placeable::set_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_matrix(); - ++generation; -} - -void Light::set_position(const Vector4 &p) -{ - position = p; - if(!position.w) - direction = normalize(-position.slice<3>(0)); - update_matrix(); - ++generation; -} - -void Light::set_spot_direction(const Vector3 &d) -{ - spot_dir = normalize(d); - if(position.w) - direction = spot_dir; - update_matrix(); - ++generation; -} - -void Light::set_spot_exponent(float e) -{ - if(e<0) - throw invalid_argument("Light::set_spot_exponent"); - - spot_exp = e; - ++generation; -} - -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; - ++generation; -} - -void Light::disable_spot_cutoff() -{ - set_spot_cutoff(Geometry::Angle::straight()); - ++generation; -} - -void Light::set_attenuation(float c, float l, float q) +void Light::update_shader_data(ProgramData &shdata, unsigned i) const { - attenuation[0] = c; - attenuation[1] = l; - attenuation[2] = q; - ++generation; + update_shader_data(shdata, format("light_sources[%d]", i)); } -void Light::update_shader_data(ProgramData &shdata, unsigned i) const +Light::GenericLoader::TypeRegistry &Light::get_light_registry() { - string base = format("light_sources[%d]", i); - shdata.uniform(base+".position", position); - shdata.uniform(base+".color", color.r*transmittance.r, color.g*transmittance.g, color.b*transmittance.b); - shdata.uniform(base+".enabled", 1); + static GenericLoader::TypeRegistry registry; + static bool initialized = false; + if(!initialized) + { + initialized = true; + registry.register_type("directional"); + registry.register_type("point"); + } + return registry; } Light::Loader::Loader(Light &l): DataFile::ObjectLoader(l) -{ - add("attenuation", &Loader::attenuation); - add("color", &Loader::color); - add("position", &Loader::position); - 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) +void Light::Loader::init_actions() { - obj.set_attenuation(c, l, q); + add("color", &Loader::color); } void Light::Loader::color(float r, float g, float b) @@ -141,25 +53,5 @@ void Light::Loader::color(float r, float g, float b) obj.set_color(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::spot_direction(float x, float y, float z) -{ - obj.set_spot_direction(Vector3(x, y, z)); -} - -void Light::Loader::spot_exponent(float e) -{ - obj.set_spot_exponent(e); -} - -void Light::Loader::spot_cutoff(float c) -{ - obj.set_spot_cutoff(Geometry::Angle::from_degrees(c)); -} - } // namespace GL } // namespace Msp