Fix T52298: hidden lamps still compute shadow buffers in viewport.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 12 Aug 2017 11:22:26 +0000 (13:22 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 12 Aug 2017 11:22:26 +0000 (13:22 +0200)
source/blender/editors/space_view3d/view3d_draw.c
source/blender/gpu/GPU_material.h
source/blender/gpu/intern/gpu_material.c

index 250e6559b8f268bd60b37e56614ef75e84eb8772..6f8120a747bafc22d23cf5705f4b0aa5e1d87f9d 100644 (file)
@@ -2592,7 +2592,7 @@ static void gpu_render_lamp_update(Scene *scene, View3D *v3d,
                if (layers &&
                    GPU_lamp_has_shadow_buffer(lamp) &&
                    /* keep last, may do string lookup */
-                   GPU_lamp_override_visible(lamp, srl, NULL))
+                   GPU_lamp_visible(lamp, srl, NULL))
                {
                        shadow = MEM_callocN(sizeof(View3DShadow), "View3DShadow");
                        shadow->lamp = lamp;
index 6db236868321d4ddc00758bcfef13085d8c6ae28..dbfcd4d1ea40001a3f3f33b033a9a664107096cf 100644 (file)
@@ -226,7 +226,7 @@ void GPU_material_free(struct ListBase *gpumaterial);
 
 void GPU_materials_free(void);
 
-bool GPU_lamp_override_visible(GPULamp *lamp, struct SceneRenderLayer *srl, struct Material *ma);
+bool GPU_lamp_visible(GPULamp *lamp, struct SceneRenderLayer *srl, struct Material *ma);
 void GPU_material_bind(
         GPUMaterial *material, int oblay, int viewlay, double time, int mipmap,
         float viewmat[4][4], float viewinv[4][4], float cameraborder[4], bool scenelock);
index 1f3ae7f708a1f8ae15686c9564798b6fac0fd296..f39cad20b9be864ea3146a36126b56bae59942e7 100644 (file)
@@ -312,9 +312,11 @@ void GPU_material_free(ListBase *gpumaterial)
        BLI_freelistN(gpumaterial);
 }
 
-bool GPU_lamp_override_visible(GPULamp *lamp, SceneRenderLayer *srl, Material *ma)
+bool GPU_lamp_visible(GPULamp *lamp, SceneRenderLayer *srl, Material *ma)
 {
-       if (srl && srl->light_override)
+       if (lamp->hide)
+               return false;
+       else if (srl && srl->light_override)
                return BKE_group_object_exists(srl->light_override, lamp->ob);
        else if (ma && ma->group)
                return BKE_group_object_exists(ma->group, lamp->ob);
@@ -338,8 +340,8 @@ void GPU_material_bind(
                        for (LinkData *nlink = material->lamps.first; nlink; nlink = nlink->next) {
                                GPULamp *lamp = nlink->data;
                                
-                               if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay)) &&
-                                   GPU_lamp_override_visible(lamp, srl, material->ma))
+                               if ((lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay)) &&
+                                   GPU_lamp_visible(lamp, srl, material->ma))
                                {
                                        lamp->dynenergy = lamp->energy;
                                        copy_v3_v3(lamp->dyncol, lamp->col);