Commit: 68290777e2339fdf2d09fe21742d6c00549afa82
Author: Julian Eisel
Date:   Wed Aug 10 20:20:42 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB68290777e2339fdf2d09fe21742d6c00549afa82

Depsgraph: Use new layer based iterator

Support for early-breaking iterator was needed here, which I had to add in a 
rather ugly way.

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

M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/anim.c
M       source/blender/blenkernel/intern/object.c
M       source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc

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

diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index da22686..60e12bc 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -279,9 +279,12 @@ bool BKE_object_modifier_update_subframe(struct Scene 
*scene, struct Object *ob,
 
 /* Use this if BKE_BASES_ITER_START doesn't give enough control over variable 
names.
  * Doesn't do layer visibility-bit check, even with skip_hidden is true. */
-#define BKE_BASES_ITER_START_EX(scene, layeridx_name, litem_name, 
oblayer_name, baseidx_name, base_name, skip_hidden) \
+#define BKE_BASES_ITER_START_EX( \
+    scene, layeridx_name, litem_name, oblayer_name, \
+    baseidx_name, base_name, break_layiter_name, skip_hidden) \
        BKE_LAYERTREE_ITER_START(scene->object_layers, 0, layeridx_name, 
litem_name) \
        { \
+               bool break_layiter_name = false; \
                if ((litem_name->type->type == LAYER_ITEMTYPE_LAYER) && \
                    (!skip_hidden || BKE_layeritem_is_visible(litem))) \
                { \
@@ -289,23 +292,26 @@ bool BKE_object_modifier_update_subframe(struct Scene 
*scene, struct Object *ob,
                        BKE_OBJECTLAYER_BASES_ITER_START(oblayer_name, 
baseidx_name, base_name) \
                                if (skip_hidden && 
(base_name->object->restrictflag & OB_RESTRICT_VIEW)) \
                                        continue;
+/* End BKE_BASES_ITER_ */
+#define BKE_BASES_ITER_END_EX(break_layiter_name) \
+                       BKE_OBJECTLAYER_BASES_ITER_END; \
+               } \
+               if (break_layiter_name) \
+                       break; \
+       } \
+       BKE_LAYERTREE_ITER_END /* ends with (void)0 */
 
 /* Start iterating over all bases of the scene, ignoring visibility. This is 
basically a wrapper around
  * layer tree and object layer iterator to make access a bit easier. Uses 
default variable names. */
 #define BKE_BASES_ITER_START(scene) \
-       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, false)
+       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, 
break_layiter, false)
 
 /* Version of BKE_BASES_ITER_START that skips invisible layers and
  * invisible objects. Doesn't do layer visibility-bit check.*/
 #define BKE_BASES_ITER_VISIBLE_START(scene) \
-       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, true)
+       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, 
break_layiter, true)
 
-/* End BKE_BASES_ITER_ */
-#define BKE_BASES_ITER_END \
-                       BKE_OBJECTLAYER_BASES_ITER_END; \
-               } \
-       } \
-       BKE_LAYERTREE_ITER_END /* ends with (void)0 */
+#define BKE_BASES_ITER_END BKE_BASES_ITER_END_EX(break_layiter)
 
 struct LayerTreeItem *BKE_objectlayer_add(struct LayerTree *tree, struct 
LayerTreeItem *parent, const char *name);
 void BKE_objectlayer_free(struct LayerTreeItem *litem);
diff --git a/source/blender/blenkernel/intern/anim.c 
b/source/blender/blenkernel/intern/anim.c
index c469c3e..6de3845 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -284,21 +284,19 @@ static void motionpaths_calc_optimise_depsgraph(Scene 
*scene, ListBase *targets)
        BKE_BASES_ITER_END;
        
        /* for each target, dump its object to the start of the list if it 
wasn't moved already */
-       Base *base, *baseNext;
        for (MPathTarget *mpt = targets->first; mpt; mpt = mpt->next) {
-               for (base = scene->base.first; base; base = baseNext) {
-                       baseNext = base->next;
-                       
+               BKE_BASES_ITER_START(scene)
+               {
                        if ((base->object == mpt->ob) && !(mpt->ob->flag & 
BA_TEMP_TAG)) {
-                               BLI_remlink(&scene->base, base);
-                               BLI_addhead(&scene->base, base);
-                               
+                               BKE_layeritem_move(litem, 0, true);
                                mpt->ob->flag |= BA_TEMP_TAG;
                                
                                /* we really don't need to continue anymore 
once this happens, but this line might really 'break' */
+                               break_layiter = true;
                                break;
                        }
                }
+               BKE_BASES_ITER_END;
        }
        
        /* "brew me a list that's sorted a bit faster now depsy" */
diff --git a/source/blender/blenkernel/intern/object.c 
b/source/blender/blenkernel/intern/object.c
index 54a751b..5d3aa7b 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3425,7 +3425,8 @@ LinkNode *BKE_object_relational_superset(struct Scene 
*scene, eObjectSet objectS
                                /* child relationship */
                                if (includeFilter & (OB_REL_CHILDREN | 
OB_REL_CHILDREN_RECURSIVE)) {
                                        /* FIXME O(n^2) */
-                                       BKE_BASES_ITER_START_EX(scene, k, 
local_litem, local_oblayer, l, local_base, true)
+                                       BKE_BASES_ITER_START_EX(scene, k, 
local_litem, local_oblayer, l,
+                                                               local_base, 
local_break_layiter, true)
                                        {
                                                if 
(BASE_EDITABLE_BGMODE(((View3D *)NULL), scene, local_base)) {
                                                        Object *child = 
local_base->object;
@@ -3438,7 +3439,7 @@ LinkNode *BKE_object_relational_superset(struct Scene 
*scene, eObjectSet objectS
                                                        }
                                                }
                                        }
-                                       BKE_BASES_ITER_END;
+                                       
BKE_BASES_ITER_END_EX(local_break_layiter);
                                }
 
 
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 1812384..d3968a1 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -78,6 +78,7 @@ extern "C" {
 #include "BKE_group.h"
 #include "BKE_key.h"
 #include "BKE_lattice.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
@@ -294,7 +295,8 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene 
*scene)
        }
 
        /* scene objects */
-       for (Base *base = (Base *)scene->base.first; base; base = base->next) {
+       BKE_BASES_ITER_START(scene)
+       {
                Object *ob = base->object;
 
                /* object itself */
@@ -312,6 +314,7 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene 
*scene)
                        build_group(scene, base, ob->dup_group);
                }
        }
+       BKE_BASES_ITER_END;
 
        /* rigidbody */
        if (scene->rigidbody_world) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 9ab2833..8bda5a4 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -75,6 +75,7 @@ extern "C" {
 #include "BKE_fcurve.h"
 #include "BKE_group.h"
 #include "BKE_key.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
@@ -264,7 +265,8 @@ void DepsgraphRelationBuilder::build_scene(Main *bmain, 
Scene *scene)
        }
 
        /* scene objects */
-       for (Base *base = (Base *)scene->base.first; base; base = base->next) {
+       BKE_BASES_ITER_START(scene)
+       {
                Object *ob = base->object;
 
                /* object itself */
@@ -287,6 +289,7 @@ void DepsgraphRelationBuilder::build_scene(Main *bmain, 
Scene *scene)
                        build_group(bmain, scene, ob, ob->dup_group);
                }
        }
+       BKE_BASES_ITER_END;
 
        /* rigidbody */
        if (scene->rigidbody_world) {

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

Reply via email to