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:
authorClément Foucault <foucault.clem@gmail.com>2017-09-25 21:07:02 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-09-25 21:14:42 +0300
commit198c7d3687c16581a48701733c4fe4b511eaf149 (patch)
tree41ff532219804afff847ac234d3af0b07521a9e2 /source/blender/draw/intern
parent98dd2a518be52b7f94c3a6f9345f19a0aebb2284 (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.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c49
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();
+}
+
+/** \} */
/* -------------------------------------------------------------------- */