diff options
Diffstat (limited to 'source/blender/draw/intern/draw_manager.c')
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 85 |
1 files changed, 51 insertions, 34 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index bc9d0a3d02a..6e05572a20b 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -43,6 +43,7 @@ #include "DNA_camera_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_userdef_types.h" #include "DNA_world_types.h" #include "ED_gpencil.h" @@ -84,6 +85,7 @@ #include "draw_cache_impl.h" #include "engines/basic/basic_engine.h" +#include "engines/compositor/compositor_engine.h" #include "engines/eevee/eevee_engine.h" #include "engines/eevee_next/eevee_engine.h" #include "engines/external/external_engine.h" @@ -212,17 +214,6 @@ int DRW_object_visibility_in_active_context(const Object *ob) return BKE_object_visibility(ob, mode); } -bool DRW_object_is_flat_normal(const Object *ob) -{ - if (ob->type == OB_MESH) { - const Mesh *me = ob->data; - if (me->mpoly && me->mpoly[0].flag & ME_SMOOTH) { - return false; - } - } - return true; -} - bool DRW_object_use_hide_faces(const struct Object *ob) { if (ob->type == OB_MESH) { @@ -235,7 +226,7 @@ bool DRW_object_use_hide_faces(const struct Object *ob) return (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; case OB_MODE_VERTEX_PAINT: case OB_MODE_WEIGHT_PAINT: - return (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; + return true; } } @@ -1010,6 +1001,8 @@ static void drw_engines_init(void) static void drw_engines_cache_init(void) { + DRW_manager_begin_sync(); + DRW_ENABLED_ENGINE_ITER (DST.view_data_active, engine, data) { if (data->text_draw_cache) { DRW_text_cache_destroy(data->text_draw_cache); @@ -1081,6 +1074,8 @@ static void drw_engines_cache_finish(void) engine->cache_finish(data); } } + + DRW_manager_end_sync(); } static void drw_engines_draw_scene(void) @@ -1225,6 +1220,31 @@ static void drw_engines_enable_editors(void) } } +static bool is_compositor_enabled(void) +{ + if (!U.experimental.use_realtime_compositor) { + return false; + } + + if (!(DST.draw_ctx.v3d->shading.flag & V3D_SHADING_COMPOSITOR)) { + return false; + } + + if (!(DST.draw_ctx.v3d->shading.type >= OB_MATERIAL)) { + return false; + } + + if (!DST.draw_ctx.scene->use_nodes) { + return false; + } + + if (!DST.draw_ctx.scene->nodetree) { + return false; + } + + return true; +} + static void drw_engines_enable(ViewLayer *UNUSED(view_layer), RenderEngineType *engine_type, bool gpencil_engine_needed) @@ -1237,6 +1257,11 @@ static void drw_engines_enable(ViewLayer *UNUSED(view_layer), if (gpencil_engine_needed && ((drawtype >= OB_SOLID) || !use_xray)) { use_drw_engine(&draw_engine_gpencil_type); } + + if (is_compositor_enabled()) { + use_drw_engine(&draw_engine_compositor_type); + } + drw_engines_enable_overlays(); #ifdef WITH_DRAW_DEBUG @@ -1305,7 +1330,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx) .v3d = v3d, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .engine_type = engine_type, .depsgraph = depsgraph, .object_mode = OB_MODE_OBJECT, @@ -1323,11 +1348,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx) drw_engines_enable(view_layer, engine_type, gpencil_engine_needed); drw_engines_data_validate(); - DRW_ENABLED_ENGINE_ITER (DST.view_data_active, draw_engine, data) { - if (draw_engine->view_update) { - draw_engine->view_update(data); - } - } + DRW_view_data_engines_view_update(DST.view_data_active); drw_engines_disable(); } @@ -1362,7 +1383,7 @@ static void drw_notify_view_update_offscreen(struct Depsgraph *depsgraph, .v3d = v3d, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .engine_type = engine_type, .depsgraph = depsgraph, }; @@ -1379,11 +1400,7 @@ static void drw_notify_view_update_offscreen(struct Depsgraph *depsgraph, drw_engines_enable(view_layer, engine_type, gpencil_engine_needed); drw_engines_data_validate(); - DRW_ENABLED_ENGINE_ITER (DST.view_data_active, draw_engine, data) { - if (draw_engine->view_update) { - draw_engine->view_update(data); - } - } + DRW_view_data_engines_view_update(DST.view_data_active); drw_engines_disable(); } @@ -1608,7 +1625,6 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, GPUViewport *viewport, const bContext *evil_C) { - Scene *scene = DEG_get_evaluated_scene(depsgraph); ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); RegionView3D *rv3d = region->regiondata; @@ -1620,7 +1636,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph, .v3d = v3d, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .engine_type = engine_type, .depsgraph = depsgraph, @@ -2132,7 +2148,7 @@ void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph, .region = region, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .depsgraph = depsgraph, .space_data = CTX_wm_space_data(evil_C), @@ -2333,7 +2349,7 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph, Scene *scene = DEG_get_evaluated_scene(depsgraph); RenderEngineType *engine_type = ED_view3d_engine_type(scene, v3d->shading.type); ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); - Object *obact = OBACT(view_layer); + Object *obact = BKE_view_layer_active_object_get(view_layer); Object *obedit = use_obedit_skip ? NULL : OBEDIT_FROM_OBACT(obact); #ifndef USE_GPU_SELECT UNUSED_VARS(scene, view_layer, v3d, region, rect); @@ -2570,7 +2586,7 @@ static void drw_draw_depth_loop_impl(struct Depsgraph *depsgraph, .v3d = v3d, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .engine_type = engine_type, .depsgraph = depsgraph, }; @@ -2683,7 +2699,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons GPUViewport *viewport = WM_draw_region_get_viewport(region); if (!viewport) { /* Selection engine requires a viewport. - * TODO(germano): This should be done internally in the engine. */ + * TODO(@germano): This should be done internally in the engine. */ sel_ctx->is_dirty = true; sel_ctx->objects_drawn_len = 0; sel_ctx->index_drawn_len = 1; @@ -2703,7 +2719,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons .v3d = v3d, .scene = scene, .view_layer = view_layer, - .obact = OBACT(view_layer), + .obact = BKE_view_layer_active_object_get(view_layer), .depsgraph = depsgraph, }; drw_task_graph_init(); @@ -2959,6 +2975,7 @@ void DRW_engines_register(void) DRW_engine_register(&draw_engine_overlay_type); DRW_engine_register(&draw_engine_select_type); DRW_engine_register(&draw_engine_basic_type); + DRW_engine_register(&draw_engine_compositor_type); #ifdef WITH_DRAW_DEBUG DRW_engine_register(&draw_engine_debug_select_type); #endif @@ -2968,9 +2985,6 @@ void DRW_engines_register(void) /* setup callbacks */ { - BKE_mball_batch_cache_dirty_tag_cb = DRW_mball_batch_cache_dirty_tag; - BKE_mball_batch_cache_free_cb = DRW_mball_batch_cache_free; - BKE_curve_batch_cache_dirty_tag_cb = DRW_curve_batch_cache_dirty_tag; BKE_curve_batch_cache_free_cb = DRW_curve_batch_cache_free; @@ -3039,6 +3053,9 @@ void DRW_engines_free(void) DRW_stats_free(); DRW_globals_free(); + drw_debug_module_free(DST.debug); + DST.debug = NULL; + DRW_UBO_FREE_SAFE(G_draw.block_ubo); DRW_UBO_FREE_SAFE(G_draw.view_ubo); DRW_TEXTURE_FREE_SAFE(G_draw.ramp); |