]> git.tdb.fi Git - libs/gl.git/blobdiff - source/light.cpp
Refresh lighting and culling uniforms if the camera changes in pop_state
[libs/gl.git] / source / light.cpp
index d4b45aaf82cc66371c4a73f11174eaf7356af611..a3b3d014c0a51a16762c7a82285f4a6a8960247c 100644 (file)
@@ -1,7 +1,11 @@
 #include <stdexcept>
+#include <msp/gl/extensions/msp_legacy_features.h>
+#include <msp/strings/format.h>
 #include "light.h"
 #include "lightunit.h"
+#include "matrix.h"
 #include "misc.h"
+#include "programdata.h"
 
 using namespace std;
 
@@ -21,6 +25,12 @@ Light::Light():
        attenuation[2] = 0;
 }
 
+Light::~Light()
+{
+       while(LightUnit *unit = LightUnit::find_unit(this))
+               unbind_from(unit->get_index());
+}
+
 void Light::update_parameter(int mask, int index) const
 {
        if(index<0)
@@ -97,8 +107,18 @@ void Light::set_attenuation(float c, float l, float q)
        update_parameter(ATTENUATION);
 }
 
+void Light::update_shader_data(ProgramData &shdata, const Matrix &view_matrix, unsigned i) const
+{
+       string base = format("light_sources[%d]", i);
+       shdata.uniform(base+".position", view_matrix*position);
+       shdata.uniform(base+".diffuse", diffuse);
+       shdata.uniform(base+".specular", specular);
+}
+
 void Light::bind_to(unsigned i) const
 {
+       static Require _req(MSP_legacy_features);
+
        LightUnit &unit = LightUnit::get_unit(i);
        if(unit.set_light(this))
        {