Depsgraph:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 14 Sep 2009 12:26:34 +0000 (12:26 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 14 Sep 2009 12:26:34 +0000 (12:26 +0000)
* Move function to compute visible screen layers to BKE.
* Use this now in the depsgraph, was still using this all layers
  to flush. Still missing a way to get the current scene in
  background mode..
* Also two more function to not require a scene pointer anymore:
* DAG_object_update_flags is now DAG_id_update_flags.
* DAG_ids_flush_update is now available next to DAG_scene_flush_update.

source/blender/blenkernel/BKE_depsgraph.h
source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/screen.c
source/blender/editors/animation/anim_deps.c
source/blender/editors/armature/editarmature_retarget.c
source/blender/editors/include/ED_screen.h
source/blender/editors/preview/previewrender.c
source/blender/editors/screen/screen_edit.c

index e242ead..17a4749 100644 (file)
@@ -96,19 +96,24 @@ void        draw_all_deps(void);
 /* ********** 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 Scene *sce);
 
                /* flag all objects that need recalc because they're animated */
 void   DAG_scene_update_flags(struct Scene *sce, unsigned int lay);
-               /* flag all objects that need recalc because they're animated, influencing this object only */
-void   DAG_object_update_flags(struct Scene *sce, struct Object *ob, 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);
+
+               /* 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 not the DAG only supports objects and object data currently */
+                  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(int time);
 
+               /* (re)-create dependency graph for armature pose */
 void   DAG_pose_sort(struct Object *ob);
                
 #endif
index 4fcb7c8..ee04d4f 100644 (file)
@@ -230,11 +230,11 @@ void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2);
 /* area/regions */
 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
 void   BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
+void   BKE_screen_area_free(struct ScrArea *sa);
 
-void BKE_screen_area_free(struct ScrArea *sa);
-
+/* screen */
 void free_screen(struct bScreen *sc); 
-
+unsigned int BKE_screen_visible_layers(struct bScreen *screen);
 
 #endif
 
index 6a14762..58f3db5 100644 (file)
@@ -78,6 +78,7 @@
 #include "BKE_pointcache.h"
 #include "BKE_utildefines.h"
 #include "BKE_scene.h"
+#include "BKE_screen.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -2142,30 +2143,58 @@ void DAG_scene_update_flags(Scene *scene, unsigned int lay)
        
 }
 
-void DAG_id_flush_update(ID *id, short flag)
+static void dag_current_scene_layers(Main *bmain, Scene **sce, unsigned int *lay)
 {
-       Main *bmain= G.main;
        wmWindowManager *wm;
        wmWindow *win;
-       Scene *sce;
-       Object *obt, *ob= NULL;
-       short idtype;
 
        /* only one scene supported currently, making more scenes work
           correctly requires changes beyond just the dependency graph */
 
+       *sce= NULL;
+       *lay= 0;
+
        if((wm= bmain->wm.first)) {
-               /* if we have a windowmanager, use sce from first window */
+               /* if we have a windowmanager, look into windows */
                for(win=wm->windows.first; win; win=win->next) {
-                       sce= (win->screen)? win->screen->scene: NULL;
-
-                       if(sce)
-                               break;
+                       if(win->screen) {
+                               if(!*sce) *sce= win->screen->scene;
+                               *lay |= BKE_screen_visible_layers(win->screen);
+                       }
                }
        }
-       else
+       else {
                /* if not, use the first sce */
-               sce= bmain->scene.first;
+               *sce= bmain->scene.first;
+               if(*sce) *lay= (*sce)->lay;
+
+               /* XXX for background mode, we should get the scen
+                  from somewhere, for the -S option, but it's in
+                  the context, how to get it here? */
+       }
+}
+
+void DAG_ids_flush_update(int time)
+{
+       Main *bmain= G.main;
+       Scene *sce;
+       unsigned int lay;
+
+       dag_current_scene_layers(bmain, &sce, &lay);
+
+       if(sce)
+               DAG_scene_flush_update(sce, lay, time);
+}
+
+void DAG_id_flush_update(ID *id, short flag)
+{
+       Main *bmain= G.main;
+       Scene *sce;
+       Object *obt, *ob= NULL;
+       short idtype;
+       unsigned int lay;
+
+       dag_current_scene_layers(bmain, &sce, &lay);
 
        if(!id || !sce || !sce->theDag)
                return;
@@ -2213,10 +2242,7 @@ void DAG_id_flush_update(ID *id, short flag)
        }
 
        /* flush to other objects that depend on this one */
-// XXX if(G.curscreen)
-//             DAG_scene_flush_update(sce, dag_screen_view3d_layers(), 0);
-//     else
-               DAG_scene_flush_update(sce, sce->lay, 0);
+       DAG_scene_flush_update(sce, lay, 0);
 }
 
 /* recursively descends tree, each node only checked once */
@@ -2251,10 +2277,25 @@ static int parent_check_node(DagNode *node, int curtime)
 
 /* all nodes that influence this object get tagged, for calculating the exact
    position of this object at a given timeframe */
-void DAG_object_update_flags(Scene *sce, Object *ob, unsigned int lay)
+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) 
index cc740d7..661d0da 100644 (file)
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
+#include "DNA_view3d_types.h"
 
 #include "BLI_blenlib.h"
 
@@ -321,4 +323,23 @@ void free_screen(bScreen *sc)
        BLI_freelistN(&sc->areabase);
 }
 
+/* for depsgraph */
+unsigned int BKE_screen_visible_layers(bScreen *screen)
+{
+       ScrArea *sa;
+       unsigned int layer= 0;
+
+       if(!screen)
+               return layer;
+
+       /* get all used view3d layers */
+       for(sa= screen->areabase.first; sa; sa= sa->next)
+               if(sa->spacetype==SPACE_VIEW3D)
+                       layer |= ((View3D *)sa->spacedata.first)->lay;
+
+       if(!layer)
+               return screen->scene->lay;
+
+       return layer;
+}
 
index af2355b..62341a5 100644 (file)
@@ -43,6 +43,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_main.h"
 #include "BKE_scene.h"
+#include "BKE_screen.h"
 #include "BKE_utildefines.h"
 
 #include "RNA_access.h"
 /* ***************** depsgraph calls and anim updates ************* */
 /* ***************** only these can be called from editors ******** */
 
-/* generic update flush, reads from context Screen (layers) and scene */
-/* this is for compliancy, later it can do all windows etc */
 void ED_anim_dag_flush_update(const bContext *C)
 {
-       Scene *scene= CTX_data_scene(C);
-       bScreen *screen= CTX_wm_screen(C);
-       
-       DAG_scene_flush_update(scene, ED_screen_view3d_layers(screen), 0);
+       DAG_ids_flush_update(0);
 }
 
 /* flushes changes from object to all relations in scene */
 void ED_anim_object_flush_update(const bContext *C, Object *ob)
 {
-       Scene *scene= CTX_data_scene(C);
-       bScreen *screen= CTX_wm_screen(C);
-       
-       DAG_object_update_flags(scene, ob, ED_screen_view3d_layers(screen));
+       DAG_id_update_flags(&ob->id);
 }
 
-
 /* **************************** pose <-> action syncing ******************************** */
 /* Summary of what needs to be synced between poses and actions:
  *     1) Flags
index 16e78f7..4d65059 100644 (file)
@@ -2716,7 +2716,6 @@ static void finishRetarget(RigGraph *rigg)
 
 static void adjustGraphs(bContext *C, RigGraph *rigg)
 {
-       Scene *scene = CTX_data_scene(C);
        bArmature *arm= rigg->ob->data;
        RigArc *arc;
        
@@ -2739,7 +2738,6 @@ static void adjustGraphs(bContext *C, RigGraph *rigg)
 
 static void retargetGraphs(bContext *C, RigGraph *rigg)
 {
-       Scene *scene = CTX_data_scene(C);
        bArmature *arm= rigg->ob->data;
        ReebGraph *reebg = rigg->link_mesh;
        RigNode *inode;
index 0153b3c..6975651 100644 (file)
@@ -104,7 +104,6 @@ void        ED_screen_new_window(struct bContext *C, struct rcti *position, int type);
 
 /* anim */
 void   ED_update_for_newframe(const struct bContext *C, int mute);
-unsigned int ED_screen_view3d_layers(struct bScreen *screen);
 
 void   ED_operatortypes_screen(void);
 void   ED_keymap_screen(struct wmWindowManager *wm);
index 714ebce..710ac3d 100644 (file)
@@ -88,7 +88,6 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
-#include "ED_anim_api.h"
 #include "ED_previewrender.h"
 #include "ED_view3d.h"
 
@@ -736,7 +735,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
                        
                        /* database can have created render-resol data... */
                        if(rstats->convertdone) 
-                               ED_anim_dag_flush_update(C); // <--- only current scene XXX
+                               DAG_scene_flush_update(scene, scene->lay, 0);
                        
                        //printf("dbase update\n");
                }
index aa36675..5d938ba 100644 (file)
@@ -1580,23 +1580,6 @@ void ED_screen_animation_timer_update(bContext *C, int redraws)
        }
 }
 
-unsigned int ED_screen_view3d_layers(bScreen *screen)
-{
-       if(screen) {
-               unsigned int layer= screen->scene->lay; /* as minimum this */
-               ScrArea *sa;
-               
-               /* get all used view3d layers */
-               for(sa= screen->areabase.first; sa; sa= sa->next) {
-                       if(sa->spacetype==SPACE_VIEW3D)
-                               layer |= ((View3D *)sa->spacedata.first)->lay;
-               }
-               return layer;
-       }
-       return 0;
-}
-
-
 /* results in fully updated anim system */
 void ED_update_for_newframe(const bContext *C, int mute)
 {
@@ -1607,7 +1590,7 @@ void ED_update_for_newframe(const bContext *C, int mute)
        
        /* this function applies the changes too */
        /* XXX future: do all windows */
-       scene_update_for_newframe(scene, ED_screen_view3d_layers(screen)); /* BKE_scene.h */
+       scene_update_for_newframe(scene, BKE_screen_visible_layers(screen)); /* BKE_scene.h */
        
        //if ( (CFRA>1) && (!mute) && (scene->r.audio.flag & AUDIO_SCRUB)) 
        //      audiostream_scrub( CFRA );