diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-24 09:12:06 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-24 09:12:06 +0300 |
commit | 11428e0b7f7aafd3c6fa6b0cd0a77f4c1ff8e48c (patch) | |
tree | 95ac27ca3b90c0297296f7251948efbc72af1f71 /source/blender/draw/engines/basic | |
parent | 4d29312c66dd56498fbab35e2892944d33484461 (diff) |
DRW: use clipping for depth buffer
Object selection now supports clipping.
Diffstat (limited to 'source/blender/draw/engines/basic')
-rw-r--r-- | source/blender/draw/engines/basic/basic_engine.c | 34 |
1 files changed, 28 insertions, 6 deletions
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); + } } } |