Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h5
-rw-r--r--source/blender/blenkernel/BKE_scene.h1
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c36
-rw-r--r--source/blender/blenkernel/intern/scene.c15
-rw-r--r--source/blender/editors/include/ED_render.h3
-rw-r--r--source/blender/editors/render/render_update.c58
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c1
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c4
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c2
9 files changed, 54 insertions, 71 deletions
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index e0b8e40d731..5d475903feb 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -121,7 +121,7 @@ void DAG_id_tag_update(struct ID *id, short flag);
/* 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 @@ int DAG_id_type_tagged(struct Main *bmain, short idtype);
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);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 7cb31505430..2df5e7ac2c6 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -90,7 +90,6 @@ float BKE_curframe(struct Scene *scene);
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);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index b1e39b1d768..4eaf49dc679 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1636,17 +1636,25 @@ void graph_print_adj_list(void)
/* 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 */
@@ -2460,7 +2468,7 @@ static void dag_id_flush_update(Scene *sce, ID *id)
/* 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 @@ static void dag_id_flush_update(Scene *sce, ID *id)
}
/* update editors */
- dag_editors_update(bmain, id);
+ dag_editors_id_update(bmain, id);
}
}
@@ -2612,10 +2620,10 @@ void DAG_ids_flush_tagged(Main *bmain)
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,13 +2635,13 @@ void DAG_ids_check_recalc(Main *bmain)
/* 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)
{
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index b7aa02b2f7b..c284ed02868 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1028,15 +1028,11 @@ void scene_update_tagged(Main *bmain, Scene *scene)
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 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
/* 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);
}
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index 7461f5e9e9f..73776f7234b 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -36,6 +36,7 @@ struct Main;
struct MTex;
struct Render;
struct RenderInfo;
+struct Scene;
/* render_ops.c */
@@ -45,7 +46,7 @@ void ED_operatortypes_render(void);
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 */
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index f353a090305..d921308aad5 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -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,13 +66,25 @@
/***************************** 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) {
@@ -88,7 +101,7 @@ void ED_render_engine_update_tagged(bContext *C, Main *bmain)
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 @@ void ED_render_engine_update_tagged(bContext *C, Main *bmain)
}
}
- 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 @@ void ED_render_engine_changed(Main *bmain)
}
}
-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 @@ static void scene_changed(Main *bmain, Scene *UNUSED(scene))
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);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 9d0149726c3..14e518da4b5 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -69,7 +69,6 @@ static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
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)
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index a7c3e973a39..5d48a3c7a7f 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -321,10 +321,6 @@ void wm_event_do_notifiers(bContext *C)
win->screen->scene->customdata_mask |= win->screen->scene->customdata_mask_modal;
scene_update_tagged(bmain, win->screen->scene);
-
- ED_render_engine_update_tagged(C, bmain);
-
- scene_clear_tagged(bmain, win->screen->scene);
}
}
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 0795bc8deee..2695f3d680d 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -132,7 +132,7 @@ void WM_init(bContext *C, int argc, const char **argv)
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
set_blender_test_break_cb(wm_window_testbreak); /* blender.c */
- DAG_editors_update_cb(ED_render_id_flush_update); /* depsgraph.c */
+ DAG_editors_update_cb(ED_render_id_flush_update, ED_render_scene_update); /* depsgraph.c */
ED_spacetypes_init(); /* editors/space_api/spacetype.c */