Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Show First 20 Lines • Show All 2,693 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| GPU_viewport_tag_update(DST.viewport); | GPU_viewport_tag_update(DST.viewport); | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name SceneLayers (DRW_scenelayer) | /** \name ViewLayers (DRW_scenelayer) | ||||
| * \{ */ | * \{ */ | ||||
| void **DRW_scene_layer_engine_data_get(DrawEngineType *engine_type, void (*callback)(void *storage)) | void **DRW_view_layer_engine_data_get(DrawEngineType *engine_type, void (*callback)(void *storage)) | ||||
| { | { | ||||
| SceneLayerEngineData *sled; | ViewLayerEngineData *sled; | ||||
| for (sled = DST.draw_ctx.scene_layer->drawdata.first; sled; sled = sled->next) { | for (sled = DST.draw_ctx.view_layer->drawdata.first; sled; sled = sled->next) { | ||||
| if (sled->engine_type == engine_type) { | if (sled->engine_type == engine_type) { | ||||
| return &sled->storage; | return &sled->storage; | ||||
| } | } | ||||
| } | } | ||||
| sled = MEM_callocN(sizeof(SceneLayerEngineData), "SceneLayerEngineData"); | sled = MEM_callocN(sizeof(ViewLayerEngineData), "ViewLayerEngineData"); | ||||
| sled->engine_type = engine_type; | sled->engine_type = engine_type; | ||||
| sled->free = callback; | sled->free = callback; | ||||
| BLI_addtail(&DST.draw_ctx.scene_layer->drawdata, sled); | BLI_addtail(&DST.draw_ctx.view_layer->drawdata, sled); | ||||
| return &sled->storage; | return &sled->storage; | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| ▲ Show 20 Lines • Show All 330 Lines • ▼ Show 20 Lines | |||||
| /** | /** | ||||
| * Use for external render engines. | * Use for external render engines. | ||||
| */ | */ | ||||
| static void DRW_engines_enable_external(void) | static void DRW_engines_enable_external(void) | ||||
| { | { | ||||
| use_drw_engine(DRW_engine_viewport_external_type.draw_engine); | use_drw_engine(DRW_engine_viewport_external_type.draw_engine); | ||||
| } | } | ||||
| static void DRW_engines_enable(const Scene *scene, SceneLayer *scene_layer, RenderEngineType *engine) | static void DRW_engines_enable(const Scene *scene, ViewLayer *view_layer, RenderEngineType *engine) | ||||
| { | { | ||||
| Object *obact = OBACT(scene_layer); | Object *obact = OBACT(view_layer); | ||||
| const int mode = CTX_data_mode_enum_ex(scene->obedit, obact); | const int mode = CTX_data_mode_enum_ex(scene->obedit, obact); | ||||
| DRW_engines_enable_from_engine(engine); | DRW_engines_enable_from_engine(engine); | ||||
| if (DRW_state_draw_support()) { | if (DRW_state_draw_support()) { | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| DRW_engines_enable_from_mode(mode); | DRW_engines_enable_from_mode(mode); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 146 Lines • ▼ Show 20 Lines | |||||
| void DRW_notify_view_update(const bContext *C) | void DRW_notify_view_update(const bContext *C) | ||||
| { | { | ||||
| struct Depsgraph *graph = CTX_data_depsgraph(C); | struct Depsgraph *graph = CTX_data_depsgraph(C); | ||||
| ARegion *ar = CTX_wm_region(C); | ARegion *ar = CTX_wm_region(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| RenderEngineType *engine = CTX_data_engine(C); | RenderEngineType *engine = CTX_data_engine(C); | ||||
| SceneLayer *scene_layer = CTX_data_scene_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| if (rv3d->viewport == NULL) { | if (rv3d->viewport == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| DST.viewport = rv3d->viewport; | DST.viewport = rv3d->viewport; | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, scene_layer, OBACT(scene_layer), engine, C, | ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine, C, | ||||
| }; | }; | ||||
| DRW_engines_enable(scene, scene_layer, engine); | DRW_engines_enable(scene, view_layer, engine); | ||||
| for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | ||||
| DrawEngineType *draw_engine = link->data; | DrawEngineType *draw_engine = link->data; | ||||
| ViewportEngineData *data = DRW_viewport_engine_data_get(draw_engine); | ViewportEngineData *data = DRW_viewport_engine_data_get(draw_engine); | ||||
| if (draw_engine->view_update) { | if (draw_engine->view_update) { | ||||
| draw_engine->view_update(data); | draw_engine->view_update(data); | ||||
| } | } | ||||
| Show All 32 Lines | |||||
| */ | */ | ||||
| void DRW_draw_render_loop_ex( | void DRW_draw_render_loop_ex( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, | ||||
| RenderEngineType *engine, | RenderEngineType *engine, | ||||
| ARegion *ar, View3D *v3d, | ARegion *ar, View3D *v3d, | ||||
| const bContext *evil_C) | const bContext *evil_C) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph); | ViewLayer *view_layer = DEG_get_evaluated_view_layer(graph); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| DST.draw_ctx.evil_C = evil_C; | DST.draw_ctx.evil_C = evil_C; | ||||
| DST.viewport = rv3d->viewport; | DST.viewport = rv3d->viewport; | ||||
| v3d->zbuf = true; | v3d->zbuf = true; | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| GPU_viewport_engines_data_validate(DST.viewport, DRW_engines_get_hash()); | GPU_viewport_engines_data_validate(DST.viewport, DRW_engines_get_hash()); | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, scene_layer, OBACT(scene_layer), engine, | ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine, | ||||
| /* reuse if caller sets */ | /* reuse if caller sets */ | ||||
| DST.draw_ctx.evil_C, | DST.draw_ctx.evil_C, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Get list of enabled engines */ | /* Get list of enabled engines */ | ||||
| DRW_engines_enable(scene, scene_layer, engine); | DRW_engines_enable(scene, view_layer, engine); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| DRW_engines_init(); | DRW_engines_init(); | ||||
| /* TODO : tag to refresh by the deps graph */ | /* TODO : tag to refresh by the deps graph */ | ||||
| ▲ Show 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | |||||
| */ | */ | ||||
| void DRW_draw_select_loop( | void DRW_draw_select_loop( | ||||
| struct Depsgraph *graph, | struct Depsgraph *graph, | ||||
| ARegion *ar, View3D *v3d, | ARegion *ar, View3D *v3d, | ||||
| bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect) | bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | ||||
| SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph); | ViewLayer *view_layer = DEG_get_evaluated_view_layer(graph); | ||||
| #ifndef USE_GPU_SELECT | #ifndef USE_GPU_SELECT | ||||
| UNUSED_VARS(vc, scene, scene_layer, v3d, ar, rect); | UNUSED_VARS(vc, scene, view_layer, v3d, ar, rect); | ||||
| #else | #else | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| /* backup (_never_ use rv3d->viewport) */ | /* backup (_never_ use rv3d->viewport) */ | ||||
| void *backup_viewport = rv3d->viewport; | void *backup_viewport = rv3d->viewport; | ||||
| Show All 32 Lines | else { | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| } | } | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| cache_is_dirty = true; | cache_is_dirty = true; | ||||
| /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, scene_layer, OBACT(scene_layer), engine, (bContext *)NULL, | ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine, (bContext *)NULL, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| ▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
| * object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing). | * object mode select-loop, see: ED_view3d_draw_depth_loop (legacy drawing). | ||||
| */ | */ | ||||
| void DRW_draw_depth_loop( | void DRW_draw_depth_loop( | ||||
| Depsgraph *graph, | Depsgraph *graph, | ||||
| ARegion *ar, View3D *v3d) | ARegion *ar, View3D *v3d) | ||||
| { | { | ||||
| Scene *scene = DEG_get_evaluated_scene(graph); | Scene *scene = DEG_get_evaluated_scene(graph); | ||||
| RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id); | ||||
| SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph); | ViewLayer *view_layer = DEG_get_evaluated_view_layer(graph); | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* backup (_never_ use rv3d->viewport) */ | /* backup (_never_ use rv3d->viewport) */ | ||||
| void *backup_viewport = rv3d->viewport; | void *backup_viewport = rv3d->viewport; | ||||
| rv3d->viewport = NULL; | rv3d->viewport = NULL; | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| memset(&DST, 0x0, sizeof(DST)); | memset(&DST, 0x0, sizeof(DST)); | ||||
| Show All 13 Lines | /* Get list of enabled engines */ | ||||
| DRW_engines_enable_from_object_mode(); | DRW_engines_enable_from_object_mode(); | ||||
| } | } | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| cache_is_dirty = true; | cache_is_dirty = true; | ||||
| /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | /* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */ | ||||
| DST.draw_ctx = (DRWContextState){ | DST.draw_ctx = (DRWContextState){ | ||||
| ar, rv3d, v3d, scene, scene_layer, OBACT(scene_layer), engine, (bContext *)NULL, | ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine, (bContext *)NULL, | ||||
| }; | }; | ||||
| DRW_viewport_var_init(); | DRW_viewport_var_init(); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| /* Init engines */ | /* Init engines */ | ||||
| ▲ Show 20 Lines • Show All 231 Lines • Show Last 20 Lines | |||||