]> git.tdb.fi Git - libs/gl.git/blob - source/materials/light.h
Remove deprecated interfaces from material and lighting code
[libs/gl.git] / source / materials / light.h
1 #ifndef MSP_GL_LIGHT_H_
2 #define MSP_GL_LIGHT_H_
3
4 #include <msp/datafile/objectloader.h>
5 #include <msp/geometry/angle.h>
6 #include "color.h"
7 #include "placeable.h"
8 #include "vector.h"
9
10 namespace Msp {
11 namespace GL {
12
13 class ProgramData;
14
15 /**
16 Stores properties of a single light source.  Lights can be directional, point
17 lights or spotlights.  No explicit type parameter is provided; rather the
18 other parameters determine what kind of light it is.  If the fourth component
19 of position is zero, it's a directional light.  Otherwise, if the spot cutoff
20 is not 180 degrees, it's a spotlight.  Otherwise it's an omnidirectional point
21 light.
22
23 Lights are usually grouped with a Lighting object, which can be used in a
24 Sequence::Step.
25
26 Lights do not cast shadows by themselves.  See ShadowMap for that.
27 */
28 class Light: public Placeable
29 {
30 public:
31         class Loader: public DataFile::ObjectLoader<Light>
32         {
33         public:
34                 Loader(Light &);
35
36         private:
37                 void attenuation(float, float, float);
38                 void color(float, float, float);
39                 void position(float, float, float, float);
40                 void spot_direction(float, float, float);
41                 void spot_exponent(float);
42                 void spot_cutoff(float);
43         };
44
45 private:
46         Color color;
47         Color transmittance;
48         Vector4 position;
49         Vector3 spot_dir;
50         Vector3 direction;
51         float spot_exp;
52         Geometry::Angle<float> spot_cutoff;
53         float attenuation[3];
54         unsigned generation;
55
56 public:
57         Light();
58
59 private:
60         void update_matrix();
61
62 public:
63         /** Sets the color of the Light.  Provided
64         to shaders as light_sources[i].color. */
65         void set_color(const Color &);
66
67         /** Sets a multiplier on how much light actually reaches the target.  Used
68         when modeling an atmosphere. */
69         void set_transmittance(const Color &);
70
71         const Color &get_color() const { return color; }
72         const Color &get_transmittance() const { return transmittance; }
73
74         /** Sets the postion and orientation of the Light from a matrix.  Negative Z
75         axis is used as the spot direction, other axes are ignored. */
76         virtual void set_matrix(const Matrix &);
77
78         /** Sets the position of the Light.  For a directional light, set the xyz
79         components to a vector pointing towards the light and the w component to 0. */
80         void set_position(const Vector4 &);
81
82         const Vector4 &get_position() const { return position; }
83
84         /** Sets the direction of a spotlight.  Has no effect if spotlight cutoff is
85         not set. */
86         void set_spot_direction(const Vector3 &);
87
88         /** Sets the angular falloff exponent of the spotlight.  Must be >= 0. */
89         void set_spot_exponent(float);
90
91         /** Sets the cutoff angle of a spotlight.  Beyond this angle from its axis
92         the spotlight provides no illumination.  Must be between 0 and 90 degrees,
93         or exactly 180 degrees to indicate a non-spotlight. */
94         void set_spot_cutoff(const Geometry::Angle<float> &);
95
96         /** Disables spotlight, reverting to an omnidirectional point light.
97         Equivalent to setting the spot cutoff to 180 degrees. */
98         void disable_spot_cutoff();
99
100         const Vector3 &get_spot_direction() const { return spot_dir; }
101         float get_spot_exponent() const { return spot_exp; }
102         const Geometry::Angle<float> &get_spot_cutoff() const { return spot_cutoff; }
103         void set_attenuation(float, float, float);
104         const float *get_attenuation() const { return attenuation; }
105
106         unsigned get_generation() const { return generation; }
107
108         /** Updates a ProgramData object with the uniforms for the Light.  A light
109         source index must be passed in.  Primarily used by Lighting. */
110         void update_shader_data(ProgramData &, unsigned) const;
111 };
112
113 } // namespace GL
114 } // namespace Msp
115
116 #endif