]> git.tdb.fi Git - libs/gl.git/blobdiff - source/light.cpp
Improve parameters and documentation of Light
[libs/gl.git] / source / light.cpp
index a3b3d014c0a51a16762c7a82285f4a6a8960247c..f74b3acb149071238d9053d41a400141854085d5 100644 (file)
@@ -18,7 +18,7 @@ Light::Light():
        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;
@@ -54,7 +54,7 @@ void Light::update_parameter(int mask, int index) const
        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]);
@@ -83,22 +83,38 @@ void Light::set_position(const Vector4 &p)
 
 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;