[Bf-blender-cvs] [99cc297] soc-2016-layer_manager: Refactor base iterators to be much simpler

Julian Eisel noreply at git.blender.org
Fri Aug 12 15:34:31 CEST 2016


Commit: 99cc2972717ead7848cafc322fa76cd4301faa4f
Author: Julian Eisel
Date:   Fri Aug 12 15:28:39 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB99cc2972717ead7848cafc322fa76cd4301faa4f

Refactor base iterators to be much simpler

Make use of the new BKE_objectlayer_base_first_find and BKE_objectlayer_base_next_find functions, instead of doing some cryptic, nested loop stuff.

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/anim.c
M	source/blender/blenkernel/intern/depsgraph.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/library_query.c
M	source/blender/blenkernel/intern/library_remap.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/object_dupli.c
M	source/blender/blenkernel/intern/object_layer.c
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/collada/EffectExporter.cpp
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/editors/animation/anim_channels_edit.c
M	source/blender/editors/animation/anim_filter.c
M	source/blender/editors/armature/editarmature_sketch.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_relations.c
M	source/blender/editors/object/object_select.c
M	source/blender/editors/object/object_vgroup.c
M	source/blender/editors/physics/physics_pointcache.c
M	source/blender/editors/render/render_preview.c
M	source/blender/editors/screen/screen_context.c
M	source/blender/editors/space_clip/tracking_ops_orient.c
M	source/blender/editors/space_info/info_stats.c
M	source/blender/editors/space_layers/layers_ops.c
M	source/blender/editors/space_logic/logic_window.c
M	source/blender/editors/space_nla/nla_channels.c
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/editors/space_outliner/outliner_tree.c
M	source/blender/editors/space_time/space_time.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/editors/transform/transform_orientations.c
M	source/blender/editors/transform/transform_snap_object.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/makesrna/intern/rna_object_force.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/modifiers/intern/MOD_cloth.c
M	source/blender/modifiers/intern/MOD_dynamicpaint.c
M	source/blender/modifiers/intern/MOD_fluidsim.c
M	source/blender/modifiers/intern/MOD_smoke.c
M	source/blender/render/intern/source/envmap.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index fcdfd91..2b940bf 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -277,41 +277,27 @@ bool BKE_object_modifier_update_subframe(struct Scene *scene, struct Object *ob,
 		Base *base_name = oblayer->bases[idx_name];
 #define BKE_OBJECTLAYER_BASES_ITER_END } (void)0
 
-/* 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, break_layiter_name, skip_hidden) \
-	BKE_LAYERTREE_ITER_START(scene->object_layers, 0, layeridx_name, litem_name) \
+#define BKE_BASES_ITER_START_EX(scene, base_name, skip_hidden) \
+	for (Base *base_name = BKE_objectlayer_base_first_find(scene->object_layers), *base_name##_next; \
+	     base_name != NULL; \
+	     base_name = base_name##_next) \
 	{ \
-		bool break_layiter_name = false; \
-		if ((litem_name->type->type == LAYER_ITEMTYPE_LAYER) && \
-		    (!skip_hidden || BKE_layeritem_is_visible(litem_name))) \
-		{ \
-			LayerTypeObject *oblayer_name = (LayerTypeObject *)litem_name; \
-			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, break_layiter, false)
+		/* store next base here to allow removing base_name */ \
+		base_name##_next = BKE_objectlayer_base_next_find(base_name, skip_hidden); \
+		if (skip_hidden && (base_name->object->restrictflag & OB_RESTRICT_VIEW)) \
+			continue;
+
+/* Start iterating over all bases of the scene, ignoring visibility. */
+#define BKE_BASES_ITER_START(scene, base_name) \
+	BKE_BASES_ITER_START_EX(scene, base_name, 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, break_layiter, true)
+#define BKE_BASES_ITER_VISIBLE_START(scene, base_name) \
+	BKE_BASES_ITER_START_EX(scene, base_name, true)
 
-#define BKE_BASES_ITER_END BKE_BASES_ITER_END_EX(break_layiter)
+#define BKE_BASES_ITER_END \
+	} (void)0
 
 struct LayerTreeItem *BKE_objectlayer_add(struct LayerTree *tree, struct LayerTreeItem *parent, const char *name);
 void BKE_objectlayer_free(struct LayerTreeItem *litem);
@@ -326,7 +312,7 @@ 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);
+struct Base *BKE_objectlayer_base_next_find(const struct Base *prev, const bool skip_hidden_layers);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 6de3845..5e87de7 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -277,7 +277,7 @@ void animviz_get_object_motionpaths(Object *ob, ListBase *targets)
 static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets)
 {
 	/* make sure our temp-tag isn't already in use */
-	BKE_BASES_ITER_START(scene)
+	BKE_BASES_ITER_START(scene, base)
 	{
 		base->object->flag &= ~BA_TEMP_TAG;
 	}
@@ -285,14 +285,13 @@ static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets)
 	
 	/* for each target, dump its object to the start of the list if it wasn't moved already */
 	for (MPathTarget *mpt = targets->first; mpt; mpt = mpt->next) {
-		BKE_BASES_ITER_START(scene)
+		BKE_BASES_ITER_START(scene, base)
 		{
 			if ((base->object == mpt->ob) && !(mpt->ob->flag & BA_TEMP_TAG)) {
-				BKE_layeritem_move(litem, 0, true);
+				BKE_layeritem_move(base->layer, 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;
 			}
 		}
@@ -322,7 +321,7 @@ static void motionpaths_calc_update_scene(Scene *scene)
 		 * - all those afterwards are assumed to not be relevant for our calculations
 		 */
 		/* optimize further by moving out... */
-		BKE_BASES_ITER_START(scene)
+		BKE_BASES_ITER_START(scene, base)
 		{
 			if (base->object->flag & BA_TEMP_TAG)
 				last = base;
@@ -332,7 +331,7 @@ static void motionpaths_calc_update_scene(Scene *scene)
 		/* perform updates for tagged objects */
 		/* XXX: this will break if rigs depend on scene or other data that
 		 * is animated but not attached to/updatable from objects */
-		BKE_BASES_ITER_START(scene)
+		BKE_BASES_ITER_START(scene, base)
 		{
 			/* update this object */
 			BKE_object_handle_update(G.main->eval_ctx, scene, base->object);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 1a861af..75810e9 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -487,7 +487,7 @@ static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Objec
 
 	/* would be nice to have a list of colliders here
 	 * so for now walk all objects in scene check 'same layer rule' */
-	BKE_BASES_ITER_VISIBLE_START(scene)
+	BKE_BASES_ITER_VISIBLE_START(scene, base)
 	{
 		if ((base->lay & ob->lay)) {
 			Object *ob1 = base->object;
@@ -951,7 +951,7 @@ DagForest *build_dag(Main *bmain, Scene *sce, short mask)
 	scenenode = dag_add_node(dag, sce);
 	
 	/* add current scene objects */
-	BKE_BASES_ITER_START(sce)
+	BKE_BASES_ITER_START(sce, base)
 	{
 		ob = base->object;
 		ob->id.tag |= LIB_TAG_DOIT;
@@ -1445,7 +1445,7 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
 		ob->id.tag &= ~LIB_TAG_DOIT;
 		ob->id.newid = NULL; /* newid abuse for GroupObject */
 	}
-	BKE_BASES_ITER_START(sce)
+	BKE_BASES_ITER_START(sce, base)
 	{
 		base->object->id.tag |= LIB_TAG_DOIT;
 	}
@@ -1464,7 +1464,7 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
 				go->ob->id.newid = (ID *)go;
 			
 			/* in order of sorted bases we reinsert group objects */
-			BKE_BASES_ITER_START(sce)
+			BKE_BASES_ITER_START(sce, base)
 			{
 				if (base->object->id.newid) {
 					go = (GroupObject *)base->object->id.newid;
@@ -1704,7 +1704,7 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 	
 	if (G.debug & G_DEBUG) {
 		printf("\nordered\n");
-		BKE_BASES_ITER_START(sce)
+		BKE_BASES_ITER_START(sce, base)
 		{
 			printf(" %s\n", base->object->id.name);
 		}
@@ -1959,7 +1959,7 @@ static void dag_scene_flush_layers(Scene *sce, int lay)
 	lasttime = sce->theDag->time;
 
 	/* update layer flags in nodes */
-	BKE_BASES_ITER_START(sce)
+	BKE_BASES_ITER_START(sce, base)
 	{
 		node = dag_get_node(sce->theDag, base->object);
 		node->scelay = base->object->lay;
@@ -2000,7 +2000,7 @@ static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
 		bNode *node;
 		unsigned int lay_changed = 0;
 
-		BKE_BASES_ITER_VISIBLE_START(sce)
+		BKE_BASES_ITER_VISIBLE_START(sce, base)
 		{
 			if (base->lay & lay)
 				if (base->object->recalc)
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 36046f6..e925976 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -226,7 +226,7 @@ ListBase *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *psys_src
 		}
 	}
 	else {
-		BKE_BASES_ITER_START(scene)
+		BKE_BASES_ITER_START(scene, base)
 		{
 			if ( (base->lay & layer) ) {
 				if ( base->object->pd && base->object->pd->forcefield )
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index 70c165d..7711854 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -374,7 +374,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
 
 				CALLBACK_INVOKE(scene->gpd, IDWALK_USER);
 
-				BKE_BASES_ITER_START(scene)
+				BKE_BASES_ITER_START(scene, base)
 				{
 					CALLBACK_INVOKE(base->object, IDWALK_USER);
 				}
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index dc4621e..850ff98 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -266,7 +266,7 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data)
 				/* In case we are unlinking... */
 				if (!r_id_remap_data->old_id) {
 					/* ... everything from scene. */
-					BKE_BASES_ITER_START(sce)
+					BKE_BASES_ITER_START(sce, base)
 					{
 						libblock_remap_data_preprocess_scene_base_unlink(
 						            r_id_remap_data, sce, base, skip_indirect, is_indirect);
@@ -336,7 +336,7 @@ static void libblock_remap_data_postprocess_group_scene_unlink(Main *UNUSED(bmai
 {
 	/* Note that here we assume no object has no base (i.e. all objects are assumed instanced
 	 * in one scene...). */
-	BKE_BASES_ITER_START(sce)
+	BKE_BASES_ITER_START(sce, base)
 	{
 		if (base->flag & OB_FROMGROUP) {
 			Object *ob = base->object;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index afb3f6f..466f23b 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -154,7 +154,7 @@ void BKE_object_workob_clear(Object *workob)
 
 void 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list