[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54727] trunk/blender/source/blender: Dependency Graph: some refactoring which should have no user visible impact

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Feb 21 20:33:04 CET 2013


Revision: 54727
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54727
Author:   blendix
Date:     2013-02-21 19:33:04 +0000 (Thu, 21 Feb 2013)
Log Message:
-----------
Dependency Graph: some refactoring which should have no user visible impact
besides performance in some cases.

* DAG_scene_sort is now removed and replaced by DAG_relations_tag_update in
  most cases. This will clear the dependency graph, and only rebuild it right
  before it's needed again when the scene is re-evaluated.

  This is done because DAG_scene_sort is slow when called many times from
  python operators. Further the scene argument is not needed because most
  operations can potentially affect more than the current scene.

* DAG_scene_relations_update will now rebuild the dependency graph if it's not
  there yet, and DAG_scene_relations_rebuild will force a rebuild for the rare
  cases that need it.

* Remove various places where ob->recalc was set manually. This should go
  through DAG_id_tag_update() in nearly all cases instead since this is now
  a fast operation. Also removed DAG_ids_flush_update that goes along with
  such manual tagging of ob->recalc.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/collada/AnimationImporter.cpp
    trunk/blender/source/blender/collada/DocumentImporter.cpp
    trunk/blender/source/blender/collada/SkinInfo.cpp
    trunk/blender/source/blender/collada/collada_utils.cpp
    trunk/blender/source/blender/editors/animation/drivers.c
    trunk/blender/source/blender/editors/animation/keyframing.c
    trunk/blender/source/blender/editors/animation/keyingsets.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_constraint.c
    trunk/blender/source/blender/editors/object/object_edit.c
    trunk/blender/source/blender/editors/object/object_group.c
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/object/object_transform.c
    trunk/blender/source/blender/editors/physics/dynamicpaint_ops.c
    trunk/blender/source/blender/editors/physics/particle_boids.c
    trunk/blender/source/blender/editors/physics/particle_object.c
    trunk/blender/source/blender/editors/physics/rigidbody_constraint.c
    trunk/blender/source/blender/editors/physics/rigidbody_object.c
    trunk/blender/source/blender/editors/space_graph/graph_buttons.c
    trunk/blender/source/blender/editors/space_outliner/outliner_edit.c
    trunk/blender/source/blender/editors/space_outliner/outliner_tools.c
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_boid.c
    trunk/blender/source/blender/makesrna/intern/rna_curve.c
    trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c
    trunk/blender/source/blender/makesrna/intern/rna_fcurve.c
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_force.c
    trunk/blender/source/blender/makesrna/intern/rna_particle.c
    trunk/blender/source/blender/makesrna/intern/rna_pose.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/makesrna/intern/rna_smoke.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2013-02-21 19:33:04 UTC (rev 54727)
@@ -99,9 +99,17 @@
 /* ********** API *************** */
 /* Note that the DAG never executes changes in Objects, only sets flags in Objects */
 
-/* (re)-create dependency graph for scene */
-void    DAG_scene_sort(struct Main *bmain, struct Scene *sce);
+/* clear all dependency graphs, call this when changing relations between objects.
+ * the dependency graphs will be rebuilt just before they are used to avoid them
+ * getting rebuild many times during operators */
+void    DAG_relations_tag_update(struct Main *bmain);
 
+/* (re)-create the dependency graph before using it */
+void    DAG_scene_relations_update(struct Main *bmain, struct Scene *sce);
+
+/* force an immediate rebuild of the dependency graph, only needed in rare cases */
+void    DAG_scene_relations_rebuild(struct Main *bmain, struct Scene *scene);
+
 /* flag all objects that need recalc because they're animated */
 void    DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
 /* flushes all recalc flags in objects down the dependency tree */
@@ -109,9 +117,6 @@
 /* tag objects for update on file load */
 void    DAG_on_visible_update(struct Main *bmain, const short do_time);
 
-/* when setting manual RECALC flags, call this afterwards */
-void    DAG_ids_flush_update(struct Main *bmain, int time);
-
 /* tag datablock to get updated for the next redraw */
 void    DAG_id_tag_update(struct ID *id, short flag);
 /* flush all tagged updates */

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2013-02-21 19:33:04 UTC (rev 54727)
@@ -320,7 +320,7 @@
 	}
 	
 	/* "brew me a list that's sorted a bit faster now depsy" */
-	DAG_scene_sort(G.main, scene);
+	DAG_scene_relations_rebuild(G.main, scene);
 }
 
 /* update scene for current frame */

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2013-02-21 19:33:04 UTC (rev 54727)
@@ -1000,8 +1000,7 @@
 	flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
 	
 	/* recreate dependency graph to include new objects */
-	DAG_scene_sort(bmain, scene);
-	DAG_ids_flush_update(bmain, 0);
+	DAG_relations_tag_update(bmain);
 	
 	BLO_blendhandle_close(bh);
 	/* remove library... */

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2013-02-21 19:33:04 UTC (rev 54727)
@@ -4261,7 +4261,7 @@
 
 /* Free data of a specific constraint if it has any info.
  * be sure to run BIK_clear_data() when freeing an IK constraint,
- * unless DAG_scene_sort is called. 
+ * unless DAG_relations_tag_update is called. 
  */
 void BKE_free_constraint_data(bConstraint *con)
 {

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2013-02-21 19:33:04 UTC (rev 54727)
@@ -837,7 +837,6 @@
 	DagAdjList *itA;
 
 	dag = sce->theDag;
-	sce->dagisvalid = 1;
 	if (dag)
 		free_forest(dag);
 	else {
@@ -1846,8 +1845,18 @@
 	}
 }
 
+/* free the depency graph */
+static void dag_scene_free(Scene *sce)
+{
+	if (sce->theDag) {
+		free_forest(sce->theDag);
+		MEM_freeN(sce->theDag);
+		sce->theDag = NULL;
+	}
+}
+
 /* sort the base list on dependency order */
-void DAG_scene_sort(Main *bmain, Scene *sce)
+static void dag_scene_build(Main *bmain, Scene *sce)
 {
 	DagNode *node, *rootnode;
 	DagNodeQueue *nqueue;
@@ -1856,7 +1865,7 @@
 	int skip = 0;
 	ListBase tempbase;
 	Base *base;
-	
+
 	tempbase.first = tempbase.last = NULL;
 	
 	build_dag(bmain, sce, DAG_RL_ALL_BUT_DATA);
@@ -1936,10 +1945,34 @@
 			printf(" %s\n", base->object->id.name);
 		}
 	}
+
 	/* temporal...? */
 	sce->recalc |= SCE_PRV_CHANGED; /* test for 3d preview */
 }
 
+/* clear all dependency graphs */
+void DAG_relations_tag_update(Main *bmain)
+{
+	Scene *sce;
+
+	for (sce = bmain->scene.first; sce; sce = sce->id.next)
+		dag_scene_free(sce);
+}
+
+/* rebuild dependency graph only for a given scene */
+void DAG_scene_relations_rebuild(Main *bmain, Scene *sce)
+{
+	dag_scene_free(sce);
+	DAG_scene_relations_update(bmain, sce);
+}
+
+/* create dependency graph if it was cleared or didn't exist yet */
+void DAG_scene_relations_update(Main *bmain, Scene *sce)
+{
+	if (!sce->theDag)
+		dag_scene_build(bmain, sce);
+}
+
 static void lib_id_recalc_tag(Main *bmain, ID *id)
 {
 	id->flag |= LIB_ID_RECALC;
@@ -2177,7 +2210,7 @@
 	
 	if (sce->theDag == NULL) {
 		printf("DAG zero... not allowed to happen!\n");
-		DAG_scene_sort(bmain, sce);
+		DAG_scene_relations_update(bmain, sce);
 	}
 	
 	firstnode = sce->theDag->DagNode.first;  /* always scene node */
@@ -2545,20 +2578,6 @@
 	}
 }
 
-void DAG_ids_flush_update(Main *bmain, int time)
-{
-	ListBase listbase;
-	DagSceneLayer *dsl;
-	
-	/* get list of visible scenes and layers */
-	dag_current_scene_layers(bmain, &listbase);
-
-	for (dsl = listbase.first; dsl; dsl = dsl->next)
-		DAG_scene_flush_update(bmain, dsl->scene, dsl->layer, time);
-	
-	BLI_freelistN(&listbase);
-}
-
 void DAG_on_visible_update(Main *bmain, const short do_time)
 {
 	ListBase listbase;
@@ -3169,7 +3188,7 @@
 	}
 	else {
 		printf("\nDEPENDENCY RELATIONS for %s\n\n", scene->id.name + 2);
-		DAG_scene_sort(bmain, scene);
+		DAG_scene_relations_rebuild(bmain, scene);
 	}
 	
 	dag_print_dependencies = 0;

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2013-02-21 19:23:41 UTC (rev 54726)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2013-02-21 19:33:04 UTC (rev 54727)
@@ -74,6 +74,7 @@
 #include "BKE_bullet.h"
 #include "BKE_colortools.h"
 #include "BKE_deform.h"
+#include "BKE_depsgraph.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_animsys.h"
 #include "BKE_anim.h"
@@ -406,7 +407,8 @@
 
 	if (*obpoin == unlinkOb) {
 		*obpoin = NULL;
-		ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME; // XXX: should this just be OB_RECALC_DATA?
+		// XXX: should this just be OB_RECALC_DATA?
+		DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 	}
 }
 
@@ -440,14 +442,14 @@
 			obt->proxy = NULL;
 		if (obt->proxy_from == ob) {
 			obt->proxy_from = NULL;
-			obt->recalc |= OB_RECALC_OB;
+			DAG_id_tag_update(&obt->id, OB_RECALC_OB);
 		}
 		if (obt->proxy_group == ob)
 			obt->proxy_group = NULL;
 		
 		if (obt->parent == ob) {
 			obt->parent = NULL;
-			obt->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+			DAG_id_tag_update(&obt->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 		}
 		
 		modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
@@ -457,15 +459,15 @@
 
 			if (cu->bevobj == ob) {
 				cu->bevobj = NULL;
-				obt->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+				DAG_id_tag_update(&obt->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 			}
 			if (cu->taperobj == ob) {
 				cu->taperobj = NULL;
-				obt->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+				DAG_id_tag_update(&obt->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 			}
 			if (cu->textoncurve == ob) {
 				cu->textoncurve = NULL;
-				obt->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+				DAG_id_tag_update(&obt->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 			}
 		}
 		else if (obt->type == OB_ARMATURE && obt->pose) {
@@ -483,7 +485,7 @@
 							if (ct->tar == ob) {
 								ct->tar = NULL;
 								ct->subtarget[0] = '\0';
-								obt->recalc |= OB_RECALC_DATA;
+								DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 							}
 						}
 						
@@ -497,7 +499,7 @@
 		}
 		else if (ELEM(OB_MBALL, ob->type, obt->type)) {
 			if (BKE_mball_is_basis_for(obt, ob))
-				obt->recalc |= OB_RECALC_DATA;
+				DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 		}
 		
 		sca_remove_ob_poin(obt, ob);
@@ -514,7 +516,7 @@
 					if (ct->tar == ob) {
 						ct->tar = NULL;
 						ct->subtarget[0] = '\0';
-						obt->recalc |= OB_RECALC_DATA;
+						DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 					}
 				}
 				
@@ -526,12 +528,12 @@
 		/* object is deflector or field */
 		if (ob->pd) {
 			if (obt->soft)
-				obt->recalc |= OB_RECALC_DATA;
+				DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 
 			/* cloth */
 			for (md = obt->modifiers.first; md; md = md->next)
 				if (md->type == eModifierType_Cloth)
-					obt->recalc |= OB_RECALC_DATA;
+					DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 		}
 		
 		/* strips */
@@ -560,14 +562,14 @@
 				for (; pt; pt = pt->next) {
 					if (pt->ob == ob) {
 						pt->ob = NULL;
-						obt->recalc |= OB_RECALC_DATA;
+						DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 						break;
 					}
 				}
 
 				if (tpsys->target_ob == ob) {
 					tpsys->target_ob = NULL;
-					obt->recalc |= OB_RECALC_DATA;
+					DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 				}
 
 				if (tpsys->part->dup_ob == ob)
@@ -602,7 +604,7 @@
 				}
 			}
 			if (ob->pd)
-				obt->recalc |= OB_RECALC_DATA;
+				DAG_id_tag_update(&obt->id, OB_RECALC_DATA);
 		}
 
 		obt = obt->id.next;
@@ -970,7 +972,7 @@
 	base = BKE_scene_base_add(scene, ob);
 	BKE_scene_base_deselect_all(scene);
 	BKE_scene_base_select(scene, base);
-	ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME;
+	DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 
 	return ob;
 }
@@ -1480,7 +1482,8 @@
 	ob->proxy_group = gob;
 	id_lib_extern(&target->id);
 	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list