[Bf-blender-cvs] [d9dbd58] layers: Finish nested collections rna (recursions ftw)

Dalai Felinto noreply at git.blender.org
Wed Nov 23 14:08:28 CET 2016


Commit: d9dbd58035cb9f6690250a522d2ebc4a64c98d4c
Author: Dalai Felinto
Date:   Wed Nov 23 14:08:12 2016 +0100
Branches: layers
https://developer.blender.org/rBd9dbd58035cb9f6690250a522d2ebc4a64c98d4c

Finish nested collections rna (recursions ftw)

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 6ade94f..4039ff9 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -129,12 +129,15 @@ void BKE_scene_update_for_newframe_ex(struct EvaluationContext *eval_ctx, struct
 struct SceneLayer *BKE_scene_add_layer(struct Scene *sce, const char *name);
 bool BKE_scene_remove_layer(struct Main *main, struct Scene *scene, struct SceneLayer *sl);
 struct LayerCollection *BKE_scene_add_collection(struct SceneLayer *sl, const char *name);
-
 bool BKE_scene_remove_nested_collection(struct SceneLayer *sl, struct LayerCollection *lc_parent, struct LayerCollection *lc);
 struct SceneLayer *BKE_scene_layer_from_collection(struct Scene *scene, struct LayerCollection *lc);
 bool BKE_scene_remove_collection(struct SceneLayer *sl, struct LayerCollection *lc);
 struct LayerCollection *BKE_scene_add_nested_collection(struct SceneLayer *sl, struct LayerCollection *lc, const char *name);
 
+struct LayerCollection *BKE_scene_layer_collection_active(struct SceneLayer *sl);
+int BKE_scene_layer_collection_count(struct SceneLayer *sl);
+int BKE_scene_layer_collection_findindex(struct SceneLayer *sl, struct LayerCollection *lc);
+
 struct SceneRenderLayer *BKE_scene_add_render_layer(struct Scene *sce, const char *name);
 bool BKE_scene_remove_render_layer(struct Main *main, struct Scene *scene, struct SceneRenderLayer *srl);
 
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 21a72d1..f831931 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2034,6 +2034,72 @@ void BKE_scene_update_for_newframe_ex(EvaluationContext *eval_ctx, Main *bmain,
 #endif
 }
 
+/* Scene Layers */
+
+/* Recursively get the collection for a given index */
+static LayerCollection *collection_from_index(ListBase *lb, const int number, int *i)
+{
+	for (LayerCollection *lc = lb->first; lc; lc = lc->next) {
+		if (*i == number) {
+			return lc;
+		}
+
+		(*i)++;
+
+		LayerCollection *lc_nested = collection_from_index(&lc->collections, number, i);
+		if (lc_nested) {
+			return lc_nested;
+		}
+	}
+	return NULL;
+}
+
+LayerCollection *BKE_scene_layer_collection_active(SceneLayer *sl)
+{
+	int i = 0;
+	return collection_from_index(&sl->collections, sl->active_collection, &i);
+}
+
+/* Recursively get the count of collections */
+static int collection_count(ListBase *lb)
+{
+	int i = 0;
+	for (LayerCollection *lc = lb->first; lc; lc = lc->next) {
+		i += collection_count(&lc->collections) + 1;
+	}
+	return i;
+}
+
+int BKE_scene_layer_collection_count(SceneLayer *sl)
+{
+	return collection_count(&sl->collections);
+}
+
+/* Recursively get the index for a given collection */
+static int index_from_collection(ListBase *lb, LayerCollection *lc, int *i)
+{
+	for (LayerCollection *lcol = lb->first; lcol; lcol = lcol->next) {
+		if (lcol == lc) {
+			return *i;
+		}
+
+		(*i)++;
+
+		int i_nested = index_from_collection(&lcol->collections, lc, i);
+		if (i_nested != -1) {
+			return i_nested;
+		}
+	}
+	return -1;
+}
+
+/* return -1 */
+int BKE_scene_layer_collection_findindex(SceneLayer *sl, LayerCollection *lc)
+{
+	int i = 0;
+	return index_from_collection(&sl->collections, lc, &i);
+}
+
 /* Recursively check if collection is inside the collection ListBase */
 static bool collection_in_collections(ListBase *lb, LayerCollection *lc)
 {
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 74e8658..f9dc013 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1368,44 +1368,37 @@ static void rna_LayerNestedCollection_remove(
 
 static int rna_Layer_active_collection_index_get(PointerRNA *ptr)
 {
-	/* TODO account for nested collections */
 	SceneLayer *sl = (SceneLayer *)ptr->data;
 	return sl->active_collection;
 }
 
 static void rna_Layer_active_collection_index_set(PointerRNA *ptr, int value)
 {
-	/* TODO account for nested collections */
 	SceneLayer *sl = (SceneLayer *)ptr->data;
-	int num_collections = BLI_listbase_count(&sl->collections);
+	int num_collections = BKE_scene_layer_collection_count(sl);
 	sl->active_collection = min_ff(value, num_collections - 1);
 }
 
 static void rna_Layer_active_collection_index_range(
         PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
 {
-	/* TODO account for nested collections */
 	SceneLayer *sl = (SceneLayer *)ptr->data;
-
 	*min = 0;
-	*max = max_ii(0, BLI_listbase_count(&sl->collections) - 1);
+	*max = max_ii(0, BKE_scene_layer_collection_count(sl) - 1);
 }
 
 static PointerRNA rna_Layer_active_collection_get(PointerRNA *ptr)
 {
-	/* TODO account for nested collections */
 	SceneLayer *sl = (SceneLayer *)ptr->data;
-	LayerCollection *lc = BLI_findlink(&sl->collections, sl->active_collection);
-
+	LayerCollection *lc = BKE_scene_layer_collection_active(sl);
 	return rna_pointer_inherit_refine(ptr, &RNA_LayerCollection, lc);
 }
 
 static void rna_Layer_active_collection_set(PointerRNA *ptr, PointerRNA value)
 {
-	/* TODO account for nested collections */
 	SceneLayer *sl = (SceneLayer *)ptr->data;
 	LayerCollection *lc = (LayerCollection *)value.data;
-	const int index = BLI_findindex(&sl->collections, lc);
+	const int index = BKE_scene_layer_collection_findindex(sl, lc);
 	if (index != -1) sl->active_collection = index;
 }




More information about the Bf-blender-cvs mailing list