1 #include "directionallight.h"
2 #include "programdata.h"
9 DirectionalLight::DirectionalLight():
11 direction(0.0f, 0.0f, -1.0f)
14 void DirectionalLight::update_matrix()
17 if(20*abs(direction.z)>abs(direction.x)+abs(direction.y))
21 Vector3 right_dir = normalize(cross(direction, up_dir));
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);
31 void DirectionalLight::set_matrix(const Matrix &m)
33 Placeable::set_matrix(m);
34 direction = normalize(-matrix.column(2).slice<3>(0));
39 void DirectionalLight::set_direction(const Vector3 &d)
41 direction = normalize(d);
46 void DirectionalLight::set_transmittance(const Color &t)
52 void DirectionalLight::update_shader_data(ProgramData &shdata, const string &base) const
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);
61 DataFile::Loader::ActionMap DirectionalLight::Loader::shared_actions;
63 DirectionalLight::Loader::Loader(DirectionalLight &l):
64 DerivedObjectLoader<DirectionalLight, Light::Loader>(l)
66 set_actions(shared_actions);
69 void DirectionalLight::Loader::init_actions()
71 Light::Loader::init_actions();
72 add("direction", &Loader::direction);
75 void DirectionalLight::Loader::direction(float x, float y, float z)
77 obj.set_direction(Vector3(x, y, z));