From 11428e0b7f7aafd3c6fa6b0cd0a77f4c1ff8e48c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 24 Jan 2019 17:12:06 +1100 Subject: DRW: use clipping for depth buffer Object selection now supports clipping. --- source/blender/draw/engines/basic/basic_engine.c | 34 +++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'source/blender/draw/engines/basic/basic_engine.c') diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index 0ee6853409a..7f4da54e63d 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -66,11 +66,15 @@ typedef struct BASIC_Data { BASIC_StorageList *stl; } BASIC_Data; +typedef struct BASIC_Shaders { + /* Depth Pre Pass */ + struct GPUShader *depth; +} BASIC_Shaders; + /* *********** STATIC *********** */ static struct { - /* Depth Pre Pass */ - struct GPUShader *depth_sh; + BASIC_Shaders sh_data[DRW_SHADER_SLOT_LEN]; } e_data = {NULL}; /* Engine data */ typedef struct BASIC_PrivateData { @@ -83,9 +87,12 @@ typedef struct BASIC_PrivateData { static void basic_engine_init(void *UNUSED(vedata)) { + const DRWContextState *draw_ctx = DRW_context_state_get(); + BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; + /* Depth prepass */ - if (!e_data.depth_sh) { - e_data.depth_sh = DRW_shader_create_3D_depth_only(); + if (!sh_data->depth) { + sh_data->depth = DRW_shader_create_3D_depth_only(draw_ctx->shader_slot); } } @@ -94,6 +101,15 @@ static void basic_cache_init(void *vedata) BASIC_PassList *psl = ((BASIC_Data *)vedata)->psl; BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; + const DRWContextState *draw_ctx = DRW_context_state_get(); + BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; + const RegionView3D *rv3d = draw_ctx->rv3d; + const bool is_clip = (rv3d->rflag & RV3D_CLIPPING) != 0; + + if (is_clip) { + DRW_state_clip_planes_set_from_rv3d(draw_ctx->rv3d); + } + if (!stl->g_data) { /* Alloc transient pointers */ stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); @@ -102,12 +118,18 @@ static void basic_cache_init(void *vedata) { psl->depth_pass = DRW_pass_create( "Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WIRE); - stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + stl->g_data->depth_shgrp = DRW_shgroup_create(sh_data->depth, psl->depth_pass); + if (rv3d->rflag & RV3D_CLIPPING) { + DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->depth_shgrp, rv3d); + } psl->depth_pass_cull = DRW_pass_create( "Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK); - stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + stl->g_data->depth_shgrp_cull = DRW_shgroup_create(sh_data->depth, psl->depth_pass_cull); + if (rv3d->rflag & RV3D_CLIPPING) { + DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->depth_shgrp_cull, rv3d); + } } } -- cgit v1.2.3