position(0, 0, 1, 0),
spot_dir(0, 0, -1),
spot_exp(0),
- spot_cutoff(180)
+ spot_cutoff(Geometry::Angle<float>::straight())
{
attenuation[0] = 1;
attenuation[1] = 0;
if(mask&SPOT_EXP)
glLightf(l, GL_SPOT_EXPONENT, spot_exp);
if(mask&SPOT_CUTOFF)
- glLightf(l, GL_SPOT_CUTOFF, spot_cutoff);
+ glLightf(l, GL_SPOT_CUTOFF, spot_cutoff.degrees());
if(mask&ATTENUATION)
{
glLightf(l, GL_CONSTANT_ATTENUATION, attenuation[0]);
void Light::set_spot_direction(const Vector3 &d)
{
- spot_dir = 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<float>::from_degrees(c));
+}
+
+void Light::set_spot_cutoff(const Geometry::Angle<float> &c)
+{
+ if(c<Geometry::Angle<float>::zero() || (c>Geometry::Angle<float>::right() && c!=Geometry::Angle<float>::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<float>::straight());
+}
+
void Light::set_attenuation(float c, float l, float q)
{
attenuation[0] = c;