Revision: 26660
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26660
Author:   blendix
Date:     2010-02-07 11:00:27 +0100 (Sun, 07 Feb 2010)

Log Message:
-----------
Depsgraph: fix for old problem where dependencies would not get executed
properly on file loading. Some things get preserved on file save/load,
like object matrices and armature poses, but other things need to be remade
like derivedmeshes and displists. The latter were not tagged for recalc on
load causing them to be made on countall or redraw typically, so not in the
right order and dependencies on hidden layer were not done at all.

Now these get tagged for recalc and flags flushed on load. There shouldn't
be much if any slowdown on opening existing files, if there is it should be
fixable.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_depsgraph.h     2010-02-07 
09:52:43 UTC (rev 26659)
+++ trunk/blender/source/blender/blenkernel/BKE_depsgraph.h     2010-02-07 
10:00:27 UTC (rev 26660)
@@ -103,6 +103,8 @@
 void   DAG_scene_update_flags(struct Scene *sce, unsigned int lay);
                /* flushes all recalc flags in objects down the dependency tree 
*/
 void   DAG_scene_flush_update(struct Scene *sce, unsigned int lay, int time);
+               /* tag objects for update on file load */
+void   DAG_on_load_update(void);
 
                /* flag all IDs that need recalc because they're animated, 
influencing
                   this ID only. only for objects currently */

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c    2010-02-07 
09:52:43 UTC (rev 26659)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c    2010-02-07 
10:00:27 UTC (rev 26660)
@@ -208,7 +208,6 @@
 
 static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) 
 {
-       Object *ob;
        bScreen *curscreen= NULL;
        Scene *curscene= NULL;
        int recover;
@@ -318,15 +317,8 @@
        /* baseflags, groups, make depsgraph, etc */
        set_scene_bg(CTX_data_scene(C));
 
-       /* last stage of do_versions actually, that sets recalc flags for 
recalc poses */
-       for(ob= G.main->object.first; ob; ob= ob->id.next) {
-               if(ob->type==OB_ARMATURE)
-                       if(ob->recalc) object_handle_update(CTX_data_scene(C), 
ob);
-       }
+       DAG_on_load_update();
        
-       /* now tag update flags, to ensure deformers get calculated on redraw */
-       DAG_scene_update_flags(CTX_data_scene(C), CTX_data_scene(C)->lay);
-       
        MEM_freeN(bfd);
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c  2010-02-07 
09:52:43 UTC (rev 26659)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c  2010-02-07 
10:00:27 UTC (rev 26660)
@@ -2211,6 +2211,48 @@
                DAG_scene_flush_update(sce, lay, time);
 }
 
+void DAG_on_load_update(void)
+{
+       Main *bmain= G.main;
+       Scene *scene, *sce;
+       Base *base;
+       Object *ob;
+       Group *group;
+       GroupObject *go;
+       unsigned int lay;
+
+       dag_current_scene_layers(bmain, &scene, &lay);
+
+       if(scene) {
+               /* derivedmeshes and displists are not saved to file so need to 
be
+                  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 */
+               for(SETLOOPER(scene, base)) {
+                       ob= base->object;
+
+                       if(base->lay & lay) {
+                               if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, 
OB_FONT, OB_MBALL))
+                                       ob->recalc |= OB_RECALC_DATA;
+                               if(ob->dup_group) 
+                                       ob->dup_group->id.flag |= LIB_DOIT;
+                       }
+               }
+
+               for(group= G.main->group.first; group; group= group->id.next) {
+                       if(group->id.flag & LIB_DOIT) {
+                               if(ELEM5(go->ob->type, OB_MESH, OB_CURVE, 
OB_SURF, OB_FONT, OB_MBALL))
+                                       go->ob->recalc |= OB_RECALC_DATA;
+
+                               group->id.flag &= ~LIB_DOIT;
+                       }
+               }
+
+               /* now tag update flags, to ensure deformers get calculated on 
redraw */
+               DAG_scene_update_flags(scene, lay);
+       }
+}
+
 void DAG_id_flush_update(ID *id, short flag)
 {
        Main *bmain= G.main;

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c   2010-02-07 
09:52:43 UTC (rev 26659)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c   2010-02-07 
10:00:27 UTC (rev 26660)
@@ -6741,14 +6741,14 @@
                psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm);
                psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm);
                psmd->totdmface= psmd->dm->getNumFaces(psmd->dm);
-                 }
+       }
 
-                 if(psys){
-                         psmd->flag &= ~eParticleSystemFlag_psys_updated;
-                         particle_system_update(md->scene, ob, psys);
-                         psmd->flag |= eParticleSystemFlag_psys_updated;
-                         psmd->flag &= ~eParticleSystemFlag_DM_changed;
-                 }
+       if(psys) {
+               psmd->flag &= ~eParticleSystemFlag_psys_updated;
+               particle_system_update(md->scene, ob, psys);
+               psmd->flag |= eParticleSystemFlag_psys_updated;
+               psmd->flag &= ~eParticleSystemFlag_DM_changed;
+       }
 }
 
 /* disabled particles in editmode for now, until support for proper derivedmesh


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to