[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42216] trunk/blender/source/blender: Fix #29389: cycles viewport render not updating on frame changes.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Nov 28 15:55:45 CET 2011


Revision: 42216
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42216
Author:   blendix
Date:     2011-11-28 14:55:35 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
Fix #29389: cycles viewport render not updating on frame changes. This sort of
worked by accident before, because of flags that weren't cleared properly. Now
moved the call to update render engines into scene_update_* itself.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/editors/include/ED_render.h
    trunk/blender/source/blender/editors/render/render_update.c
    trunk/blender/source/blender/makesrna/intern/rna_scene_api.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c

Modified: trunk/blender/source/blender/blenkernel/BKE_depsgraph.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/blenkernel/BKE_depsgraph.h	2011-11-28 14:55:35 UTC (rev 42216)
@@ -121,7 +121,7 @@
 		/* flush all tagged updates */
 void	DAG_ids_flush_tagged(struct Main *bmain);
 		/* check and clear ID recalc flags */
-void	DAG_ids_check_recalc(struct Main *bmain);
+void	DAG_ids_check_recalc(struct Main *bmain, struct Scene *scene, int time);
 void	DAG_ids_clear_recalc(struct Main *bmain);
 		/* test if any of this id type is tagged for update */
 void	DAG_id_type_tag(struct Main *bmain, short idtype);
@@ -131,7 +131,8 @@
 void	DAG_pose_sort(struct Object *ob);
 
 		/* callback for editors module to do updates */
-void	DAG_editors_update_cb(void (*func)(struct Main *bmain, struct ID *id));
+void	DAG_editors_update_cb(void (*id_func)(struct Main *bmain, struct ID *id),
+                              void (*scene_func)(struct Main *bmain, struct Scene *scene, int updated));
 
 		/* debugging */
 void	DAG_print_dependencies(struct Main *bmain, struct Scene *scene, struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2011-11-28 14:55:35 UTC (rev 42216)
@@ -90,7 +90,6 @@
 float BKE_frame_to_ctime(struct Scene *scene, const float frame);
 
 void scene_update_tagged(struct Main *bmain, struct Scene *sce);
-void scene_clear_tagged(struct Main *bmain, struct Scene *sce);
 
 void scene_update_for_newframe(struct Main *bmain, struct Scene *sce, unsigned int lay);
 

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-11-28 14:55:35 UTC (rev 42216)
@@ -1636,19 +1636,27 @@
 
 /* mechanism to allow editors to be informed of depsgraph updates,
    to do their own updates based on changes... */
-static void (*EditorsUpdateCb)(Main *bmain, ID *id)= NULL;
+static void (*EditorsUpdateIDCb)(Main *bmain, ID *id)= NULL;
+static void (*EditorsUpdateSceneCb)(Main *bmain, Scene *scene, int updated)= NULL;
 
-void DAG_editors_update_cb(void (*func)(Main *bmain, ID *id))
+void DAG_editors_update_cb(void (*id_func)(Main *bmain, ID *id), void (*scene_func)(Main *bmain, Scene *scene, int updated))
 {
-	EditorsUpdateCb= func;
+	EditorsUpdateIDCb= id_func;
+	EditorsUpdateSceneCb= scene_func;
 }
 
-static void dag_editors_update(Main *bmain, ID *id)
+static void dag_editors_id_update(Main *bmain, ID *id)
 {
-	if(EditorsUpdateCb)
-		EditorsUpdateCb(bmain, id);
+	if(EditorsUpdateIDCb)
+		EditorsUpdateIDCb(bmain, id);
 }
 
+static void dag_editors_scene_update(Main *bmain, Scene *scene, int updated)
+{
+	if(EditorsUpdateSceneCb)
+		EditorsUpdateSceneCb(bmain, scene, updated);
+}
+
 /* groups with objects in this scene need to be put in the right order as well */
 static void scene_sort_groups(Main *bmain, Scene *sce)
 {
@@ -2460,7 +2468,7 @@
 
 			/* no point in trying in this cases */
 			if(id && id->us <= 1) {
-				dag_editors_update(bmain, id);
+				dag_editors_id_update(bmain, id);
 				id= NULL;
 			}
 		}
@@ -2572,7 +2580,7 @@
 		}
 
 		/* update editors */
-		dag_editors_update(bmain, id);
+		dag_editors_id_update(bmain, id);
 	}
 }
 
@@ -2612,10 +2620,10 @@
 		DAG_scene_flush_update(bmain, sce, lay, 0);
 }
 
-void DAG_ids_check_recalc(Main *bmain)
+void DAG_ids_check_recalc(Main *bmain, Scene *scene, int time)
 {
 	ListBase *lbarray[MAX_LIBARRAY];
-	int a;
+	int a, updated = 0;
 
 	/* loop over all ID types */
 	a  = set_listbasepointers(bmain, lbarray);
@@ -2627,14 +2635,14 @@
 		/* 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]]) {
-			/* do editors update */
-			dag_editors_update(bmain, NULL);
-			return;
+			updated= 1;
+			break;
 		}
 	}
+
+	dag_editors_scene_update(bmain, scene, (updated || time));
 }
 
-
 void DAG_ids_clear_recalc(Main *bmain)
 {
 	ListBase *lbarray[MAX_LIBARRAY];

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2011-11-28 14:55:35 UTC (rev 42216)
@@ -1028,15 +1028,11 @@
 	if (scene->physics_settings.quick_cache_step)
 		BKE_ptcache_quick_cache_all(bmain, scene);
 
-	/* notify editors about recalc */
-	DAG_ids_check_recalc(bmain);
-
-	/* keep this last */
+	/* notify editors and python about recalc */
 	BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_POST);
-}
+	DAG_ids_check_recalc(bmain, scene, FALSE);
 
-void scene_clear_tagged(Main *bmain, Scene *UNUSED(scene))
-{
+	/* clear recalc flags */
 	DAG_ids_clear_recalc(bmain);
 }
 
@@ -1081,10 +1077,13 @@
 	/* object_handle_update() on all objects, groups and sets */
 	scene_update_tagged_recursive(bmain, sce, sce);
 
-	/* keep this last */
+	/* notify editors and python about recalc */
 	BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_SCENE_UPDATE_POST);
 	BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_POST);
 
+	DAG_ids_check_recalc(bmain, sce, TRUE);
+
+	/* clear recalc flags */
 	DAG_ids_clear_recalc(bmain);
 }
 

Modified: trunk/blender/source/blender/editors/include/ED_render.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_render.h	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/editors/include/ED_render.h	2011-11-28 14:55:35 UTC (rev 42216)
@@ -36,6 +36,7 @@
 struct MTex;
 struct Render;
 struct RenderInfo;
+struct Scene;
 
 /* render_ops.c */
 
@@ -45,7 +46,7 @@
 
 void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
 void ED_render_engine_changed(struct Main *bmain);
-void ED_render_engine_update_tagged(struct bContext *C, struct Main *bmain);
+void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
 
 /* render_preview.c */
 

Modified: trunk/blender/source/blender/editors/render/render_update.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_update.c	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/editors/render/render_update.c	2011-11-28 14:55:35 UTC (rev 42216)
@@ -41,6 +41,7 @@
 #include "DNA_view3d_types.h"
 #include "DNA_world_types.h"
 
+#include "BLI_threads.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
@@ -65,14 +66,26 @@
 
 /***************************** Render Engines ********************************/
 
-void ED_render_engine_update_tagged(bContext *C, Main *bmain)
+void ED_render_scene_update(Main *bmain, Scene *scene, int updated)
 {
 	/* viewport rendering update on data changes, happens after depsgraph
 	 * updates if there was any change. context is set to the 3d view */
-	bScreen *sc, *prev_sc= CTX_wm_screen(C);
-	ScrArea *sa, *prev_sa= CTX_wm_area(C);
-	ARegion *ar, *prev_ar= CTX_wm_region(C);
+	bContext *C;
+	bScreen *sc;
+	ScrArea *sa;
+	ARegion *ar;
 
+	/* don't do this render engine update if we're updating the scene from
+	   other threads doing e.g. rendering or baking jobs */
+	if(!BLI_thread_is_main())
+		return;
+
+	C= CTX_create();
+	CTX_data_main_set(C, bmain);
+	CTX_data_scene_set(C, scene);
+
+	CTX_wm_manager_set(C, bmain->wm.first);
+
 	for(sc=bmain->screen.first; sc; sc=sc->id.next) {
 		for(sa=sc->areabase.first; sa; sa=sa->next) {
 			if(sa->spacetype != SPACE_VIEW3D)
@@ -88,7 +101,7 @@
 				rv3d= ar->regiondata;
 				engine= rv3d->render_engine;
 
-				if(engine && (engine->flag & RE_ENGINE_DO_UPDATE)) {
+				if(engine && (updated || (engine->flag & RE_ENGINE_DO_UPDATE))) {
 					CTX_wm_screen_set(C, sc);
 					CTX_wm_area_set(C, sa);
 					CTX_wm_region_set(C, ar);
@@ -100,9 +113,7 @@
 		}
 	}
 
-	CTX_wm_screen_set(C, prev_sc);
-	CTX_wm_area_set(C, prev_sa);
-	CTX_wm_region_set(C, prev_ar);
+	CTX_free(C);
 }
 
 void ED_render_engine_changed(Main *bmain)
@@ -134,32 +145,6 @@
 	}
 }
 
-static void tag_render_engines(Main *bmain)
-{
-	/* tag running render engines for update later on */
-	bScreen *sc;
-	ScrArea *sa;
-	ARegion *ar;
-
-	for(sc=bmain->screen.first; sc; sc=sc->id.next) {
-		for(sa=sc->areabase.first; sa; sa=sa->next) {
-			if(sa->spacetype != SPACE_VIEW3D)
-				continue;
-
-			for(ar=sa->regionbase.first; ar; ar=ar->next) {
-				RegionView3D *rv3d;
-
-				if(ar->regiontype != RGN_TYPE_WINDOW)
-					continue;
-				
-				rv3d= ar->regiondata;
-				if(rv3d->render_engine)
-					rv3d->render_engine->flag |= RE_ENGINE_DO_UPDATE;
-			}
-		}
-	}
-}
-
 /***************************** Updates ***********************************
  * ED_render_id_flush_update gets called from DAG_id_tag_update, to do *
  * editor level updates when the ID changes. when these ID blocks are in *
@@ -357,11 +342,6 @@
 
 void ED_render_id_flush_update(Main *bmain, ID *id)
 {
-	if(!id) {
-		tag_render_engines(bmain);
-		return;
-	}
-
 	switch(GS(id->name)) {
 		case ID_MA:
 			material_changed(bmain, (Material*)id);

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene_api.c	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene_api.c	2011-11-28 14:55:35 UTC (rev 42216)
@@ -69,7 +69,6 @@
 static void rna_Scene_update_tagged(Scene *scene)
 {
 	scene_update_tagged(G.main, scene);
-	scene_clear_tagged(G.main, scene);
 }
 
 static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name)

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2011-11-28 13:49:42 UTC (rev 42215)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2011-11-28 14:55:35 UTC (rev 42216)
@@ -321,10 +321,6 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list