[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33490] trunk/blender/source/blender: Dependency graph: changed DAG_id_flush_update to DAG_id_tag_update.

Brecht Van Lommel brechtvanlommel at pandora.be
Sun Dec 5 19:59:24 CET 2010


Revision: 33490
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33490
Author:   blendix
Date:     2010-12-05 19:59:23 +0100 (Sun, 05 Dec 2010)

Log Message:
-----------
Dependency graph: changed DAG_id_flush_update to DAG_id_tag_update. Now it
only tags the ID and does the actual flush/update delayed, before the next
redraw. For objects the update was already delayed, just flushing wasn't
yet.

This should help performance in python and animation editors, by making 
calls to RNA property update quicker. Still need to add calls in a few
places where this was previously avoided due to bad performance.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
    trunk/blender/source/blender/blenkernel/BKE_main.h
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/pointcache.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/text.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/collada/ArmatureImporter.cpp
    trunk/blender/source/blender/editors/animation/anim_deps.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/armature/poseUtils.c
    trunk/blender/source/blender/editors/armature/poselib.c
    trunk/blender/source/blender/editors/armature/poseobject.c
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/curve/editfont.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/mesh/editmesh.c
    trunk/blender/source/blender/editors/mesh/editmesh_add.c
    trunk/blender/source/blender/editors/mesh/editmesh_loop.c
    trunk/blender/source/blender/editors/mesh/editmesh_mods.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/loopcut.c
    trunk/blender/source/blender/editors/mesh/mesh_data.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/metaball/mball_edit.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_hook.c
    trunk/blender/source/blender/editors/object/object_lattice.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_shapekey.c
    trunk/blender/source/blender/editors/object/object_transform.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/physics/particle_boids.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/physics/particle_object.c
    trunk/blender/source/blender/editors/render/render_shading.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_outliner/outliner.c
    trunk/blender/source/blender/editors/space_text/text_ops.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/space_view3d/view3d_fly.c
    trunk/blender/source/blender/editors/space_view3d/view3d_snap.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/util/editmode_undo.c
    trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/makesdna/DNA_ID.h
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_armature.c
    trunk/blender/source/blender/makesrna/intern/rna_boid.c
    trunk/blender/source/blender/makesrna/intern/rna_cloth.c
    trunk/blender/source/blender/makesrna/intern/rna_color.c
    trunk/blender/source/blender/makesrna/intern/rna_curve.c
    trunk/blender/source/blender/makesrna/intern/rna_fcurve.c
    trunk/blender/source/blender/makesrna/intern/rna_fluidsim.c
    trunk/blender/source/blender/makesrna/intern/rna_image.c
    trunk/blender/source/blender/makesrna/intern/rna_key.c
    trunk/blender/source/blender/makesrna/intern/rna_lamp.c
    trunk/blender/source/blender/makesrna/intern/rna_lattice.c
    trunk/blender/source/blender/makesrna/intern/rna_material.c
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_meta.c
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.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_sculpt_paint.c
    trunk/blender/source/blender/makesrna/intern/rna_smoke.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c
    trunk/blender/source/blender/makesrna/intern/rna_texture.c
    trunk/blender/source/blender/makesrna/intern/rna_userdef.c
    trunk/blender/source/blender/makesrna/intern/rna_world.c
    trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c

Modified: trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2010-12-05 18:59:23 UTC (rev 33490)
@@ -110,15 +110,14 @@
 		/* tag objects for update on file load */
 void	DAG_on_load_update(struct Main *bmain);
 
-		/* flag all IDs that need recalc because they're animated, influencing
-		   this ID only. only for objects currently */
-void	DAG_id_update_flags(struct ID *id);
-		/* flushes all recalc flags for this object down the dependency tree,
-		   but note the DAG only supports objects and object data currently */
-void	DAG_id_flush_update(struct ID *id, short flag);
 		/* 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 */
+void	DAG_ids_flush_tagged(struct Main *bmain);
+
 		/* (re)-create dependency graph for armature pose */
 void	DAG_pose_sort(struct Object *ob);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_main.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_main.h	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/BKE_main.h	2010-12-05 18:59:23 UTC (rev 33490)
@@ -81,6 +81,8 @@
 	ListBase particle;
 	ListBase wm;
 	ListBase gpencil;
+
+	char id_tag_update[256];
 } Main;
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2010-12-05 18:59:23 UTC (rev 33490)
@@ -52,6 +52,7 @@
 #include "BKE_global.h"
 #include "BKE_group.h"
 #include "BKE_key.h"
+#include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mball.h"
 #include "BKE_modifier.h"
@@ -2290,26 +2291,21 @@
 	}
 }
 
-void DAG_id_flush_update(ID *id, short flag)
+static void dag_id_flush_update(Scene *sce, ID *id)
 {
 	Main *bmain= G.main;
-	Scene *sce;
 	Object *obt, *ob= NULL;
 	short idtype;
-	unsigned int lay;
 
-	dag_current_scene_layers(bmain, &sce, &lay);
+	/* here we flush a few things before actual scene wide flush, mostly
+	   due to only objects and not other datablocks being in the depsgraph */
 
-	if(!id || !sce || !sce->theDag)
-		return;
-
 	/* set flags & pointcache for object */
 	if(GS(id->name) == ID_OB) {
 		ob= (Object*)id;
-		ob->recalc |= (flag & OB_RECALC_ALL);
 		BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
 
-		if(flag & OB_RECALC_DATA) {
+		if(ob->recalc & OB_RECALC_DATA) {
 			/* all users of this ob->data should be checked */
 			id= ob->data;
 
@@ -2374,25 +2370,92 @@
 		/* set flags based on particle settings */
 		if(idtype == ID_PA) {
 			ParticleSystem *psys;
-			for(obt=bmain->object.first; obt; obt= obt->id.next) {
-				for(psys=obt->particlesystem.first; psys; psys=psys->next) {
-					if(&psys->part->id == id) {
+			for(obt=bmain->object.first; obt; obt= obt->id.next)
+				for(psys=obt->particlesystem.first; psys; psys=psys->next)
+					if(&psys->part->id == id)
 						BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
-						obt->recalc |= (flag & OB_RECALC_ALL);
-						psys->recalc |= (flag & PSYS_RECALC);
-					}
-				}
-			}
 		}
 
 		/* update editors */
 		dag_editors_update(bmain, id);
 	}
+}
 
-	/* flush to other objects that depend on this one */
-	DAG_scene_flush_update(bmain, sce, lay, 0);
+void DAG_ids_flush_tagged(Main *bmain)
+{
+	ListBase *lbarray[MAX_LIBARRAY];
+	Scene *sce;
+	unsigned int lay;
+	int a, have_tag = 0;
+
+	dag_current_scene_layers(bmain, &sce, &lay);
+
+	if(!sce || !sce->theDag)
+		return;
+
+	/* loop over all ID types */
+	a  = set_listbasepointers(bmain, lbarray);
+
+	while(a--) {
+		ListBase *lb = lbarray[a];
+		ID *id = lb->first;
+
+		/* we tag based on first ID type character to avoid 
+		   looping over all ID's in case there are no tags */
+		if(id && bmain->id_tag_update[id->name[0]]) {
+			for(; id; id=id->next) {
+				if(id->flag & LIB_ID_RECALC) {
+					dag_id_flush_update(sce, id);
+					id->flag &= ~LIB_ID_RECALC;
+				}
+			}
+
+			have_tag = 1;
+		}
+	}
+
+	if(have_tag) {
+		/* clear tags */
+		memset(bmain->id_tag_update, 0, sizeof(bmain->id_tag_update));
+
+		/* flush changes to other objects */
+		DAG_scene_flush_update(bmain, sce, lay, 0);
+	}
 }
 
+void DAG_id_tag_update(ID *id, short flag)
+{
+	Main *bmain= G.main;
+
+	/* tag ID for update */
+	id->flag |= LIB_ID_RECALC;
+	bmain->id_tag_update[id->name[0]] = 1;
+
+	/* flag is for objects and particle systems */
+	if(flag) {
+		Object *ob;
+		ParticleSystem *psys;
+		short idtype = GS(id->name);
+
+		if(idtype == ID_OB) {
+			/* only quick tag */
+			ob = (Object*)id;
+			ob->recalc |= (flag & OB_RECALC_ALL);
+		}
+		else if(idtype == ID_PA) {
+			/* this is weak still, should be done delayed as well */
+			for(ob=bmain->object.first; ob; ob=ob->id.next) {
+				for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+					if(&psys->part->id == id) {
+						ob->recalc |= (flag & OB_RECALC_ALL);
+						psys->recalc |= (flag & PSYS_RECALC);
+					}
+				}
+			}
+		}
+	}
+}
+
 /* recursively descends tree, each node only checked once */
 /* node is checked to be of type object */
 static int parent_check_node(DagNode *node, int curtime)
@@ -2423,68 +2486,6 @@
 	return DAG_WHITE;
 }
 
-/* all nodes that influence this object get tagged, for calculating the exact
-   position of this object at a given timeframe */
-void DAG_id_update_flags(ID *id)
-{
-	Main *bmain= G.main;
-	Scene *sce;
-	DagNode *node;
-	DagAdjList *itA;
-	Object *ob;
-	unsigned int lay;
-
-	dag_current_scene_layers(bmain, &sce, &lay);
-
-	if(!id || !sce || !sce->theDag)
-		return;
-	
-	/* objects only currently */
-	if(GS(id->name) != ID_OB)
-		return;
-	
-	ob= (Object*)id;
-	
-	/* tag nodes unchecked */
-	for(node = sce->theDag->DagNode.first; node; node= node->next) 
-		node->color = DAG_WHITE;
-	
-	node= dag_find_node(sce->theDag, ob);
-	
-	/* object not in scene? then handle group exception. needs to be dagged once too */
-	if(node==NULL) {
-		Group *group= NULL;
-		while( (group = find_group(ob, group)) ) {
-			GroupObject *go;
-			/* primitive; tag all... this call helps building groups for particles */
-			for(go= group->gobject.first; go; go= go->next)
-				go->ob->recalc= OB_RECALC_ALL;
-		}
-	}
-	else {
-		
-		node->color = DAG_GRAY;
-		
-		sce->theDag->time++;
-		node= sce->theDag->DagNode.first;
-		for(itA = node->child; itA; itA= itA->next) {
-			if(itA->node->type==ID_OB && itA->node->lasttime!=sce->theDag->time)
-				itA->node->color= parent_check_node(itA->node, sce->theDag->time);
-		}
-		
-		/* set recalcs and flushes */
-		DAG_scene_update_flags(bmain, sce, lay);
-		
-		/* now we clear recalcs, unless color is set */
-		for(node = sce->theDag->DagNode.first; node; node= node->next) {
-			if(node->type==ID_OB && node->color==DAG_WHITE) {
-				Object *ob= node->ob;
-				ob->recalc= 0;
-			}
-		}
-	}
-}
-
 /* ******************* DAG FOR ARMATURE POSE ***************** */
 
 /* we assume its an armature with pose */

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2010-12-05 18:59:23 UTC (rev 33490)
@@ -1222,8 +1222,6 @@
 			mf->flag &= ~ME_SMOOTH;
 		}
 	}
-
-// XXX do this in caller	DAG_id_flush_update(&me->id, OB_RECALC_DATA);
 }
 
 void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r) 
@@ -1483,8 +1481,6 @@
 		me->pv->edge_map= NULL;
 		MEM_freeN(me->pv->vert_map);
 		me->pv->vert_map= NULL;
-
-// XXX do this in caller		DAG_id_flush_update(&me->id, OB_RECALC_DATA);
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2010-12-05 18:59:23 UTC (rev 33490)
@@ -3425,7 +3425,7 @@
 	psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
 
 	DAG_scene_sort(G.main, scene);
-	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+	DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 
 	return md;
 }
@@ -3462,7 +3462,7 @@
 		ob->mode &= ~OB_MODE_PARTICLE_EDIT;
 
 	DAG_scene_sort(G.main, scene);
-	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+	DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 }
 static void default_particle_settings(ParticleSettings *part)
 {

Modified: trunk/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pointcache.c	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/intern/pointcache.c	2010-12-05 18:59:23 UTC (rev 33490)
@@ -2313,7 +2313,7 @@
 		if(CONTINUE_PHYSICS == 0) {
 			for(ob=bmain->object.first; ob; ob=ob->id.next)
 				if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
-					DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+					DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2010-12-05 17:56:15 UTC (rev 33489)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2010-12-05 18:59:23 UTC (rev 33490)
@@ -968,6 +968,8 @@
 /* this is called in main loop, doing tagged updates before redraw */
 void scene_update_tagged(Main *bmain, Scene *scene)
 {
+	DAG_ids_flush_tagged(bmain);
+
 	scene->physics_settings.quick_cache_step= 0;
 
 	/* update all objects: drivers, matrices, displists, etc. flags set

Modified: trunk/blender/source/blender/blenkernel/intern/text.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/text.c	2010-12-05 17:56:15 UTC (rev 33489)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list