diff options
Diffstat (limited to 'source/blender/draw/engines')
4 files changed, 33 insertions, 0 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index 0d17c4a5c5d..931dfd63088 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -28,6 +28,8 @@ #include "UI_resources.h" +#include "GPU_batch.h" + void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info) { @@ -118,6 +120,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd) if (rv3d->rflag & RV3D_CLIPPING) { wpd->world_clip_planes = rv3d->clip; DRW_state_clip_planes_set_from_rv3d(rv3d); + UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, wpd->world_clip_planes_color); } else { wpd->world_clip_planes = NULL; @@ -212,4 +215,5 @@ void workbench_private_data_free(WORKBENCH_PrivateData *wpd) { BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN); DRW_UBO_FREE_SAFE(wpd->world_ubo); + GPU_BATCH_DISCARD_SAFE(wpd->world_clip_planes_batch); } diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index af6b83679ea..44bc35bfc41 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -640,6 +640,17 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx); } DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL); + + if (draw_ctx->rv3d && + (draw_ctx->rv3d->rflag & RV3D_CLIPPING) && + draw_ctx->rv3d->clipbb) + { + GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND); + grp = DRW_shgroup_create(shader, psl->background_pass); + wpd->world_clip_planes_batch = DRW_draw_background_clipping_batch_from_rv3d(draw_ctx->rv3d); + DRW_shgroup_call_add(grp, wpd->world_clip_planes_batch, NULL); + DRW_shgroup_uniform_vec4(grp, "color", &wpd->world_clip_planes_color[0], 1); + } } /* Deferred Mix Pass */ diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 3ced267ce89..c8f3a9a7bff 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -364,6 +364,16 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL); } + if (draw_ctx->rv3d && (draw_ctx->rv3d->rflag & RV3D_CLIPPING) && draw_ctx->rv3d->clipbb) { + psl->background_pass = DRW_pass_create( + "Background", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL); + GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND); + grp = DRW_shgroup_create(shader, psl->background_pass); + wpd->world_clip_planes_batch = DRW_draw_background_clipping_batch_from_rv3d(draw_ctx->rv3d); + DRW_shgroup_call_add(grp, wpd->world_clip_planes_batch, NULL); + DRW_shgroup_uniform_vec4(grp, "color", &wpd->world_clip_planes_color[0], 1); + } + { workbench_aa_create_pass(vedata, &e_data.transparent_accum_tx); } @@ -642,6 +652,11 @@ void workbench_forward_draw_scene(WORKBENCH_Data *vedata) DRW_draw_pass(psl->composite_pass); DRW_draw_pass(psl->volume_pass); + /* Only when clipping is enabled. */ + if (psl->background_pass) { + DRW_draw_pass(psl->background_pass); + } + /* Color correct and Anti aliasing */ workbench_aa_draw_pass(vedata, e_data.composite_buffer_tx); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 0dc4078f888..bbcae7f81d4 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -126,6 +126,7 @@ typedef struct WORKBENCH_PassList { struct DRWPass *composite_pass; struct DRWPass *composite_shadow_pass; struct DRWPass *background_pass; + struct DRWPass *background_pass_clip; struct DRWPass *ghost_resolve_pass; struct DRWPass *effect_aa_pass; struct DRWPass *volume_pass; @@ -204,6 +205,8 @@ typedef struct WORKBENCH_PrivateData { bool is_playback; float (*world_clip_planes)[4]; + struct GPUBatch *world_clip_planes_batch; + float world_clip_planes_color[4]; /* Volumes */ bool volumes_do; |