[Bf-blender-cvs] [a796cbf] temp_localview_split: Make Cycles work with new local view

Julian Eisel noreply at git.blender.org
Tue Aug 9 21:13:15 CEST 2016


Commit: a796cbf3072f0084e886e1b48abdff1a30d26aaa
Author: Julian Eisel
Date:   Tue Aug 9 21:12:23 2016 +0200
Branches: temp_localview_split
https://developer.blender.org/rBa796cbf3072f0084e886e1b48abdff1a30d26aaa

Make Cycles work with new local view

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

M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_sync.h
M	intern/cycles/blender/blender_util.h
M	source/blender/makesrna/intern/rna_screen.c

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

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index f305e8e..0ab3843 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -533,6 +533,8 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, float motion_time)
 {
 	/* layer data */
 	uint scene_layer = render_layer.scene_layer;
+	const bool is_localview = render_layer.localview != 0;
+	uint scene_localview = is_localview ? render_layer.localview : -1;
 	bool motion = motion_time != 0.0f;
 	
 	if(!motion) {
@@ -571,20 +573,16 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, float motion_time)
 	bool cancel = false;
 	bool use_portal = false;
 
-	uint layer_override = get_layer(b_engine.layer_override());
 	for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
-		/* Render layer's scene_layer is affected by local view already,
-		 * which is not a desired behavior here.
-		 */
-		uint scene_layers = layer_override ? layer_override : get_layer(b_scene.layers());
 		for(b_sce.object_bases.begin(b_base); b_base != b_sce.object_bases.end() && !cancel; ++b_base) {
 			BL::Object b_ob = b_base->object();
 			bool hide = (render_layer.use_viewport_visibility)? b_ob.hide(): b_ob.hide_render();
-			uint ob_layer = get_layer(b_base->layers(),
-			                          b_base->layers_local_view(),
-			                          object_is_light(b_ob),
-			                          scene_layers);
-			hide = hide || !(ob_layer & scene_layer);
+			uint ob_layer = get_layer(b_base->layers());
+			/* use -1 to ignore local view if we're not in a local view or if object is a
+			 * light (only check layer bits then, like Blender Internal and viewport) */
+			uint ob_localview = (is_localview && !object_is_light(b_ob)) ?
+			                        get_localview(b_ob.layers_local_view().viewbits()) : -1;
+			hide = hide || !(ob_layer & scene_layer) || !(ob_localview & scene_localview);
 
 			if(!hide) {
 				progress.set_sync_status("Synchronizing object", b_ob.name());
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index e7e57b2..7a4b260 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -375,7 +375,7 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D& b_v3d, const char *layer)
 			layer = layername.c_str();
 		}
 		else {
-			render_layer.scene_layer = get_layer(b_v3d.layers(), b_v3d.layers_local_view());
+			render_layer.scene_layer = get_layer(b_v3d.layers());
 			render_layer.layer = render_layer.scene_layer;
 			render_layer.exclude_layer = 0;
 			render_layer.holdout_layer = 0;
@@ -387,6 +387,11 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D& b_v3d, const char *layer)
 			render_layer.use_viewport_visibility = true;
 			render_layer.samples = 0;
 			render_layer.bound_samples = false;
+
+			BL::LocalViewAreaData localview_data = b_v3d.local_view();
+			if (localview_data) {
+				render_layer.localview = get_localview(localview_data.info().viewbits());
+			}
 			return;
 		}
 	}
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index b8b9597..998211a 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -179,7 +179,7 @@ private:
 
 	struct RenderLayerInfo {
 		RenderLayerInfo()
-		: scene_layer(0), layer(0),
+		: scene_layer(0), layer(0), localview(0),
 		  holdout_layer(0), exclude_layer(0),
 		  material_override(PointerRNA_NULL),
 		  use_background_shader(true),
@@ -193,6 +193,7 @@ private:
 		string name;
 		uint scene_layer;
 		uint layer;
+		uint localview;
 		uint holdout_layer;
 		uint exclude_layer;
 		BL::Material material_override;
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index d5dbaba..ea5b09f 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -299,33 +299,17 @@ static inline uint get_layer(const BL::Array<int, 20>& array)
 	return layer;
 }
 
-static inline uint get_layer(const BL::Array<int, 20>& array,
-                             const BL::Array<int, 8>& local_array,
-                             bool is_light = false,
-                             uint scene_layers = (1 << 20) - 1)
+static inline uint get_localview(const BL::Array<int, 32>& array)
 {
-	uint layer = 0;
-
-	for(uint i = 0; i < 20; i++)
-		if(array[i])
-			layer |= (1 << i);
+	uint localview = 0;
 
-	if(is_light) {
-		/* Consider light is visible if it was visible without layer
-		 * override, which matches behavior of Blender Internal.
-		 */
-		if(layer & scene_layers) {
-			for(uint i = 0; i < 8; i++)
-				layer |= (1 << (20+i));
+	for(uint i = 0; i < 32; i++) {
+		if(array[i]) {
+			localview |= (1 << i);
 		}
 	}
-	else {
-		for(uint i = 0; i < 8; i++)
-			if(local_array[i])
-				layer |= (1 << (20+i));
-	}
 
-	return layer;
+	return localview;
 }
 
 static inline float3 get_float3(PointerRNA& ptr, const char *name)
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index df17226..5344857 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -200,6 +200,7 @@ static void rna_def_localview_info(BlenderRNA *brna)
 	RNA_def_struct_ui_text(srna, "Local View Info", "");
 
 	prop = RNA_def_property(srna, "viewbits", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+	RNA_def_property_boolean_sdna(prop, NULL, "viewbits", 1);
 	RNA_def_property_array(prop, 32);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Local View Layers", "");




More information about the Bf-blender-cvs mailing list