Revision: 19398
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19398
Author:   blendix
Date:     2009-03-24 16:45:08 +0100 (Tue, 24 Mar 2009)

Log Message:
-----------
Fix for bug #18423: BGE lights in overlay scene also affected
other scenes, for texture face / multitexture materials.

Fix for bug #18428: BGE lights on hidden layers were still used,
for all material types, now they have no effect

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
    trunk/blender/source/gameengine/Rasterizer/RAS_LightObject.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp

Modified: 
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp   
2009-03-24 13:39:50 UTC (rev 19397)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp   
2009-03-24 15:45:08 UTC (rev 19398)
@@ -28,6 +28,8 @@
 
 #include "GL/glew.h"
 
+#include "DNA_scene_types.h"
+
 #include "RAS_IRenderTools.h"
 #include "RAS_IRasterizer.h"
 #include "RAS_LightObject.h"
@@ -67,6 +69,7 @@
        m_clientobject = NULL;
        m_lastlightlayer = -1;
        m_lastlighting = false;
+       m_lastauxinfo = NULL;
        DisableOpenGLLights();
 }
 
@@ -80,26 +83,28 @@
  * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in
  * a scene. */
 
-void KX_BlenderRenderTools::ProcessLighting(RAS_IRasterizer *rasty, int layer, 
const MT_Transform& viewmat)
+void KX_BlenderRenderTools::ProcessLighting(RAS_IRasterizer *rasty, bool 
uselights, const MT_Transform& viewmat)
 {
-       if(m_lastlightlayer == layer)
+       bool enable = false;
+       int layer= -1;
+
+       /* find the layer */
+       if(uselights) {
+               if(m_clientobject)
+                       layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
+       }
+
+       /* avoid state switching */
+       if(m_lastlightlayer == layer && m_lastauxinfo == m_auxilaryClientInfo)
                return;
 
        m_lastlightlayer = layer;
+       m_lastauxinfo = m_auxilaryClientInfo;
 
-       bool enable = false;
+       /* enable/disable lights as needed */
+       if(layer >= 0)
+               enable = applyLights(layer, viewmat);
 
-       if (layer >= 0)
-       {
-               if (m_clientobject)
-               {
-                       if (layer == RAS_LIGHT_OBJECT_LAYER)
-                               layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
-
-                       enable = applyLights(layer, viewmat);
-               }
-       }
-
        if(enable)
                EnableOpenGLLights(rasty);
        else
@@ -324,11 +329,16 @@
 int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& 
viewmat)
 {
        // taken from blender source, incompatibility between Blender Object / 
GameObject       
+       KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
+       int scenelayer = ~0;
        float glviewmat[16];
        unsigned int count;
        float vec[4];
 
        vec[3]= 1.0;
+
+       if(kxscene && kxscene->GetBlenderScene())
+               scenelayer = kxscene->GetBlenderScene()->lay;
        
        for(count=0; count<m_numgllights; count++)
                glDisable((GLenum)(GL_LIGHT0+count));
@@ -343,71 +353,77 @@
        for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count 
< m_numgllights; ++lit)
        {
                RAS_LightObject* lightdata = (*lit);
-               if (lightdata->m_layer & objectlayer)
-               {
-                       vec[0] = (*(lightdata->m_worldmatrix))(0,3);
-                       vec[1] = (*(lightdata->m_worldmatrix))(1,3);
-                       vec[2] = (*(lightdata->m_worldmatrix))(2,3);
-                       vec[3] = 1;
+               KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
 
-                       if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
-                               
-                               vec[0] = (*(lightdata->m_worldmatrix))(0,2);
-                               vec[1] = (*(lightdata->m_worldmatrix))(1,2);
-                               vec[2] = (*(lightdata->m_worldmatrix))(2,2);
-                               //vec[0]= base->object->obmat[2][0];
-                               //vec[1]= base->object->obmat[2][1];
-                               //vec[2]= base->object->obmat[2][2];
-                               vec[3]= 0.0;
-                               glLightfv((GLenum)(GL_LIGHT0+count), 
GL_POSITION, vec); 
-                       }
-                       else {
-                               //vec[3]= 1.0;
-                               glLightfv((GLenum)(GL_LIGHT0+count), 
GL_POSITION, vec); 
-                               glLightf((GLenum)(GL_LIGHT0+count), 
GL_CONSTANT_ATTENUATION, 1.0);
-                               glLightf((GLenum)(GL_LIGHT0+count), 
GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
-                               // without this next line it looks backward 
compatible.
-                               //attennuation still is acceptable 
-                               glLightf((GLenum)(GL_LIGHT0+count), 
GL_QUADRATIC_ATTENUATION, 
lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); 
-                               
-                               
if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
-                                       vec[0] = 
-(*(lightdata->m_worldmatrix))(0,2);
-                                       vec[1] = 
-(*(lightdata->m_worldmatrix))(1,2);
-                                       vec[2] = 
-(*(lightdata->m_worldmatrix))(2,2);
-                                       //vec[0]= -base->object->obmat[2][0];
-                                       //vec[1]= -base->object->obmat[2][1];
-                                       //vec[2]= -base->object->obmat[2][2];
-                                       glLightfv((GLenum)(GL_LIGHT0+count), 
GL_SPOT_DIRECTION, vec);
-                                       glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
-                                       glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
-                               }
-                               else glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_CUTOFF, 180.0);
-                       }
+               /* only use lights in the same layer as the object */
+               if(!(lightdata->m_layer & objectlayer))
+                       continue;
+               /* only use lights in the same scene, and in a visible layer */
+               if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
+                       continue;
+
+               vec[0] = (*(lightdata->m_worldmatrix))(0,3);
+               vec[1] = (*(lightdata->m_worldmatrix))(1,3);
+               vec[2] = (*(lightdata->m_worldmatrix))(2,3);
+               vec[3] = 1;
+
+               if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
                        
-                       if (lightdata->m_nodiffuse)
-                       {
-                               vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-                       } else {
-                               vec[0]= lightdata->m_energy*lightdata->m_red;
-                               vec[1]= lightdata->m_energy*lightdata->m_green;
-                               vec[2]= lightdata->m_energy*lightdata->m_blue;
-                               vec[3]= 1.0;
+                       vec[0] = (*(lightdata->m_worldmatrix))(0,2);
+                       vec[1] = (*(lightdata->m_worldmatrix))(1,2);
+                       vec[2] = (*(lightdata->m_worldmatrix))(2,2);
+                       //vec[0]= base->object->obmat[2][0];
+                       //vec[1]= base->object->obmat[2][1];
+                       //vec[2]= base->object->obmat[2][2];
+                       vec[3]= 0.0;
+                       glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
+               }
+               else {
+                       //vec[3]= 1.0;
+                       glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
+                       glLightf((GLenum)(GL_LIGHT0+count), 
GL_CONSTANT_ATTENUATION, 1.0);
+                       glLightf((GLenum)(GL_LIGHT0+count), 
GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
+                       // without this next line it looks backward compatible.
+                       //attennuation still is acceptable 
+                       glLightf((GLenum)(GL_LIGHT0+count), 
GL_QUADRATIC_ATTENUATION, 
lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); 
+                       
+                       if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
+                               vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
+                               vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
+                               vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
+                               //vec[0]= -base->object->obmat[2][0];
+                               //vec[1]= -base->object->obmat[2][1];
+                               //vec[2]= -base->object->obmat[2][2];
+                               glLightfv((GLenum)(GL_LIGHT0+count), 
GL_SPOT_DIRECTION, vec);
+                               glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
+                               glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
                        }
-                       glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
-                       if (lightdata->m_nospecular)
-                       {
-                               vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-                       } else if (lightdata->m_nodiffuse) {
-                               vec[0]= lightdata->m_energy*lightdata->m_red;
-                               vec[1]= lightdata->m_energy*lightdata->m_green;
-                               vec[2]= lightdata->m_energy*lightdata->m_blue;
-                               vec[3]= 1.0;
-                       }
-                       glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
-                       glEnable((GLenum)(GL_LIGHT0+count));
+                       else glLightf((GLenum)(GL_LIGHT0+count), 
GL_SPOT_CUTOFF, 180.0);
+               }
+               
+               if (lightdata->m_nodiffuse)
+               {
+                       vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
+               } else {
+                       vec[0]= lightdata->m_energy*lightdata->m_red;
+                       vec[1]= lightdata->m_energy*lightdata->m_green;
+                       vec[2]= lightdata->m_energy*lightdata->m_blue;
+                       vec[3]= 1.0;
+               }
+               glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
+               if (lightdata->m_nospecular)
+               {
+                       vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
+               } else if (lightdata->m_nodiffuse) {
+                       vec[0]= lightdata->m_energy*lightdata->m_red;
+                       vec[1]= lightdata->m_energy*lightdata->m_green;
+                       vec[2]= lightdata->m_energy*lightdata->m_blue;
+                       vec[3]= 1.0;
+               }
+               glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
+               glEnable((GLenum)(GL_LIGHT0+count));
 
-                       count++;
-               }
+               count++;
        }
        glPopMatrix();
 

Modified: 
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h     
2009-03-24 13:39:50 UTC (rev 19397)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h     
2009-03-24 15:45:08 UTC (rev 19398)
@@ -51,6 +51,7 @@
 {
        int             m_lastlightlayer;
        bool    m_lastlighting;
+       void    *m_lastauxinfo;
        static unsigned int m_numgllights;
 
 public:
@@ -62,7 +63,7 @@
 
        void                            EnableOpenGLLights(RAS_IRasterizer 
*rasty);
        void                            DisableOpenGLLights();
-       void                            ProcessLighting(RAS_IRasterizer *rasty, 
int layer, const MT_Transform& viewmat);
+       void                            ProcessLighting(RAS_IRasterizer *rasty, 
bool uselights, const MT_Transform& viewmat);
 
        void                        RenderText2D(RAS_TEXT_RENDER_MODE mode,
                                                                         const 
char* text,

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2009-03-24 13:39:50 UTC (rev 19397)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2009-03-24 15:45:08 UTC (rev 19398)
@@ -29,6 +29,8 @@
 
 #include "GL/glew.h"
 
+#include "DNA_scene_types.h"
+
 #include "RAS_IRenderTools.h"
 #include "RAS_IRasterizer.h"
 #include "RAS_LightObject.h"
@@ -72,6 +74,7 @@
        m_clientobject = NULL;
        m_lastlightlayer = -1;
        m_lastlighting = false;
+       m_lastauxinfo = NULL;
        DisableOpenGLLights();
 }
 
@@ -85,26 +88,28 @@
  * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in
  * a scene. */
 
-void GPC_RenderTools::ProcessLighting(RAS_IRasterizer *rasty, int layer, const 
MT_Transform& viewmat)
+void GPC_RenderTools::ProcessLighting(RAS_IRasterizer *rasty, bool uselights, 
const MT_Transform& viewmat)
 {
-       if(m_lastlightlayer == layer)
+       bool enable = false;
+       int layer= -1;
+
+       /* find the layer */
+       if(uselights) {
+               if(m_clientobject)
+                       layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
+       }
+
+       /* avoid state switching */
+       if(m_lastlightlayer == layer && m_lastauxinfo == m_auxilaryClientInfo)
                return;
 
        m_lastlightlayer = layer;
+       m_lastauxinfo = m_auxilaryClientInfo;
 
-       bool enable = false;
+       /* enable/disable lights as needed */
+       if(layer >= 0)
+               enable = applyLights(layer, viewmat);
 
-       if (layer >= 0)
-       {
-               if (m_clientobject)
-               {
-                       if (layer == RAS_LIGHT_OBJECT_LAYER)
-                               layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
-

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to