diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-14 04:40:21 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-14 04:40:21 +0300 |
commit | 37b7a5c8b83ff7ba1dd306ccbb890d2e9b996096 (patch) | |
tree | 98ed650d1c271b6be2c29e1c1c5ef68651e98593 /source/blender/draw/modes/paint_vertex_mode.c | |
parent | a8134647c9a99252b123c16f3eeb8b3cef62e646 (diff) |
Fix vertex/weight paint showing edge selection
When vertex/face selection are disabled - show all wire
ignoring selection & hidden state.
Diffstat (limited to 'source/blender/draw/modes/paint_vertex_mode.c')
-rw-r--r-- | source/blender/draw/modes/paint_vertex_mode.c | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index c11bb1a1064..2e9c65e0ce5 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -47,8 +47,9 @@ extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; typedef struct PAINT_VERTEX_PassList { struct DRWPass *vcolor_faces; struct DRWPass *wire_overlay; - struct DRWPass *face_overlay; - struct DRWPass *vert_overlay; + struct DRWPass *wire_select_overlay; + struct DRWPass *face_select_overlay; + struct DRWPass *vert_select_overlay; } PAINT_VERTEX_PassList; typedef struct PAINT_VERTEX_StorageList { @@ -66,8 +67,9 @@ typedef struct PAINT_VERTEX_Data { typedef struct PAINT_VERTEX_Shaders { struct GPUShader *vcolor_face; struct GPUShader *wire_overlay; - struct GPUShader *face_overlay; - struct GPUShader *vert_overlay; + struct GPUShader *wire_select_overlay; + struct GPUShader *face_select_overlay; + struct GPUShader *vert_select_overlay; } PAINT_VERTEX_Shaders; /* *********** STATIC *********** */ @@ -79,8 +81,9 @@ static struct { typedef struct PAINT_VERTEX_PrivateData { DRWShadingGroup *fvcolor_shgrp; DRWShadingGroup *lwire_shgrp; - DRWShadingGroup *face_shgrp; - DRWShadingGroup *vert_shgrp; + DRWShadingGroup *lwire_select_shgrp; + DRWShadingGroup *face_select_shgrp; + DRWShadingGroup *vert_select_shgrp; } PAINT_VERTEX_PrivateData; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -107,15 +110,20 @@ static void PAINT_VERTEX_engine_init(void *UNUSED(vedata)) .frag = (const char *[]){datatoc_paint_wire_frag_glsl, NULL}, .defs = (const char *[]){sh_cfg_data->def, "#define VERTEX_MODE\n", NULL}, }); - sh_data->face_overlay = GPU_shader_create_from_arrays({ + sh_data->wire_select_overlay = GPU_shader_create_from_arrays({ + .vert = (const char *[]){sh_cfg_data->lib, datatoc_common_globals_lib_glsl, datatoc_paint_wire_vert_glsl, NULL}, + .frag = (const char *[]){datatoc_paint_wire_frag_glsl, NULL}, + .defs = (const char *[]){sh_cfg_data->def, "#define VERTEX_MODE\n" "#define USE_SELECT\n", NULL}, + }); + sh_data->face_select_overlay = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg_data->lib, datatoc_paint_face_vert_glsl, NULL}, .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, .defs = (const char *[]){sh_cfg_data->def, NULL}, }); - sh_data->vert_overlay = GPU_shader_create_from_arrays({ + sh_data->vert_select_overlay = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg_data->lib, datatoc_common_globals_lib_glsl, datatoc_paint_wire_vert_glsl, NULL}, .frag = (const char *[]){datatoc_paint_vert_frag_glsl, NULL}, - .defs = (const char *[]){sh_cfg_data->def, NULL}, + .defs = (const char *[]){sh_cfg_data->def, "#define USE_SELECT\n", NULL}, }); } } @@ -160,27 +168,39 @@ static void PAINT_VERTEX_cache_init(void *vedata) } { - psl->face_overlay = DRW_pass_create( + psl->wire_select_overlay = DRW_pass_create( + "Wire Mask Pass", + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_OFFSET_NEGATIVE); + + stl->g_data->lwire_select_shgrp = DRW_shgroup_create(sh_data->wire_select_overlay, psl->wire_select_overlay); + DRW_shgroup_uniform_block(stl->g_data->lwire_select_shgrp, "globalsBlock", G_draw.block_ubo); + if (rv3d->rflag & RV3D_CLIPPING) { + DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->lwire_select_shgrp, rv3d); + } + } + + { + psl->face_select_overlay = DRW_pass_create( "Face Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND); - stl->g_data->face_shgrp = DRW_shgroup_create(sh_data->face_overlay, psl->face_overlay); + stl->g_data->face_select_shgrp = DRW_shgroup_create(sh_data->face_select_overlay, psl->face_select_overlay); static float col[4] = {1.0f, 1.0f, 1.0f, 0.2f}; - DRW_shgroup_uniform_vec4(stl->g_data->face_shgrp, "color", col, 1); + DRW_shgroup_uniform_vec4(stl->g_data->face_select_shgrp, "color", col, 1); if (rv3d->rflag & RV3D_CLIPPING) { - DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->face_shgrp, rv3d); + DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->face_select_shgrp, rv3d); } } { - psl->vert_overlay = DRW_pass_create( + psl->vert_select_overlay = DRW_pass_create( "Vert Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_OFFSET_NEGATIVE); - stl->g_data->vert_shgrp = DRW_shgroup_create(sh_data->vert_overlay, psl->vert_overlay); - DRW_shgroup_uniform_block(stl->g_data->vert_shgrp, "globalsBlock", G_draw.block_ubo); + stl->g_data->vert_select_shgrp = DRW_shgroup_create(sh_data->vert_select_overlay, psl->vert_select_overlay); + DRW_shgroup_uniform_block(stl->g_data->vert_select_shgrp, "globalsBlock", G_draw.block_ubo); if (rv3d->rflag & RV3D_CLIPPING) { - DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->vert_shgrp, rv3d); + DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->vert_select_shgrp, rv3d); } } } @@ -210,18 +230,19 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) } if (use_face_sel || use_wire) { + DRWShadingGroup *shgrp = use_face_sel ? stl->g_data->lwire_select_shgrp : stl->g_data->lwire_shgrp; geom = DRW_cache_mesh_surface_edges_get(ob); - DRW_shgroup_call_add(stl->g_data->lwire_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(shgrp, geom, ob->obmat); } if (use_face_sel) { geom = DRW_cache_mesh_surface_get(ob); - DRW_shgroup_call_add(stl->g_data->face_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->face_select_shgrp, geom, ob->obmat); } if (use_vert_sel) { geom = DRW_cache_mesh_all_verts_get(ob); - DRW_shgroup_call_add(stl->g_data->vert_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->vert_select_shgrp, geom, ob->obmat); } } } @@ -231,9 +252,10 @@ static void PAINT_VERTEX_draw_scene(void *vedata) PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl; DRW_draw_pass(psl->vcolor_faces); - DRW_draw_pass(psl->face_overlay); DRW_draw_pass(psl->wire_overlay); - DRW_draw_pass(psl->vert_overlay); + DRW_draw_pass(psl->wire_select_overlay); + DRW_draw_pass(psl->vert_select_overlay); + DRW_draw_pass(psl->face_select_overlay); } static void PAINT_VERTEX_engine_free(void) |