[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30088] trunk/blender/source/blender/ blenkernel/intern/depsgraph.c: Fix #21540: depsgraph problem on load, meshes on non-visible layers

Brecht Van Lommel brecht at blender.org
Wed Jul 7 19:08:20 CEST 2010


Revision: 30088
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30088
Author:   blendix
Date:     2010-07-07 19:08:20 +0200 (Wed, 07 Jul 2010)

Log Message:
-----------
Fix #21540: depsgraph problem on load, meshes on non-visible layers
were not created when objects on visible layers depended on them, now
it uses the flushed layer to determine if the object data should be
recalculated.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2010-07-07 16:37:41 UTC (rev 30087)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2010-07-07 17:08:20 UTC (rev 30088)
@@ -1877,26 +1877,19 @@
 	}
 }
 
-/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
+/* flush layer flags to dependencies */
+static void dag_scene_flush_layers(Scene *sce, int lay)
 {
-	DagNode *firstnode, *node;
+	DagNode *node, *firstnode;
 	DagAdjList *itA;
-	Object *ob;
 	Base *base;
 	int lasttime;
-	
-	if(sce->theDag==NULL) {
-		printf("DAG zero... not allowed to happen!\n");
-		DAG_scene_sort(sce);
-	}
-	
+
 	firstnode= sce->theDag->DagNode.first;  // always scene node
 
 	for(itA = firstnode->child; itA; itA= itA->next)
 		itA->lay= 0;
-	
-	/* first we flush the layer flags */
+
 	sce->theDag->time++;	// so we know which nodes were accessed
 	lasttime= sce->theDag->time;
 
@@ -1930,7 +1923,26 @@
 	for(itA = firstnode->child; itA; itA= itA->next)
 		if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB) 
 			flush_layer_node(sce, itA->node, lasttime);
+}
+
+/* flushes all recalc flags in objects down the dependency tree */
+void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
+{
+	DagNode *firstnode;
+	DagAdjList *itA;
+	Object *ob;
+	int lasttime;
 	
+	if(sce->theDag==NULL) {
+		printf("DAG zero... not allowed to happen!\n");
+		DAG_scene_sort(sce);
+	}
+	
+	firstnode= sce->theDag->DagNode.first;  // always scene node
+
+	/* first we flush the layer flags */
+	dag_scene_flush_layers(sce, lay);
+
 	/* then we use the relationships + layer info to flush update events */
 	sce->theDag->time++;	// so we know which nodes were accessed
 	lasttime= sce->theDag->time;
@@ -2231,7 +2243,8 @@
 	Object *ob;
 	Group *group;
 	GroupObject *go;
-	unsigned int lay;
+	DagNode *node;
+	unsigned int lay, oblay;
 
 	dag_current_scene_layers(bmain, &scene, &lay);
 
@@ -2240,10 +2253,14 @@
 		   remade, tag them so they get remade in the scene update loop,
 		   note armature poses or object matrices are preserved and do not
 		   require updates, so we skip those */
+		dag_scene_flush_layers(scene, lay);
+
 		for(SETLOOPER(scene, base)) {
 			ob= base->object;
+			node= (sce->theDag)? dag_get_node(sce->theDag, ob): NULL;
+			oblay= (node)? node->lay: ob->lay;
 
-			if(base->lay & lay) {
+			if(oblay & lay) {
 				if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
 					ob->recalc |= OB_RECALC_DATA;
 				if(ob->dup_group) 





More information about the Bf-blender-cvs mailing list