Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-01-24 09:12:06 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-01-24 09:12:06 +0300
commit11428e0b7f7aafd3c6fa6b0cd0a77f4c1ff8e48c (patch)
tree95ac27ca3b90c0297296f7251948efbc72af1f71 /source/blender/draw/engines/basic
parent4d29312c66dd56498fbab35e2892944d33484461 (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.c34
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);
+ }
}
}