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/intern
parent4d29312c66dd56498fbab35e2892944d33484461 (diff)
DRW: use clipping for depth buffer
Object selection now supports clipping.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/DRW_render.h22
-rw-r--r--source/blender/draw/intern/draw_builtin_shader.c11
-rw-r--r--source/blender/draw/intern/draw_manager_shader.c10
3 files changed, 27 insertions, 16 deletions
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)