Commit: 91f811cc7f36a15dd812073ebab918cb4526f1e5
Author: Julian Eisel
Date:   Fri Aug 12 02:39:40 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB91f811cc7f36a15dd812073ebab918cb4526f1e5

Add helper functions to find last and next base in object layers

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

M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/object_layer.c
M       source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index d7a3762..fcdfd91 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -323,7 +323,10 @@ void BKE_objectlayer_base_unassign(struct Base *base);
 void BKE_objectlayer_bases_unassign_all(struct LayerTreeItem *litem, const 
bool unset_base_layer);
 void BKE_objectlayer_base_entries_reserve(struct LayerTreeItem *litem, const 
unsigned int nentries_reserve);
 int  BKE_objectlayer_bases_count(const struct LayerTree *ltree);
+
 struct Base *BKE_objectlayer_base_first_find(const struct LayerTree *ltree);
+struct Base *BKE_objectlayer_base_last_find(const struct LayerTree *ltree);
+struct Base *BKE_objectlayer_base_next_find(const struct Base *prev);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/object_layer.c 
b/source/blender/blenkernel/intern/object_layer.c
index ee7f062..165cbfa 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -172,7 +172,7 @@ Base *BKE_objectlayer_base_first_find(const LayerTree 
*ltree)
        {
                if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
                        LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-                       if (oblayer->tot_bases) {
+                       if (oblayer->tot_bases > 0) {
                                return oblayer->bases[0];
                        }
                }
@@ -181,3 +181,42 @@ Base *BKE_objectlayer_base_first_find(const LayerTree 
*ltree)
 
        return NULL;
 }
+
+Base *BKE_objectlayer_base_last_find(const LayerTree *ltree)
+{
+       for (int i = ltree->tot_items - 1; i >= 0; i--) {
+               LayerTreeItem *litem = ltree->items_all[i];
+               if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
+                       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+                       if (oblayer->tot_bases > 0) {
+                               return oblayer->bases[oblayer->tot_bases - 1];
+                       }
+               }
+       }
+
+       return NULL;
+}
+
+Base *BKE_objectlayer_base_next_find(const Base *prev)
+{
+       bool found_prev = false;
+       BKE_LAYERTREE_ITER_START(prev->layer->tree, prev->layer->index, i, 
litem)
+       {
+               if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
+                       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+                       BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base_iter)
+                       {
+                               if (found_prev) {
+                                       return base_iter;
+                               }
+                               else if (base_iter == prev) {
+                                       found_prev = true;
+                               }
+                       }
+                       BKE_OBJECTLAYER_BASES_ITER_END;
+               }
+       }
+       BKE_LAYERTREE_ITER_END;
+
+       return NULL;
+}
diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index b8e0958..e19cb5b 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -574,32 +574,16 @@ static void 
rna_Scene_object_bases_begin(CollectionPropertyIterator *iter, Point
 static void rna_Scene_object_bases_next(CollectionPropertyIterator *iter)
 {
        ArrayIterator *internal = &iter->internal.array;
-       Scene *scene = (Scene *)iter->parent.data;
        Base *base = (Base *)internal->ptr;
+       Base *next = BKE_objectlayer_base_next_find(base);
 
-       bool found_startbase = false;
-       BKE_LAYERTREE_ITER_START(scene->object_layers, base->layer->index, i, 
litem)
-       {
-               if (litem->type->type == LAYER_ITEMTYPE_LAYER) {
-                       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-
-                       BKE_OBJECTLAYER_BASES_ITER_START(oblayer, j, base_iter)
-                       {
-                               if (found_startbase) {
-                                       internal->ptr = (void *)base_iter;
-                                       return;
-                               }
-                               else if (base == base_iter) {
-                                       found_startbase = true;
-                               }
-                       }
-                       BKE_OBJECTLAYER_BASES_ITER_END;
-               }
+       if (next) {
+               internal->ptr = (char *)next;
+       }
+       else {
+               /* no next base was found, tell iterator to stop. */
+               iter->valid = 0;
        }
-       BKE_LAYERTREE_ITER_END;
-
-       /* If we reach this point, no next base was found, tell iterator to 
stop. */
-       iter->valid = 0;
 }
 
 static int rna_Scene_object_bases_lookup_string(PointerRNA *ptr, const char 
*key, PointerRNA *r_ptr)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to