[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