diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-09-25 21:07:02 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-09-25 21:14:42 +0300 |
commit | 198c7d3687c16581a48701733c4fe4b511eaf149 (patch) | |
tree | 41ff532219804afff847ac234d3af0b07521a9e2 /source/blender/draw/intern | |
parent | 98dd2a518be52b7f94c3a6f9345f19a0aebb2284 (diff) |
DRW : Add new view_update mechanism.
This makes updates for the viewport cleaner and also add the possibility to add a new callback called when the scene is updated.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 49 |
2 files changed, 49 insertions, 2 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index b546631b8c3..428bea17f7c 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -136,6 +136,8 @@ typedef struct DrawEngineType { void (*draw_background)(void *vedata); void (*draw_scene)(void *vedata); + + void (*view_update)(void *vedata); } DrawEngineType; #ifndef __DRW_ENGINE_H__ diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 1f3be9b1f4d..eb19f99802a 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2549,6 +2549,8 @@ static void DRW_viewport_var_init(void) if (RST.bound_tex_slots == NULL) { RST.bound_tex_slots = MEM_callocN(sizeof(bool) * GPU_max_textures(), "Bound Texture Slots"); } + + memset(viewport_matrix_override.override, 0x0, sizeof(viewport_matrix_override.override)); } void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type) @@ -2615,8 +2617,7 @@ DefaultTextureList *DRW_viewport_texture_list_get(void) void DRW_viewport_request_redraw(void) { - /* XXXXXXXXXXX HAAAAAAAACKKKK */ - WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, NULL); + GPU_viewport_tag_update(DST.viewport); } /** \} */ @@ -3138,6 +3139,50 @@ static void DRW_debug_gpu_stats(void) DRW_stats_draw(&rect); } +/* -------------------------------------------------------------------- */ + +/** \name View Update + * \{ */ + +void DRW_notify_view_update(const bContext *C) +{ + struct Depsgraph *graph = CTX_data_depsgraph(C); + ARegion *ar = CTX_wm_region(C); + View3D *v3d = CTX_wm_view3d(C); + RegionView3D *rv3d = ar->regiondata; + Scene *scene = DEG_get_evaluated_scene(graph); + SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); + + if (rv3d->viewport == NULL) { + return; + } + + + /* Reset before using it. */ + memset(&DST, 0x0, sizeof(DST)); + + DST.viewport = rv3d->viewport; + DST.draw_ctx = (DRWContextState){ + ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C, + }; + + DRW_engines_enable(scene, sl); + + for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { + DrawEngineType *engine = link->data; + ViewportEngineData *data = DRW_viewport_engine_data_get(engine); + + if (engine->view_update) { + engine->view_update(data); + } + } + + DST.viewport = NULL; + + DRW_engines_disable(); +} + +/** \} */ /* -------------------------------------------------------------------- */ |