Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Show First 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | |||||
| #include "wm_window.h" | #include "wm_window.h" | ||||
| #include "draw_manager_text.h" | #include "draw_manager_text.h" | ||||
| #include "draw_manager_profiling.h" | #include "draw_manager_profiling.h" | ||||
| /* only for callbacks */ | /* only for callbacks */ | ||||
| #include "draw_cache_impl.h" | #include "draw_cache_impl.h" | ||||
| #include "draw_mode_engines.h" | |||||
| #include "engines/eevee/eevee_engine.h" | #include "engines/eevee/eevee_engine.h" | ||||
| #include "engines/basic/basic_engine.h" | #include "engines/basic/basic_engine.h" | ||||
| #include "engines/workbench/workbench_engine.h" | #include "engines/workbench/workbench_engine.h" | ||||
| #include "engines/external/external_engine.h" | #include "engines/external/external_engine.h" | ||||
| #include "engines/gpencil/gpencil_engine.h" | #include "engines/gpencil/gpencil_engine.h" | ||||
| #include "engines/select/select_engine.h" | #include "engines/select/select_engine.h" | ||||
| #include "engines/overlay/overlay_engine.h" | |||||
| #include "GPU_context.h" | #include "GPU_context.h" | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| #include "DEG_depsgraph_query.h" | #include "DEG_depsgraph_query.h" | ||||
| #include "DRW_select_buffer.h" | #include "DRW_select_buffer.h" | ||||
| ▲ Show 20 Lines • Show All 496 Lines • ▼ Show 20 Lines | static void draw_unit_state_create(void) | ||||
| unit_m4(mats->model); | unit_m4(mats->model); | ||||
| unit_m4(mats->modelinverse); | unit_m4(mats->modelinverse); | ||||
| copy_v3_fl(infos->orcotexfac[0], 0.0f); | copy_v3_fl(infos->orcotexfac[0], 0.0f); | ||||
| copy_v3_fl(infos->orcotexfac[1], 1.0f); | copy_v3_fl(infos->orcotexfac[1], 1.0f); | ||||
| infos->ob_index = 0; | infos->ob_index = 0; | ||||
| infos->ob_random = 0.0f; | infos->ob_random = 0.0f; | ||||
| infos->ob_neg_scale = 1.0f; | infos->ob_flag = 1.0f; | ||||
| copy_v3_fl(infos->ob_color, 1.0f); | copy_v3_fl(infos->ob_color, 1.0f); | ||||
| /* TODO(fclem) get rid of this. */ | /* TODO(fclem) get rid of this. */ | ||||
| culling->bsphere.radius = -1.0f; | culling->bsphere.radius = -1.0f; | ||||
| culling->user_data = NULL; | culling->user_data = NULL; | ||||
| DRW_handle_increment(&DST.resource_handle); | DRW_handle_increment(&DST.resource_handle); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 716 Lines • ▼ Show 20 Lines | default: | ||||
| if ((engine_type->flag & RE_INTERNAL) == 0) { | if ((engine_type->flag & RE_INTERNAL) == 0) { | ||||
| drw_engines_enable_external(); | drw_engines_enable_external(); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static void drw_engines_enable_from_object_mode(void) | static void drw_engines_enable_overlays(void) | ||||
| { | |||||
| use_drw_engine(&draw_engine_object_type); | |||||
| /* TODO(fclem) remove this, it does not belong to it's own engine. */ | |||||
| use_drw_engine(&draw_engine_motion_path_type); | |||||
| } | |||||
| static void drw_engines_enable_from_paint_mode(int mode) | |||||
| { | |||||
| switch (mode) { | |||||
| case CTX_MODE_SCULPT: | |||||
| use_drw_engine(&draw_engine_sculpt_type); | |||||
| break; | |||||
| case CTX_MODE_PAINT_WEIGHT: | |||||
| case CTX_MODE_PAINT_VERTEX: | |||||
| use_drw_engine(&draw_engine_paint_vertex_type); | |||||
| break; | |||||
| case CTX_MODE_PAINT_TEXTURE: | |||||
| use_drw_engine(&draw_engine_paint_texture_type); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } | |||||
| static void drw_engines_enable_from_mode(int mode) | |||||
| { | |||||
| switch (mode) { | |||||
| case CTX_MODE_EDIT_MESH: | |||||
| use_drw_engine(&draw_engine_edit_mesh_type); | |||||
| break; | |||||
| case CTX_MODE_EDIT_SURFACE: | |||||
| case CTX_MODE_EDIT_CURVE: | |||||
| use_drw_engine(&draw_engine_edit_curve_type); | |||||
| break; | |||||
| case CTX_MODE_EDIT_TEXT: | |||||
| use_drw_engine(&draw_engine_edit_text_type); | |||||
| break; | |||||
| case CTX_MODE_EDIT_ARMATURE: | |||||
| use_drw_engine(&draw_engine_edit_armature_type); | |||||
| break; | |||||
| case CTX_MODE_EDIT_METABALL: | |||||
| use_drw_engine(&draw_engine_edit_metaball_type); | |||||
| break; | |||||
| case CTX_MODE_EDIT_LATTICE: | |||||
| use_drw_engine(&draw_engine_edit_lattice_type); | |||||
| break; | |||||
| case CTX_MODE_PARTICLE: | |||||
| use_drw_engine(&draw_engine_particle_type); | |||||
| break; | |||||
| case CTX_MODE_POSE: | |||||
| case CTX_MODE_PAINT_WEIGHT: | |||||
| /* The pose engine clears the depth of the default framebuffer | |||||
| * to draw an object with `OB_DRAWXRAY`. | |||||
| * (different of workbench that has its own framebuffer). | |||||
| * So make sure you call its `draw_scene` after all the other engines. */ | |||||
| use_drw_engine(&draw_engine_pose_type); | |||||
| break; | |||||
| case CTX_MODE_SCULPT: | |||||
| case CTX_MODE_PAINT_VERTEX: | |||||
| case CTX_MODE_PAINT_TEXTURE: | |||||
| case CTX_MODE_OBJECT: | |||||
| case CTX_MODE_PAINT_GPENCIL: | |||||
| case CTX_MODE_EDIT_GPENCIL: | |||||
| case CTX_MODE_SCULPT_GPENCIL: | |||||
| case CTX_MODE_WEIGHT_GPENCIL: | |||||
| break; | |||||
| default: | |||||
| BLI_assert(!"Draw mode invalid"); | |||||
| break; | |||||
| } | |||||
| } | |||||
| static void drw_engines_enable_from_overlays(int UNUSED(overlay_flag)) | |||||
| { | { | ||||
| use_drw_engine(&draw_engine_overlay_type); | use_drw_engine(&draw_engine_overlay_type); | ||||
| } | } | ||||
| /** | /** | ||||
| * Use for select and depth-drawing. | * Use for select and depth-drawing. | ||||
| */ | */ | ||||
| static void drw_engines_enable_basic(void) | static void drw_engines_enable_basic(void) | ||||
| { | { | ||||
| use_drw_engine(DRW_engine_viewport_basic_type.draw_engine); | use_drw_engine(DRW_engine_viewport_basic_type.draw_engine); | ||||
| } | } | ||||
| static void drw_engines_enable(ViewLayer *view_layer, | static void drw_engines_enable(ViewLayer *UNUSED(view_layer), | ||||
| RenderEngineType *engine_type, | RenderEngineType *engine_type, | ||||
| bool gpencil_engine_needed) | bool gpencil_engine_needed) | ||||
| { | { | ||||
| Object *obact = OBACT(view_layer); | |||||
| const enum eContextObjectMode mode = CTX_data_mode_enum_ex( | |||||
| DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode); | |||||
| View3D *v3d = DST.draw_ctx.v3d; | View3D *v3d = DST.draw_ctx.v3d; | ||||
| const int drawtype = v3d->shading.type; | const int drawtype = v3d->shading.type; | ||||
| const bool use_xray = XRAY_ENABLED(v3d); | const bool use_xray = XRAY_ENABLED(v3d); | ||||
| drw_engines_enable_from_engine(engine_type, drawtype, use_xray); | drw_engines_enable_from_engine(engine_type, drawtype, use_xray); | ||||
| /* grease pencil */ | |||||
| if (gpencil_engine_needed) { | if (gpencil_engine_needed) { | ||||
| use_drw_engine(&draw_engine_gpencil_type); | use_drw_engine(&draw_engine_gpencil_type); | ||||
| } | } | ||||
| drw_engines_enable_overlays(); | |||||
| if (DRW_state_draw_support()) { | |||||
| /* Draw paint modes first so that they are drawn below the wireframes. */ | |||||
| drw_engines_enable_from_paint_mode(mode); | |||||
| drw_engines_enable_from_overlays(v3d->overlay.flag); | |||||
| drw_engines_enable_from_object_mode(); | |||||
| drw_engines_enable_from_mode(mode); | |||||
| } | |||||
| else { | |||||
| /* Force enable overlays engine for wireframe mode */ | |||||
| if (v3d->shading.type == OB_WIRE) { | |||||
| drw_engines_enable_from_overlays(v3d->overlay.flag); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| static void drw_engines_disable(void) | static void drw_engines_disable(void) | ||||
| { | { | ||||
| BLI_freelistN(&DST.enabled_engines); | BLI_freelistN(&DST.enabled_engines); | ||||
| } | } | ||||
| static void drw_engines_data_validate(void) | static void drw_engines_data_validate(void) | ||||
| ▲ Show 20 Lines • Show All 776 Lines • ▼ Show 20 Lines | |||||
| #else | #else | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| drw_state_prepare_clean_for_draw(&DST); | drw_state_prepare_clean_for_draw(&DST); | ||||
| bool use_obedit = false; | bool use_obedit = false; | ||||
| /* obedit_ctx_mode is used for selecting the right draw engines */ | /* obedit_ctx_mode is used for selecting the right draw engines */ | ||||
| eContextObjectMode obedit_ctx_mode; | // eContextObjectMode obedit_ctx_mode; | ||||
| /* object_mode is used for filtering objects in the depsgraph */ | /* object_mode is used for filtering objects in the depsgraph */ | ||||
| eObjectMode object_mode; | eObjectMode object_mode; | ||||
| int object_type = 0; | int object_type = 0; | ||||
| if (obedit != NULL) { | if (obedit != NULL) { | ||||
| object_type = obedit->type; | object_type = obedit->type; | ||||
| object_mode = obedit->mode; | object_mode = obedit->mode; | ||||
| if (obedit->type == OB_MBALL) { | if (obedit->type == OB_MBALL) { | ||||
| use_obedit = true; | use_obedit = true; | ||||
| obedit_ctx_mode = CTX_MODE_EDIT_METABALL; | // obedit_ctx_mode = CTX_MODE_EDIT_METABALL; | ||||
| } | } | ||||
| else if (obedit->type == OB_ARMATURE) { | else if (obedit->type == OB_ARMATURE) { | ||||
| use_obedit = true; | use_obedit = true; | ||||
| obedit_ctx_mode = CTX_MODE_EDIT_ARMATURE; | // obedit_ctx_mode = CTX_MODE_EDIT_ARMATURE; | ||||
| } | } | ||||
| } | } | ||||
| if (v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT) { | if (v3d->overlay.flag & V3D_OVERLAY_BONE_SELECT) { | ||||
| if (!(v3d->flag2 & V3D_HIDE_OVERLAYS)) { | if (!(v3d->flag2 & V3D_HIDE_OVERLAYS)) { | ||||
| /* Note: don't use "BKE_object_pose_armature_get" here, it breaks selection. */ | /* Note: don't use "BKE_object_pose_armature_get" here, it breaks selection. */ | ||||
| Object *obpose = OBPOSE_FROM_OBACT(obact); | Object *obpose = OBPOSE_FROM_OBACT(obact); | ||||
| if (obpose == NULL) { | if (obpose == NULL) { | ||||
| Object *obweight = OBWEIGHTPAINT_FROM_OBACT(obact); | Object *obweight = OBWEIGHTPAINT_FROM_OBACT(obact); | ||||
| if (obweight) { | if (obweight) { | ||||
| /* Only use Armature pose selection, when connected armature is in pose mode. */ | /* Only use Armature pose selection, when connected armature is in pose mode. */ | ||||
| Object *ob_armature = modifiers_isDeformedByArmature(obweight); | Object *ob_armature = modifiers_isDeformedByArmature(obweight); | ||||
| if (ob_armature && ob_armature->mode == OB_MODE_POSE) { | if (ob_armature && ob_armature->mode == OB_MODE_POSE) { | ||||
| obpose = ob_armature; | obpose = ob_armature; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (obpose) { | if (obpose) { | ||||
| use_obedit = true; | use_obedit = true; | ||||
| object_type = obpose->type; | object_type = obpose->type; | ||||
| object_mode = obpose->mode; | object_mode = obpose->mode; | ||||
| obedit_ctx_mode = CTX_MODE_POSE; | // obedit_ctx_mode = CTX_MODE_POSE; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| int viewport_size[2] = {BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)}; | int viewport_size[2] = {BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)}; | ||||
| struct GPUViewport *viewport = GPU_viewport_create(); | struct GPUViewport *viewport = GPU_viewport_create(); | ||||
| GPU_viewport_size_set(viewport, viewport_size); | GPU_viewport_size_set(viewport, viewport_size); | ||||
| DST.viewport = viewport; | DST.viewport = viewport; | ||||
| DST.options.is_select = true; | DST.options.is_select = true; | ||||
| /* Get list of enabled engines */ | /* Get list of enabled engines */ | ||||
| if (use_obedit) { | if (use_obedit) { | ||||
| drw_engines_enable_from_paint_mode(obedit_ctx_mode); | drw_engines_enable_overlays(); | ||||
| drw_engines_enable_from_mode(obedit_ctx_mode); | |||||
| } | } | ||||
| else if (!draw_surface) { | else if (!draw_surface) { | ||||
| /* grease pencil selection */ | /* grease pencil selection */ | ||||
| use_drw_engine(&draw_engine_gpencil_type); | use_drw_engine(&draw_engine_gpencil_type); | ||||
| drw_engines_enable_from_overlays(v3d->overlay.flag); | drw_engines_enable_overlays(); | ||||
| drw_engines_enable_from_object_mode(); | |||||
| } | } | ||||
| else { | else { | ||||
| /* Draw surface for occlusion. */ | |||||
| drw_engines_enable_basic(); | drw_engines_enable_basic(); | ||||
| /* grease pencil selection */ | /* grease pencil selection */ | ||||
| use_drw_engine(&draw_engine_gpencil_type); | use_drw_engine(&draw_engine_gpencil_type); | ||||
| drw_engines_enable_from_overlays(v3d->overlay.flag); | drw_engines_enable_overlays(); | ||||
| drw_engines_enable_from_object_mode(); | |||||
| } | } | ||||
| drw_engines_data_validate(); | drw_engines_data_validate(); | ||||
| /* Setup viewport */ | /* Setup viewport */ | ||||
| /* 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 = ar, | .ar = ar, | ||||
| ▲ Show 20 Lines • Show All 237 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| /* Reset before using it. */ | /* Reset before using it. */ | ||||
| drw_state_prepare_clean_for_draw(&DST); | drw_state_prepare_clean_for_draw(&DST); | ||||
| /* Get list of enabled engines */ | /* Get list of enabled engines */ | ||||
| { | { | ||||
| drw_engines_enable_basic(); | drw_engines_enable_basic(); | ||||
| if (DRW_state_draw_support()) { | if (DRW_state_draw_support()) { | ||||
| drw_engines_enable_from_object_mode(); | drw_engines_enable_overlays(); | ||||
| } | } | ||||
| } | } | ||||
| drw_draw_depth_loop_imp(depsgraph, ar, v3d, viewport, use_opengl_context); | drw_draw_depth_loop_imp(depsgraph, ar, v3d, viewport, use_opengl_context); | ||||
| } | } | ||||
| /** | /** | ||||
| * Converted from ED_view3d_draw_depth_gpencil (legacy drawing). | * Converted from ED_view3d_draw_depth_gpencil (legacy drawing). | ||||
| ▲ Show 20 Lines • Show All 286 Lines • ▼ Show 20 Lines | |||||
| void DRW_engines_register(void) | void DRW_engines_register(void) | ||||
| { | { | ||||
| RE_engines_register(&DRW_engine_viewport_eevee_type); | RE_engines_register(&DRW_engine_viewport_eevee_type); | ||||
| RE_engines_register(&DRW_engine_viewport_workbench_type); | RE_engines_register(&DRW_engine_viewport_workbench_type); | ||||
| DRW_engine_register(&draw_engine_workbench_solid); | DRW_engine_register(&draw_engine_workbench_solid); | ||||
| DRW_engine_register(&draw_engine_workbench_transparent); | DRW_engine_register(&draw_engine_workbench_transparent); | ||||
| DRW_engine_register(&draw_engine_object_type); | |||||
| DRW_engine_register(&draw_engine_edit_armature_type); | |||||
| DRW_engine_register(&draw_engine_edit_curve_type); | |||||
| DRW_engine_register(&draw_engine_edit_lattice_type); | |||||
| DRW_engine_register(&draw_engine_edit_mesh_type); | |||||
| DRW_engine_register(&draw_engine_edit_metaball_type); | |||||
| DRW_engine_register(&draw_engine_edit_text_type); | |||||
| DRW_engine_register(&draw_engine_motion_path_type); | |||||
| DRW_engine_register(&draw_engine_overlay_type); | |||||
| DRW_engine_register(&draw_engine_paint_texture_type); | |||||
| DRW_engine_register(&draw_engine_paint_vertex_type); | |||||
| DRW_engine_register(&draw_engine_particle_type); | |||||
| DRW_engine_register(&draw_engine_pose_type); | |||||
| DRW_engine_register(&draw_engine_sculpt_type); | |||||
| DRW_engine_register(&draw_engine_gpencil_type); | DRW_engine_register(&draw_engine_gpencil_type); | ||||
| DRW_engine_register(&draw_engine_overlay_type); | |||||
| DRW_engine_register(&draw_engine_select_type); | DRW_engine_register(&draw_engine_select_type); | ||||
| /* setup callbacks */ | /* setup callbacks */ | ||||
| { | { | ||||
| BKE_mball_batch_cache_dirty_tag_cb = DRW_mball_batch_cache_dirty_tag; | 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_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_dirty_tag_cb = DRW_curve_batch_cache_dirty_tag; | ||||
| ▲ Show 20 Lines • Show All 191 Lines • Show Last 20 Lines | |||||