diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-24 07:02:40 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-24 08:14:00 +0300 |
commit | 04d18b117c2f95b0b28df12c9ddac06b018d6236 (patch) | |
tree | 2c2975e479dc40083c664e48f26d683b61010846 /source/blender/draw/modes | |
parent | 1d908bffddb4c9815a986305ad4588032b81deee (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')
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 +} |