[Bf-blender-cvs] [f5055d8] master: Some operation allowed to set invalid active scene render layer

Sergey Sharybin noreply at git.blender.org
Fri May 23 18:32:41 CEST 2014


Commit: f5055d86887a2c139080f26ab0ba9a00cf077ef6
Author: Sergey Sharybin
Date:   Fri May 23 18:30:36 2014 +0200
https://developer.blender.org/rBf5055d86887a2c139080f26ab0ba9a00cf077ef6

Some operation allowed to set invalid active scene render layer

Forbid this now and do tricks in the versioning code to repair
corrupted files.

Thanks to Pablo, Caminandes and Koro for discovering this bug!

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

M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/space_node/node_edit.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 7e058ae..00fcd2d 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -288,4 +288,12 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 			linestyle->texstep = 1.0;
 		}
 	}
+
+	{
+		Scene *scene;
+		for (scene = main->scene.first; scene; scene = scene->id.next) {
+			int num_layers = BLI_countlist(&scene->r.layers);
+			scene->r.actlay = min_ff(scene->r.actlay, num_layers - 1);
+		}
+	}
 }
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index fc0c82f..5bbe0c1 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -695,7 +695,12 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
 				for (scene = bmain->scene.first; scene; scene = scene->id.next) {
 					if (scene->nodetree && scene->use_nodes && ntreeHasTree(scene->nodetree, ntree)) {
 						if (node->id == NULL || node->id == (ID *)scene) {
+							int num_layers = BLI_countlist(&scene->r.layers);
 							scene->r.actlay = node->custom1;
+							/* Clamp the value, because it might have come from a different
+							 * scene which could have more render layers than new one.
+							 */
+							scene->r.actlay = min_ff(scene->r.actlay, num_layers - 1);
 						}
 					}
 				}
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 82dae1d..8283490 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1059,7 +1059,8 @@ static int rna_RenderSettings_active_layer_index_get(PointerRNA *ptr)
 static void rna_RenderSettings_active_layer_index_set(PointerRNA *ptr, int value)
 {
 	RenderData *rd = (RenderData *)ptr->data;
-	rd->actlay = value;
+	int num_layers = BLI_countlist(&rd->layers);
+	rd->actlay = min_ff(value, num_layers - 1);
 }
 
 static void rna_RenderSettings_active_layer_index_range(PointerRNA *ptr, int *min, int *max,




More information about the Bf-blender-cvs mailing list