[Bf-blender-cvs] [cbfdf64] soc-2016-layer_manager: Work towards deprecating Scene.base

Julian Eisel noreply at git.blender.org
Thu Aug 11 04:34:51 CEST 2016


Commit: cbfdf644679365c7744e1ae826e08eb18fb74252
Author: Julian Eisel
Date:   Thu Aug 11 04:32:15 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBcbfdf644679365c7744e1ae826e08eb18fb74252

Work towards deprecating Scene.base

Disabled depsgraph base sorting for now, need to check how this will be handled in future.
Realize base iterators definitely need to be improved to work for corner cases :S

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/depsgraph.c
M	source/blender/blenkernel/intern/dynamicpaint.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_layer.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_270.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/space_layers/layers_ops.c
M	source/blender/editors/space_logic/logic_window.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/editors/space_time/space_time.c
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_object_force.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 4198d5f..c964002 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -53,6 +53,7 @@ typedef enum eLayerTree_Type {
 } eLayerTree_Type;
 
 LayerTree *BKE_layertree_new(const eLayerTree_Type type);
+//LayerTree *BKE_layertree_copy(const LayerTree *oldtree); /* TODO */
 void BKE_layertree_delete(LayerTree *ltree);
 
 bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata, const bool inverse);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 60e12bc..d1992b9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -280,8 +280,8 @@ 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, break_layiter_name, skip_hidden) \
+	    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; \
@@ -315,10 +315,15 @@ bool BKE_object_modifier_update_subframe(struct Scene *scene, struct Object *ob,
 
 struct LayerTreeItem *BKE_objectlayer_add(struct LayerTree *tree, struct LayerTreeItem *parent, const char *name);
 void BKE_objectlayer_free(struct LayerTreeItem *litem);
-void BKE_objectlayer_base_assign(struct Base *base, struct LayerTreeItem *litem, const bool has_reserved);
+void BKE_objectlayer_base_assign_ex(
+        struct Base *base, struct LayerTreeItem *litem,
+        const bool has_reserved, const bool add_head);
+void BKE_objectlayer_base_assign(struct Base *base, struct LayerTreeItem *litem);
 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);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 45a23c3..1a861af 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -70,6 +70,7 @@
 #include "BKE_idcode.h"
 #include "BKE_image.h"
 #include "BKE_key.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
@@ -463,7 +464,6 @@ static void check_and_create_collision_relation(DagForest *dag, Object *ob, DagN
 
 static void dag_add_collision_field_relation(DagForest *dag, Scene *scene, Object *ob, DagNode *node, int skip_forcefield, bool no_collision)
 {
-	Base *base;
 	ParticleSystem *particle_system;
 
 	for (particle_system = ob->particlesystem.first;
@@ -487,12 +487,14 @@ 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' */
-	for (base = scene->base.first; base; base = base->next) {
+	BKE_BASES_ITER_VISIBLE_START(scene)
+	{
 		if ((base->lay & ob->lay)) {
 			Object *ob1 = base->object;
 			check_and_create_collision_relation(dag, ob, node, ob1, skip_forcefield, no_collision);
 		}
 	}
+	BKE_BASES_ITER_END;
 }
 
 static void build_dag_object(DagForest *dag, DagNode *scenenode, Main *bmain, Scene *scene, Object *ob, int mask)
@@ -923,7 +925,6 @@ static void build_dag_group(DagForest *dag, DagNode *scenenode, Main *bmain, Sce
 
 DagForest *build_dag(Main *bmain, Scene *sce, short mask)
 {
-	Base *base;
 	Object *ob;
 	DagNode *node;
 	DagNode *scenenode;
@@ -950,7 +951,8 @@ DagForest *build_dag(Main *bmain, Scene *sce, short mask)
 	scenenode = dag_add_node(dag, sce);
 	
 	/* add current scene objects */
-	for (base = sce->base.first; base; base = base->next) {
+	BKE_BASES_ITER_START(sce)
+	{
 		ob = base->object;
 		ob->id.tag |= LIB_TAG_DOIT;
 		build_dag_object(dag, scenenode, bmain, sce, ob, mask);
@@ -959,6 +961,7 @@ DagForest *build_dag(Main *bmain, Scene *sce, short mask)
 		if (ob->dup_group) 
 			build_dag_group(dag, scenenode, bmain, sce, ob->dup_group, mask);
 	}
+	BKE_BASES_ITER_END;
 
 	/* There might be situations when object from current scene depends on
 	 * objects form other scene AND objects from other scene has own
@@ -1433,7 +1436,6 @@ static void dag_editors_scene_update(Main *bmain, Scene *scene, int updated)
 /* groups with objects in this scene need to be put in the right order as well */
 static void scene_sort_groups(Main *bmain, Scene *sce)
 {
-	Base *base;
 	Group *group;
 	GroupObject *go;
 	Object *ob;
@@ -1443,9 +1445,12 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
 		ob->id.tag &= ~LIB_TAG_DOIT;
 		ob->id.newid = NULL; /* newid abuse for GroupObject */
 	}
-	for (base = sce->base.first; base; base = base->next)
+	BKE_BASES_ITER_START(sce)
+	{
 		base->object->id.tag |= LIB_TAG_DOIT;
-	
+	}
+	BKE_BASES_ITER_END;
+
 	for (group = bmain->group.first; group; group = group->id.next) {
 		for (go = group->gobject.first; go; go = go->next) {
 			if ((go->ob->id.tag & LIB_TAG_DOIT) == 0)
@@ -1459,8 +1464,8 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
 				go->ob->id.newid = (ID *)go;
 			
 			/* in order of sorted bases we reinsert group objects */
-			for (base = sce->base.first; base; base = base->next) {
-				
+			BKE_BASES_ITER_START(sce)
+			{
 				if (base->object->id.newid) {
 					go = (GroupObject *)base->object->id.newid;
 					base->object->id.newid = NULL;
@@ -1468,6 +1473,7 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
 					BLI_addtail(&listb, go);
 				}
 			}
+			BKE_BASES_ITER_END;
 			/* copy the newly sorted listbase */
 			group->gobject = listb;
 		}
@@ -1618,7 +1624,6 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 	int time;
 	int skip = 0;
 	ListBase tempbase;
-	Base *base;
 
 	BLI_listbase_clear(&tempbase);
 
@@ -1666,6 +1671,7 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 				node->color = DAG_BLACK;
 				
 				time++;
+#if 0
 				base = sce->base.first;
 				while (base && base->object != node->ob)
 					base = base->next;
@@ -1673,10 +1679,12 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 					BLI_remlink(&sce->base, base);
 					BLI_addhead(&tempbase, base);
 				}
+#endif
 			}
 		}
 	}
-	
+
+#if 0
 	/* temporal correction for circular dependencies */
 	base = sce->base.first;
 	while (base) {
@@ -1688,6 +1696,7 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 	}
 	
 	sce->base = tempbase;
+#endif
 	queue_delete(nqueue);
 	
 	/* all groups with objects in this scene gets resorted too */
@@ -1695,9 +1704,11 @@ static void dag_scene_build(Main *bmain, Scene *sce)
 	
 	if (G.debug & G_DEBUG) {
 		printf("\nordered\n");
-		for (base = sce->base.first; base; base = base->next) {
+		BKE_BASES_ITER_START(sce)
+		{
 			printf(" %s\n", base->object->id.name);
 		}
+		BKE_BASES_ITER_END;
 	}
 
 	/* Make sure that new dependencies which came from invisible layers
@@ -1937,7 +1948,6 @@ static void dag_scene_flush_layers(Scene *sce, int lay)
 {
 	DagNode *node, *firstnode;
 	DagAdjList *itA;
-	Base *base;
 	int lasttime;
 
 	firstnode = sce->theDag->DagNode.first;  /* always scene node */
@@ -1949,10 +1959,12 @@ static void dag_scene_flush_layers(Scene *sce, int lay)
 	lasttime = sce->theDag->time;
 
 	/* update layer flags in nodes */
-	for (base = sce->base.first; base; base = base->next) {
+	BKE_BASES_ITER_START(sce)
+	{
 		node = dag_get_node(sce->theDag, base->object);
 		node->scelay = base->object->lay;
 	}
+	BKE_BASES_ITER_END;
 
 	/* ensure cameras are set as if they are on a visible layer, because
 	 * they ared still used for rendering or setting the camera view
@@ -1986,14 +1998,16 @@ static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
 {
 	if (sce->nodetree) {
 		bNode *node;
-		Base *base;
 		unsigned int lay_changed = 0;
-		
-		for (base = sce->base.first; base; base = base->next)
+
+		BKE_BASES_ITER_VISIBLE_START(sce)
+		{
 			if (base->lay & lay)
 				if (base->object->recalc)
 					lay_changed |= base->lay;
-			
+		}
+		BKE_BASES_ITER_END;
+
 		for (node = sce->nodetree->nodes.first; node; node = node->next) {
 			if (node->id == (ID *)sce) {
 				SceneRenderLayer *srl = BLI_findlink(&sce->r.layers, node->custom1);
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index d35de6f..d63dc03 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -490,7 +490,7 @@ static int surface_getBrushFlags(DynamicPaintSurface *surface, const Scene *scen
 	if (surface->brush_group)
 		go = surface->brush_group->gobject.first;
 	else
-		base = scene->base.first;
+		base = BKE_objectlayer_base_first_find(scene->object_layers);
 
 	while (base || go) {
 		brushObj = NULL;
@@ -5448,7 +5448,7 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su
 		if (surface->brush_group)
 			go = surface->brush_group->gobject.first;
 		else
-			base = scene->base.first;
+			base = BKE_objectlayer_base_first_find(scene->object_layers);
 
 		while (base || go) {
 			brushObj = NULL;
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index cb86433..70c165d 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -70,10 +70,12 @@
 #include "BKE_animsys.h"
 #include "BKE_constraint.h"
 #include "BKE_fcurve.h"
+#include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
 #include "BKE_main.h"
 #include "BKE_modifier.h"
+#include

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list