Commit: 11428e0b7f7aafd3c6fa6b0cd0a77f4c1ff8e48c
Author: Campbell Barton
Date:   Thu Jan 24 17:12:06 2019 +1100
Branches: master
https://developer.blender.org/rB11428e0b7f7aafd3c6fa6b0cd0a77f4c1ff8e48c

DRW: use clipping for depth buffer

Object selection now supports clipping.

===================================================================

M       source/blender/draw/engines/basic/basic_engine.c
M       source/blender/draw/engines/external/external_engine.c
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_builtin_shader.c
M       source/blender/draw/intern/draw_manager_shader.c
M       source/blender/draw/modes/edit_mesh_mode.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);
+               }
        }
 }
 
diff --git a/source/blender/draw/engines/external/external_engine.c 
b/source/blender/draw/engines/external/external_engine.c
index c7d5b4a49e1..f0a83b7c926 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -103,7 +103,7 @@ static void external_engine_init(void *UNUSED(vedata))
 {
        /* Depth prepass */
        if (!e_data.depth_sh) {
-               e_data.depth_sh = DRW_shader_create_3D_depth_only();
+               e_data.depth_sh = 
DRW_shader_create_3D_depth_only(DRW_SHADER_SLOT_DEFAULT);
        }
 }
 
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 22d740bd512..395d9483deb 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -94,6 +94,16 @@ typedef struct BoundSphere {
        float center[3], radius;
 } BoundSphere;
 
+/**
+ * Support selecting shaders with different options compiled in.
+ * Needed for clipping support because it means using a separate set of 
shaders.
+ */
+typedef enum eDRW_ShaderSlot {
+       DRW_SHADER_SLOT_DEFAULT = 0,
+       DRW_SHADER_SLOT_CLIPPED = 1,
+} eDRW_ShaderSlot;
+#define DRW_SHADER_SLOT_LEN 2
+
 /* declare members as empty (unused) */
 typedef char DRWViewportEmptyList;
 
@@ -259,7 +269,7 @@ struct GPUShader *DRW_shader_create_with_transform_feedback(
 struct GPUShader *DRW_shader_create_2D(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_3D(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_fullscreen(const char *frag, const char 
*defines);
-struct GPUShader *DRW_shader_create_3D_depth_only(void);
+struct GPUShader *DRW_shader_create_3D_depth_only(eDRW_ShaderSlot slot);
 struct GPUMaterial *DRW_shader_find_from_world(struct World *wo, const void 
*engine_type, int options, bool deferred);
 struct GPUMaterial *DRW_shader_find_from_material(struct Material *ma, const 
void *engine_type, int options, bool deferred);
 struct GPUMaterial *DRW_shader_create_from_world(
@@ -571,16 +581,6 @@ bool DRW_state_show_text(void);
 bool DRW_state_draw_support(void);
 bool DRW_state_draw_background(void);
 
-/**
- * Support selecting shaders with different options compiled in.
- * Needed for clipping support because it means using a separate set of 
shaders.
- */
-typedef enum eDRW_ShaderSlot {
-       DRW_SHADER_SLOT_DEFAULT = 0,
-       DRW_SHADER_SLOT_CLIPPED = 1,
-} eDRW_ShaderSlot;
-#define DRW_SHADER_SLOT_LEN 2
-
 /* Avoid too many lookups while drawing */
 typedef struct DRWContextState {
 
diff --git a/source/blender/draw/intern/draw_builtin_shader.c 
b/source/blender/draw/intern/draw_builtin_shader.c
index e89e257c2fe..56bdd652f9f 100644
--- a/source/blender/draw/intern/draw_builtin_shader.c
+++ b/source/blender/draw/intern/draw_builtin_shader.c
@@ -43,7 +43,7 @@ extern char datatoc_drw_shader_3D_smooth_color_vert_glsl[];
 
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
-
+extern char datatoc_gpu_shader_depth_only_frag_glsl[];
 
 /* cache of built-in shaders (each is created on first use) */
 static struct {
@@ -79,6 +79,15 @@ static GPUShader 
*drw_shader_get_builtin_shader_clipped(eGPUBuiltinShader shader
                                .frag = (const char 
*[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
                                .defs = (const char *[]){world_clip_def, 
NULL}});
                        break;
+               case GPU_SHADER_3D_DEPTH_ONLY:
+                       if (r_test_only) {
+                               break;
+                       }
+                       shader = DRW_shader_create_from_arrays({
+                               .vert = (const char *[]){world_clip_lib, 
datatoc_drw_shader_3D_vert_glsl, NULL},
+                               .frag = (const char 
*[]){datatoc_gpu_shader_depth_only_frag_glsl, NULL},
+                               .defs = (const char *[]){world_clip_def, 
NULL}});
+                       break;
                default:
                        /* Unsupported, caller asserts. */
                        if (r_test_only) {
diff --git a/source/blender/draw/intern/draw_manager_shader.c 
b/source/blender/draw/intern/draw_manager_shader.c
index 79717fc58e4..218ed3f59c4 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -26,8 +26,7 @@
  *  \ingroup draw
  */
 
-#include "draw_manager.h"
-
+#include "DNA_object_types.h"
 #include "DNA_world_types.h"
 #include "DNA_material_types.h"
 
@@ -48,6 +47,9 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "draw_manager.h"
+#include "draw_builtin_shader.h"
+
 extern char datatoc_gpu_shader_2D_vert_glsl[];
 extern char datatoc_gpu_shader_3D_vert_glsl[];
 extern char datatoc_gpu_shader_depth_only_frag_glsl[];
@@ -386,9 +388,9 @@ GPUShader *DRW_shader_create_fullscreen(const char *frag, 
const char *defines)
        return GPU_shader_create(datatoc_common_fullscreen_vert_glsl, frag, 
NULL, NULL, defines, __func__);
 }
 
-GPUShader *DRW_shader_create_3D_depth_only(void)
+GPUShader *DRW_shader_create_3D_depth_only(eDRW_ShaderSlot slot)
 {
-       return GPU_shader_get_builtin_shader(GPU_SHADER_3D_DEPTH_ONLY);
+       return DRW_shader_get_builtin_shader(GPU_SHADER_3D_DEPTH_ONLY, slot);
 }
 
 GPUMaterial *DRW_shader_find_from_world(World *wo, const void *engine_type, 
int options, bool deferred)
diff --git a/source/blender/draw/modes/edit_mesh_mode.c 
b/source/blender/draw/modes/edit_mesh_mode.c
index fcc841f2ff5..7f9e0cb9afc 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -334,7 +334,7 @@ static void EDIT_MESH_engine_init(void *vedata)
                        .defs = (const char *[]){world_clip_def_or_empty, 
NULL}});
        }
        if (!sh_data->depth) {
-               sh_data->depth = DRW_shader_create_3D_depth_only();
+               sh_data->depth = 
DRW_shader_create_3D_depth_only(draw_ctx->shader_slot);
        }
        if (!sh_data->ghost_clear_depth) {
                sh_data->ghost_clear_depth = 
DRW_shader_create_fullscreen(datatoc_gpu_shader_depth_only_frag_glsl, NULL);
@@ -525,6 +525,9 @@ static void EDIT_MESH_cache_init(void *vedata)
                        "Depth Pass Hidden Wire",
                        DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | 
DRW_STATE_CULL_BACK);
                stl->g_data->depth_shgrp_hidden_wire = 
DRW_shgroup_create(sh_data->depth, psl->depth_hidden_wire);
+               if (rv3d->rflag & RV3D_CLIPPING) {
+                       
DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->fweights_shgrp, rv3d);
+               }
        }
 
        {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to