DWM: show weights in edit-mode

Engine collection settings aren't currently flushed,
once they are this will work as expected.
This commit is contained in:
2017-05-08 12:46:54 +10:00
parent 0927748624
commit 1a869fb6b9
3 changed files with 48 additions and 3 deletions

View File

@@ -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;
}
}
}

View File

@@ -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);

View File

@@ -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");