1 #include "directionallight.h"
2 #include "programdata.h"
9 void DirectionalLight::update_matrix()
12 if(20*abs(direction.z)>abs(direction.x)+abs(direction.y))
16 Vector3 right_dir = normalize(cross(direction, up_dir));
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);
26 void DirectionalLight::set_matrix(const Matrix &m)
28 Placeable::set_matrix(m);
29 direction = normalize(-matrix.column(2).slice<3>(0));
34 void DirectionalLight::set_direction(const Vector3 &d)
36 direction = normalize(d);
41 void DirectionalLight::set_transmittance(const Color &t)
47 void DirectionalLight::update_shader_data(ProgramData &shdata, const string &base) const
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);
56 DataFile::Loader::ActionMap DirectionalLight::Loader::shared_actions;
58 DirectionalLight::Loader::Loader(DirectionalLight &l):
59 DerivedObjectLoader<DirectionalLight, Light::Loader>(l)
61 set_actions(shared_actions);
64 void DirectionalLight::Loader::init_actions()
66 Light::Loader::init_actions();
67 add("direction", &Loader::direction);
70 void DirectionalLight::Loader::direction(float x, float y, float z)
72 obj.set_direction(Vector3(x, y, z));