[Bf-blender-cvs] [1973b17] master: View3D: Tweak GLSL preview, use only lamps enabled in active render layer and material light group.

IRIE Shinsuke noreply at git.blender.org
Sun Apr 27 18:25:58 CEST 2014


Commit: 1973b17fce65a4dfececb45b19abec37898c1ab5
Author: IRIE Shinsuke
Date:   Mon Apr 28 01:08:10 2014 +0900
https://developer.blender.org/rB1973b17fce65a4dfececb45b19abec37898c1ab5

View3D: Tweak GLSL preview, use only lamps enabled in active render layer and material light group.

This change makes lighting in GLSL preview more accurate, though it still
doesn't support material's "Exclusive" option.

Technical note: Changes in view3d_draw.c are not essential, these avoid
preparing unused shadow buffers.

Reviewers: brecht

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D457

===================================================================

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_material.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index ff7d251..b00cec7 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2381,11 +2381,12 @@ typedef struct View3DShadow {
 } View3DShadow;
 
 static void gpu_render_lamp_update(Scene *scene, View3D *v3d, Object *ob, Object *par,
-                                   float obmat[4][4], ListBase *shadows)
+                                   float obmat[4][4], ListBase *shadows, SceneRenderLayer *srl)
 {
 	GPULamp *lamp;
 	Lamp *la = (Lamp *)ob->data;
 	View3DShadow *shadow;
+	unsigned int layers;
 	
 	lamp = GPU_lamp_from_blender(scene, ob, par);
 	
@@ -2393,7 +2394,11 @@ static void gpu_render_lamp_update(Scene *scene, View3D *v3d, Object *ob, Object
 		GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), 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)) {
+		layers = ob->lay & v3d->lay;
+		if (srl)
+			layers &= srl->lay;
+
+		if (layers && GPU_lamp_override_visible(lamp, srl, NULL) && GPU_lamp_has_shadow_buffer(lamp)) {
 			shadow = MEM_callocN(sizeof(View3DShadow), "View3DShadow");
 			shadow->lamp = lamp;
 			BLI_addtail(shadows, shadow);
@@ -2408,6 +2413,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
 	Scene *sce_iter;
 	Base *base;
 	Object *ob;
+	SceneRenderLayer *srl = BLI_findlink(&scene->r.layers, scene->r.actlay);
 	
 	BLI_listbase_clear(&shadows);
 	
@@ -2416,7 +2422,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
 		ob = base->object;
 		
 		if (ob->type == OB_LAMP)
-			gpu_render_lamp_update(scene, v3d, ob, NULL, ob->obmat, &shadows);
+			gpu_render_lamp_update(scene, v3d, ob, NULL, ob->obmat, &shadows, srl);
 		
 		if (ob->transflag & OB_DUPLI) {
 			DupliObject *dob;
@@ -2424,7 +2430,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
 			
 			for (dob = lb->first; dob; dob = dob->next)
 				if (dob->ob->type == OB_LAMP)
-					gpu_render_lamp_update(scene, v3d, dob->ob, ob, dob->mat, &shadows);
+					gpu_render_lamp_update(scene, v3d, dob->ob, ob, dob->mat, &shadows, srl);
 			
 			free_object_duplilist(lb);
 		}
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index bc410cb..1011ac8 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -47,6 +47,7 @@ struct Image;
 struct bNode;
 struct LinkNode;
 struct Scene;
+struct SceneRenderLayer;
 struct GPUVertexAttribs;
 struct GPUNode;
 struct GPUNodeLink;
@@ -135,6 +136,7 @@ void GPU_material_free(struct Material *ma);
 
 void GPU_materials_free(void);
 
+bool GPU_lamp_override_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]);
 void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale);
 void GPU_material_unbind(GPUMaterial *material);
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 0f05a7f..4b070a4 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -58,6 +58,7 @@
 #include "BKE_node.h"
 #include "BKE_scene.h"
 #include "BKE_texture.h"
+#include "BKE_group.h"
 
 #include "IMB_imbuf_types.h"
 
@@ -259,18 +260,33 @@ void GPU_material_free(Material *ma)
 	BLI_freelistN(&ma->gpumaterial);
 }
 
+bool GPU_lamp_override_visible(GPULamp *lamp, SceneRenderLayer *srl, Material *ma)
+{
+	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);
+	else
+		return true;
+}
+
 void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4])
 {
 	if (material->pass) {
 		LinkData *nlink;
 		GPULamp *lamp;
 		GPUShader *shader = GPU_pass_shader(material->pass);
+		SceneRenderLayer *srl = BLI_findlink(&material->scene->r.layers, material->scene->r.actlay);
+
+		if (srl)
+			viewlay &= srl->lay;
 
 		/* handle layer lamps */
 		for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
 			lamp= nlink->data;
 
-			if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
+			if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))
+			    && GPU_lamp_override_visible(lamp, srl, material->ma)) {
 				lamp->dynenergy = lamp->energy;
 				copy_v3_v3(lamp->dyncol, lamp->col);
 			}




More information about the Bf-blender-cvs mailing list