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) 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to