position(0, 0, 1, 0),
spot_dir(0, 0, -1),
spot_exp(0),
- spot_cutoff(Geometry::Angle<float>::straight())
+ spot_cutoff(Geometry::Angle<float>::straight()),
+ generation(0)
{
attenuation[0] = 1;
attenuation[1] = 0;
void Light::set_color(const Color &c)
{
color = c;
+ ++generation;
}
void Light::set_transmittance(const Color &t)
{
transmittance = t;
+ ++generation;
}
void Light::set_matrix(const Matrix &m)
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)
if(!position.w)
direction = normalize(-position.slice<3>(0));
update_matrix();
+ ++generation;
}
void Light::set_spot_direction(const Vector3 &d)
if(position.w)
direction = spot_dir;
update_matrix();
+ ++generation;
}
void Light::set_spot_exponent(float e)
throw invalid_argument("Light::set_spot_exponent");
spot_exp = e;
+ ++generation;
}
void Light::set_spot_cutoff(const Geometry::Angle<float> &c)
throw invalid_argument("Light::set_spot_cutoff");
spot_cutoff = c;
+ ++generation;
}
void Light::disable_spot_cutoff()
{
set_spot_cutoff(Geometry::Angle<float>::straight());
+ ++generation;
}
void Light::set_attenuation(float c, float l, float q)
attenuation[0] = c;
attenuation[1] = l;
attenuation[2] = q;
+ ++generation;
}
-void Light::update_shader_data(ProgramData &shdata, const Matrix &view_matrix, unsigned i) const
+void Light::update_shader_data(ProgramData &shdata, unsigned i) const
{
string base = format("light_sources[%d]", i);
- shdata.uniform(base+".position", view_matrix*position);
+ 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);
}