BGE #18732: Python Light options don't work with GLSL materials. Commited patch from...
authorBenoit Bolsee <benoit.bolsee@online.be>
Wed, 13 May 2009 06:42:15 +0000 (06:42 +0000)
committerBenoit Bolsee <benoit.bolsee@online.be>
Wed, 13 May 2009 06:42:15 +0000 (06:42 +0000)
source/blender/gpu/GPU_material.h
source/blender/gpu/intern/gpu_material.c
source/blender/src/drawview.c
source/gameengine/Ketsji/KX_Light.cpp
source/gameengine/Ketsji/KX_Light.h

index ccc687858f4161f15d1a9a18461b4bade2859934..49c0dc166c19af25e5d6f681e73b465f7921e554 100644 (file)
@@ -159,6 +159,7 @@ void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize
 void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
 
 void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]);
+void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);
 int GPU_lamp_shadow_layer(GPULamp *lamp);
 
 #ifdef __cplusplus
index 87703bc73bfc45af90107c311beafb5f918db921..f7052694fc73daa3944d84c82ad5e5fe33f1b43d 100644 (file)
@@ -1306,6 +1306,18 @@ void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4])
        Mat4Invert(lamp->imat, mat);
 }
 
+void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy)
+{
+       lamp->la->energy = energy;
+       lamp->la->r = r;
+       lamp->la->g = g;
+       lamp->la->b = b;
+
+       lamp->col[0]= lamp->la->r*lamp->energy;
+       lamp->col[1]= lamp->la->g*lamp->energy;
+       lamp->col[2]= lamp->la->b*lamp->energy;
+}
+
 static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *la, GPULamp *lamp)
 {
        float temp, angle, pixsize, wsize;
index d6184f4241018e5ebc4afa6e5b0ecfd7afc29515..9b2f7fe53d95bb75d5733ceb071f5b5a921320c8 100644 (file)
@@ -3152,12 +3152,14 @@ typedef struct View3DShadow{
 static void gpu_render_lamp_update(View3D *v3d, Object *ob, Object *par, float obmat[][4], ListBase *shadows)
 {
        GPULamp *lamp;
+       Lamp *la = (Lamp*)ob->data;
        View3DShadow *shadow;
 
        lamp = GPU_lamp_from_blender(G.scene, ob, par);
 
        if(lamp) {
                GPU_lamp_update(lamp, ob->lay, obmat);
+               GPU_lamp_update_colors(lamp, la->r, la->g, la->b, la->energy);
                
                if((ob->lay & v3d->lay) && GPU_lamp_has_shadow_buffer(lamp)) {
                        shadow= MEM_callocN(sizeof(View3DShadow), "View3DShadow");
index 777a7f326298e8a375aa38fa5d845bc65fcc8475..3af34c39123af9153ebcb9c2df0b8e983c3b730b 100644 (file)
@@ -61,6 +61,11 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
        m_rendertools->AddLight(&m_lightobj);
        m_glsl = glsl;
        m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
+
+       m_initialvalues[0] = lightobj.m_red;
+       m_initialvalues[1] = lightobj.m_green;
+       m_initialvalues[2] = lightobj.m_blue;
+       m_initialvalues[3] = lightobj.m_energy;
 };
 
 
@@ -71,6 +76,8 @@ KX_LightObject::~KX_LightObject()
        if((lamp = GetGPULamp())) {
                float obmat[4][4] = {{0}};
                GPU_lamp_update(lamp, 0, obmat);
+               GPU_lamp_update_colors(lamp, m_initialvalues[0], m_initialvalues[1],
+               m_initialvalues[2], m_initialvalues[3]);
        }
 
        m_rendertools->RemoveLight(&m_lightobj);
@@ -114,6 +121,8 @@ void KX_LightObject::Update()
                                obmat[i][j] = (float)*dobmat;
 
                GPU_lamp_update(lamp, m_lightobj.m_layer, obmat);
+               GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green, 
+                       m_lightobj.m_blue, m_lightobj.m_energy);
        }
 }
 
index 35f25515e3b228c81bd2fc378a2a41b974e99bb7..690231ff09049eece800e3ac937004c05f5fafa6 100644 (file)
@@ -44,6 +44,7 @@ class KX_LightObject : public KX_GameObject
        Py_Header;
 protected:
        RAS_LightObject         m_lightobj;
+       float                           m_initialvalues [4];
        class RAS_IRenderTools* m_rendertools;  //needed for registering and replication of lightobj
        bool                            m_glsl;
        Scene*                          m_blenderscene;