diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 52b44039c0f..de7f0220c3b 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1615,10 +1615,14 @@ bool DRW_object_is_renderable(Object *ob) if (ob->type == OB_MESH) { if (ob == obedit) { IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, ""); - bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire"); - - if (do_occlude_wire) + bool do_show_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire"); + if (do_show_occlude_wire) { return false; + } + bool do_show_weight = BKE_collection_engine_property_value_get_bool(props, "show_weight"); + if (do_show_weight) { + return false; + } } } diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index 120d977c222..83bdd788900 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -55,6 +55,7 @@ extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; /* *********** LISTS *********** */ typedef struct EDIT_MESH_PassList { + struct DRWPass *vcolor_faces; struct DRWPass *depth_hidden_wire; struct DRWPass *edit_face_overlay; struct DRWPass *edit_face_occluded; @@ -87,6 +88,8 @@ typedef struct EDIT_MESH_Data { /* *********** STATIC *********** */ static struct { + /* weight/vert-color */ + GPUShader *vcolor_face_shader; GPUShader *overlay_tri_sh; GPUShader *overlay_tri_fast_sh; GPUShader *overlay_tri_vcol_sh; @@ -103,6 +106,8 @@ static struct { } e_data = {NULL}; /* Engine data */ typedef struct EDIT_MESH_PrivateData { + /* weight/vert-color */ + DRWShadingGroup *fvcolor_shgrp; DRWShadingGroup *depth_shgrp_hidden_wire; DRWShadingGroup *fnormals_shgrp; @@ -140,6 +145,10 @@ static void EDIT_MESH_engine_init(void *vedata) (int)viewport_size[0], (int)viewport_size[1], tex, ARRAY_SIZE(tex)); + if (!e_data.vcolor_face_shader) { + e_data.vcolor_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA); + } + if (!e_data.overlay_tri_sh) { e_data.overlay_tri_sh = DRW_shader_create_with_lib( datatoc_edit_mesh_overlay_vert_glsl, @@ -301,6 +310,21 @@ static void EDIT_MESH_cache_init(void *vedata) stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); } + { + psl->vcolor_faces = DRW_pass_create( + "Vert Color Pass", + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); + + stl->g_data->fvcolor_shgrp = DRW_shgroup_create(e_data.vcolor_face_shader, psl->vcolor_faces); + + static float light[3] = {-0.3f, 0.5f, 1.0f}; + static float alpha = 1.0f; + static float world_light = 1.0f; /* XXX, see: paint_vertex_mode.c */ + DRW_shgroup_uniform_vec3(stl->g_data->fvcolor_shgrp, "light", light, 1); + DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "alpha", &alpha, 1); + DRW_shgroup_uniform_float(stl->g_data->fvcolor_shgrp, "global", &world_light, 1); + } + { /* Complementary Depth Pass */ psl->depth_hidden_wire = DRW_pass_create( @@ -402,6 +426,8 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) if (ob == obedit) { IDProperty *ces_mode_ed = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, ""); bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire"); + bool do_show_weight = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_weight"); + /* Updating uniform */ backwire_opacity = BKE_collection_engine_property_value_get_float(ces_mode_ed, "backwire_opacity"); @@ -413,6 +439,11 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) face_mod = (do_occlude_wire) ? 0.0f : 1.0f; + if (do_show_weight) { + geom = DRW_cache_mesh_surface_weights_get(ob); + DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat); + } + if (do_occlude_wire) { geom = DRW_cache_mesh_surface_get(ob); DRW_shgroup_call_add(stl->g_data->depth_shgrp_hidden_wire, geom, ob->obmat); @@ -455,6 +486,8 @@ static void EDIT_MESH_draw_scene(void *vedata) DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + DRW_draw_pass(psl->vcolor_faces); + DRW_draw_pass(psl->depth_hidden_wire); if (psl->edit_face_occluded) { @@ -490,6 +523,7 @@ void EDIT_MESH_collection_settings_create(IDProperty *properties) properties->type == IDP_GROUP && properties->subtype == IDP_GROUP_SUB_MODE_EDIT); BKE_collection_engine_property_add_int(properties, "show_occlude_wire", false); + BKE_collection_engine_property_add_int(properties, "show_weight", true); BKE_collection_engine_property_add_int(properties, "face_normals_show", false); BKE_collection_engine_property_add_int(properties, "vert_normals_show", false); BKE_collection_engine_property_add_int(properties, "loop_normals_show", false); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 6d61e69cec3..a9e657327d0 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2551,6 +2551,7 @@ RNA_LAYER_MODE_OBJECT_GET_SET_BOOL(show_backface_culling) /* mesh engine */ RNA_LAYER_MODE_EDIT_GET_SET_BOOL(show_occlude_wire) +RNA_LAYER_MODE_EDIT_GET_SET_BOOL(show_weight) RNA_LAYER_MODE_EDIT_GET_SET_BOOL(face_normals_show) RNA_LAYER_MODE_EDIT_GET_SET_BOOL(vert_normals_show) RNA_LAYER_MODE_EDIT_GET_SET_BOOL(loop_normals_show) @@ -6256,6 +6257,12 @@ static void rna_def_layer_collection_mode_settings_edit(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); + prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_ui_text(prop, "Show Weights", "Draw weights in editmode"); + RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_show_weight_get", "rna_LayerEngineSettings_EditMode_show_weight_set"); + RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); + RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update"); + prop = RNA_def_property(srna, "face_normals_show", PROP_BOOLEAN, PROP_NONE); RNA_def_property_ui_text(prop, "Draw Normals", "Display face normals as lines"); RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_EditMode_face_normals_show_get", "rna_LayerEngineSettings_EditMode_face_normals_show_set");