]> git.tdb.fi Git - libs/gl.git/blob - source/materials/directionallight.cpp
Split the Light class into subclasses by light type
[libs/gl.git] / source / materials / directionallight.cpp
1 #include "directionallight.h"
2 #include "programdata.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GL {
8
9 DirectionalLight::DirectionalLight():
10         transmittance(1.0f),
11         direction(0.0f, 0.0f, -1.0f)
12 { }
13
14 void DirectionalLight::update_matrix()
15 {
16         Vector3 up_dir;
17         if(20*abs(direction.z)>abs(direction.x)+abs(direction.y))
18                 up_dir.y = 1;
19         else
20                 up_dir.z = 1;
21         Vector3 right_dir = normalize(cross(direction, up_dir));
22
23         Vector4 columns[4];
24         columns[0] = compose(right_dir, 0.0f);
25         columns[1] = compose(cross(right_dir, direction), 0.0f);
26         columns[2] = compose(-direction, 0.0f);
27         columns[3] = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
28         matrix = Matrix::from_columns(columns);
29 }
30
31 void DirectionalLight::set_matrix(const Matrix &m)
32 {
33         Placeable::set_matrix(m);
34         direction = normalize(-matrix.column(2).slice<3>(0));
35         update_matrix();
36         ++generation;
37 }
38
39 void DirectionalLight::set_direction(const Vector3 &d)
40 {
41         direction = normalize(d);
42         update_matrix();
43         ++generation;
44 }
45
46 void DirectionalLight::set_transmittance(const Color &t)
47 {
48         transmittance = t;
49         ++generation;
50 }
51
52 void DirectionalLight::update_shader_data(ProgramData &shdata, const string &base) const
53 {
54         shdata.uniform(base+".type", 1);
55         shdata.uniform(base+".position", -direction.x, -direction.y, -direction.z, 0.0f);
56         shdata.uniform(base+".color", color.r*transmittance.r, color.g*transmittance.g, color.b*transmittance.b);
57         shdata.uniform(base+".attenuation", 1.0f, 0.0f, 0.0f);
58 }
59
60
61 DataFile::Loader::ActionMap DirectionalLight::Loader::shared_actions;
62
63 DirectionalLight::Loader::Loader(DirectionalLight &l):
64         DerivedObjectLoader<DirectionalLight, Light::Loader>(l)
65 {
66         set_actions(shared_actions);
67 }
68
69 void DirectionalLight::Loader::init_actions()
70 {
71         Light::Loader::init_actions();
72         add("direction", &Loader::direction);
73 }
74
75 void DirectionalLight::Loader::direction(float x, float y, float z)
76 {
77         obj.set_direction(Vector3(x, y, z));
78 }
79
80 } // namespace GL
81 } // namespace Msp