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 07:02:40 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-01-24 08:14:00 +0300
commit04d18b117c2f95b0b28df12c9ddac06b018d6236 (patch)
tree2c2975e479dc40083c664e48f26d683b61010846 /source/blender/draw/modes
parent1d908bffddb4c9815a986305ad4588032b81deee (diff)
DRW: API for own versions of builtin GPU shaders
DRW_shader_get_builtin_shader can replace GPU_shader_get_builtin_shader when we need to support clipping. Use this for loose point & wire drawing in object mode, clips edges in lattice edit mode.
Diffstat (limited to 'source/blender/draw/modes')
-rw-r--r--source/blender/draw/modes/edit_lattice_mode.c6
-rw-r--r--source/blender/draw/modes/object_mode.c48
-rw-r--r--source/blender/draw/modes/shaders/drw_shader_3D_smooth_color_vert.glsl17
-rw-r--r--source/blender/draw/modes/shaders/drw_shader_3D_vert.glsl13
4 files changed, 67 insertions, 17 deletions
diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c
index c98a68f13b2..e484b359b9e 100644
--- a/source/blender/draw/modes/edit_lattice_mode.c
+++ b/source/blender/draw/modes/edit_lattice_mode.c
@@ -37,6 +37,7 @@
#include "draw_common.h"
#include "draw_mode_engines.h"
+#include "draw_builtin_shader.h"
extern char datatoc_common_world_clip_lib_glsl[];
extern char datatoc_common_globals_lib_glsl[];
@@ -154,7 +155,7 @@ static void EDIT_LATTICE_engine_init(void *vedata)
const char *world_clip_def_or_empty = is_clip ? "#define USE_WORLD_CLIP_PLANES\n" : "";
if (!sh_data->wire) {
- sh_data->wire = GPU_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR);
+ sh_data->wire = DRW_shader_get_builtin_shader(GPU_SHADER_3D_SMOOTH_COLOR, draw_ctx->shader_slot);
}
if (!sh_data->overlay_vert) {
@@ -194,6 +195,9 @@ static void EDIT_LATTICE_cache_init(void *vedata)
"Lattice Wire",
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WIRE);
stl->g_data->wire_shgrp = DRW_shgroup_create(sh_data->wire, psl->wire_pass);
+ if (rv3d->rflag & RV3D_CLIPPING) {
+ DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->wire_shgrp, rv3d);
+ }
psl->vert_pass = DRW_pass_create(
"Lattice Verts",
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 7a10763c1b7..1f0bb4738db 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -79,9 +79,11 @@
#include "draw_mode_engines.h"
#include "draw_manager_text.h"
#include "draw_common.h"
+#include "draw_builtin_shader.h"
#include "DEG_depsgraph_query.h"
+extern char datatoc_common_world_clip_lib_glsl[];
extern char datatoc_object_outline_prepass_vert_glsl[];
extern char datatoc_object_outline_prepass_geom_glsl[];
extern char datatoc_object_outline_prepass_frag_glsl[];
@@ -103,6 +105,7 @@ extern char datatoc_gpu_shader_flat_color_frag_glsl[];
extern char datatoc_gpu_shader_flat_id_frag_glsl[];
extern char datatoc_common_fullscreen_vert_glsl[];
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+extern char datatoc_drw_shader_3D_vert_glsl[];
/* *********** LISTS *********** */
typedef struct OBJECT_PassList {
@@ -409,6 +412,10 @@ static void OBJECT_engine_init(void *vedata)
const DRWContextState *draw_ctx = DRW_context_state_get();
OBJECT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot];
+ const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0;
+ const char *world_clip_lib_or_empty = is_clip ? datatoc_common_world_clip_lib_glsl : "";
+ const char *world_clip_def_or_empty = is_clip ? "#define USE_WORLD_CLIP_PLANES\n" : "";
+
if (!sh_data->outline_resolve) {
/* Outline */
sh_data->outline_prepass = DRW_shader_create_3D(datatoc_object_outline_prepass_frag_glsl, NULL);
@@ -484,7 +491,10 @@ static void OBJECT_engine_init(void *vedata)
datatoc_object_lightprobe_grid_vert_glsl, NULL, datatoc_gpu_shader_flat_id_frag_glsl, NULL);
/* Loose Points */
- sh_data->loose_points = DRW_shader_create_3D(datatoc_object_loose_points_frag_glsl, NULL);
+ sh_data->loose_points = DRW_shader_create_from_arrays({
+ .vert = (const char *[]){world_clip_lib_or_empty, datatoc_drw_shader_3D_vert_glsl, NULL},
+ .frag = (const char *[]){datatoc_object_loose_points_frag_glsl, NULL},
+ .defs = (const char *[]){world_clip_def_or_empty, NULL}});
}
{
@@ -664,21 +674,27 @@ static DRWShadingGroup *shgroup_outline(DRWPass *pass, const int *ofs, GPUShader
}
/* currently same as 'shgroup_outline', new function to avoid confustion */
-static DRWShadingGroup *shgroup_wire(DRWPass *pass, const float col[4], GPUShader *sh)
+static DRWShadingGroup *shgroup_wire(DRWPass *pass, const float col[4], GPUShader *sh, eDRW_ShaderSlot shader_slot)
{
DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
DRW_shgroup_uniform_vec4(grp, "color", col, 1);
+ if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+ DRW_shgroup_world_clip_planes_from_rv3d(grp, DRW_context_state_get()->rv3d);
+ }
return grp;
}
/* currently same as 'shgroup_outline', new function to avoid confustion */
-static DRWShadingGroup *shgroup_points(DRWPass *pass, const float col[4], GPUShader *sh)
+static DRWShadingGroup *shgroup_points(DRWPass *pass, const float col[4], GPUShader *sh, eDRW_ShaderSlot shader_slot)
{
DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
DRW_shgroup_uniform_vec4(grp, "color", col, 1);
DRW_shgroup_uniform_vec4(grp, "innerColor", G_draw.block.colorEditMeshMiddle, 1);
+ if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+ DRW_shgroup_world_clip_planes_from_rv3d(grp, DRW_context_state_get()->rv3d);
+ }
return grp;
}
@@ -1252,24 +1268,24 @@ static void OBJECT_cache_init(void *vedata)
sgl->texspace = shgroup_instance(sgl->non_meshes, geom);
/* Wires (for loose edges) */
- sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
- sgl->wire = shgroup_wire(sgl->non_meshes, gb->colorWire, sh);
- sgl->wire_select = shgroup_wire(sgl->non_meshes, gb->colorSelect, sh);
- sgl->wire_transform = shgroup_wire(sgl->non_meshes, gb->colorTransform, sh);
- sgl->wire_active = shgroup_wire(sgl->non_meshes, gb->colorActive, sh);
+ sh = DRW_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR, draw_ctx->shader_slot);
+ sgl->wire = shgroup_wire(sgl->non_meshes, gb->colorWire, sh, draw_ctx->shader_slot);
+ sgl->wire_select = shgroup_wire(sgl->non_meshes, gb->colorSelect, sh, draw_ctx->shader_slot);
+ sgl->wire_transform = shgroup_wire(sgl->non_meshes, gb->colorTransform, sh, draw_ctx->shader_slot);
+ sgl->wire_active = shgroup_wire(sgl->non_meshes, gb->colorActive, sh, draw_ctx->shader_slot);
/* Wire (duplicator) */
- sgl->wire_dupli = shgroup_wire(sgl->non_meshes, gb->colorDupli, sh);
- sgl->wire_dupli_select = shgroup_wire(sgl->non_meshes, gb->colorDupliSelect, sh);
+ sgl->wire_dupli = shgroup_wire(sgl->non_meshes, gb->colorDupli, sh, draw_ctx->shader_slot);
+ sgl->wire_dupli_select = shgroup_wire(sgl->non_meshes, gb->colorDupliSelect, sh, draw_ctx->shader_slot);
/* Points (loose points) */
sh = sh_data->loose_points;
- sgl->points = shgroup_points(sgl->non_meshes, gb->colorWire, sh);
- sgl->points_select = shgroup_points(sgl->non_meshes, gb->colorSelect, sh);
- sgl->points_transform = shgroup_points(sgl->non_meshes, gb->colorTransform, sh);
- sgl->points_active = shgroup_points(sgl->non_meshes, gb->colorActive, sh);
+ sgl->points = shgroup_points(sgl->non_meshes, gb->colorWire, sh, draw_ctx->shader_slot);
+ sgl->points_select = shgroup_points(sgl->non_meshes, gb->colorSelect, sh, draw_ctx->shader_slot);
+ sgl->points_transform = shgroup_points(sgl->non_meshes, gb->colorTransform, sh, draw_ctx->shader_slot);
+ sgl->points_active = shgroup_points(sgl->non_meshes, gb->colorActive, sh, draw_ctx->shader_slot);
/* Points (duplicator) */
- sgl->points_dupli = shgroup_points(sgl->non_meshes, gb->colorDupli, sh);
- sgl->points_dupli_select = shgroup_points(sgl->non_meshes, gb->colorDupliSelect, sh);
+ sgl->points_dupli = shgroup_points(sgl->non_meshes, gb->colorDupli, sh, draw_ctx->shader_slot);
+ sgl->points_dupli_select = shgroup_points(sgl->non_meshes, gb->colorDupliSelect, sh, draw_ctx->shader_slot);
DRW_shgroup_state_disable(sgl->points, DRW_STATE_BLEND);
DRW_shgroup_state_disable(sgl->points_select, DRW_STATE_BLEND);
DRW_shgroup_state_disable(sgl->points_transform, DRW_STATE_BLEND);
diff --git a/source/blender/draw/modes/shaders/drw_shader_3D_smooth_color_vert.glsl b/source/blender/draw/modes/shaders/drw_shader_3D_smooth_color_vert.glsl
new file mode 100644
index 00000000000..05f9618a7f7
--- /dev/null
+++ b/source/blender/draw/modes/shaders/drw_shader_3D_smooth_color_vert.glsl
@@ -0,0 +1,17 @@
+/* Keep 'gpu_shader_3D_smooth_color_vert.glsl' compatible. */
+uniform mat4 ModelViewProjectionMatrix;
+uniform mat4 ModelMatrix;
+
+in vec3 pos;
+in vec4 color;
+
+out vec4 finalColor;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ finalColor = color;
+#ifdef USE_WORLD_CLIP_PLANES
+ world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz);
+#endif
+}
diff --git a/source/blender/draw/modes/shaders/drw_shader_3D_vert.glsl b/source/blender/draw/modes/shaders/drw_shader_3D_vert.glsl
new file mode 100644
index 00000000000..f0d477527ce
--- /dev/null
+++ b/source/blender/draw/modes/shaders/drw_shader_3D_vert.glsl
@@ -0,0 +1,13 @@
+/* Keep 'gpu_shader_3D_vert.glsl' compatible. */
+uniform mat4 ModelViewProjectionMatrix;
+uniform mat4 ModelMatrix;
+
+in vec3 pos;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+#ifdef USE_WORLD_CLIP_PLANES
+ world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz);
+#endif
+}