diff options
author | Luca Rood <dev@lucarood.com> | 2017-05-05 15:25:43 +0300 |
---|---|---|
committer | Luca Rood <dev@lucarood.com> | 2017-05-05 16:53:37 +0300 |
commit | 872d8993ddda28a4340730a5842af18ccf55fd2b (patch) | |
tree | 1fe03d2615d0f49843121363d2249edb8ea21728 /source/blender/draw/modes/paint_vertex_mode.c | |
parent | 14bf4ed19407e98575ca7646e942f8230a0b2e8d (diff) |
Clean up weight/vertex painting code
Now passing selection state instead of colors for the wire/face mask
overlay thing. Also added masking indication on the faces in vertex
paint.
Diffstat (limited to 'source/blender/draw/modes/paint_vertex_mode.c')
-rw-r--r-- | source/blender/draw/modes/paint_vertex_mode.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index 6c16601e850..ff2f475713a 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -38,11 +38,16 @@ extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ extern struct GlobalsUboStorage ts; /* draw_common.c */ +extern char datatoc_paint_wire_vert_glsl[]; +extern char datatoc_paint_wire_frag_glsl[]; +extern char datatoc_common_globals_lib_glsl[]; + /* *********** LISTS *********** */ typedef struct PAINT_VERTEX_PassList { struct DRWPass *vcolor_faces; struct DRWPass *wire_overlay; + struct DRWPass *face_overlay; } PAINT_VERTEX_PassList; typedef struct PAINT_VERTEX_StorageList { @@ -62,11 +67,13 @@ typedef struct PAINT_VERTEX_Data { static struct { struct GPUShader *vcolor_face_shader; struct GPUShader *wire_overlay_shader; + struct GPUShader *face_overlay_shader; } e_data = {NULL}; /* Engine data */ typedef struct PAINT_VERTEX_PrivateData { DRWShadingGroup *fvcolor_shgrp; DRWShadingGroup *lwire_shgrp; + DRWShadingGroup *face_shgrp; } PAINT_VERTEX_PrivateData; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -78,7 +85,14 @@ static void PAINT_VERTEX_engine_init(void *UNUSED(vedata)) } if (!e_data.wire_overlay_shader) { - e_data.wire_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR); + e_data.wire_overlay_shader = DRW_shader_create_with_lib( + datatoc_paint_wire_vert_glsl, NULL, + datatoc_paint_wire_frag_glsl, + datatoc_common_globals_lib_glsl, "#define VERTEX_MODE\n"); + } + + if (!e_data.face_overlay_shader) { + e_data.face_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -112,6 +126,15 @@ static void PAINT_VERTEX_cache_init(void *vedata) stl->g_data->lwire_shgrp = DRW_shgroup_create(e_data.wire_overlay_shader, psl->wire_overlay); } + + { + psl->face_overlay = DRW_pass_create("Face Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND); + + stl->g_data->face_shgrp = DRW_shgroup_create(e_data.face_overlay_shader, psl->face_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); + } } static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) @@ -132,9 +155,14 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat); if (flag & ME_EDIT_PAINT_FACE_SEL || use_wire) { - geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL, true); + geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL); DRW_shgroup_call_add(stl->g_data->lwire_shgrp, geom, ob->obmat); } + + if (flag & ME_EDIT_PAINT_FACE_SEL) { + geom = DRW_cache_mesh_faces_weight_overlay_get(ob); + DRW_shgroup_call_add(stl->g_data->face_shgrp, geom, ob->obmat); + } } } @@ -143,11 +171,13 @@ 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); } static void PAINT_VERTEX_engine_free(void) { + DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader); } void PAINT_VERTEX_collection_settings_create(IDProperty *properties) |