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