T55456: EditMode Drawing

- Hide facedots, except when in V3D_ZBUF_SELECT mode
`use_occluded_geometry`
- Different theme (wire_inactive) when not in edge selection mode
This commit is contained in:
Jeroen Bakker 2018-06-13 08:17:14 +02:00
parent c0926d536f
commit 23c24cead5
Notes: blender-bot 2023-02-14 05:54:52 +01:00
Referenced by issue #54940, 2.8: Code-Quest (Maintainer decisions pending)
12 changed files with 140 additions and 21 deletions

View File

@ -50,6 +50,7 @@ struct GPUTexture *globals_ramp = NULL;
void DRW_globals_update(void)
{
UI_GetThemeColor4fv(TH_WIRE, ts.colorWire);
UI_GetThemeColor4fv(TH_WIRE_INACTIVE, ts.colorWireInactive);
UI_GetThemeColor4fv(TH_WIRE_EDIT, ts.colorWireEdit);
UI_GetThemeColor4fv(TH_ACTIVE, ts.colorActive);
UI_GetThemeColor4fv(TH_SELECT, ts.colorSelect);
@ -64,6 +65,7 @@ void DRW_globals_update(void)
UI_GetThemeColor4fv(TH_VERTEX_SELECT, ts.colorVertexSelect);
UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, ts.colorEditMeshActive);
UI_GetThemeColor4fv(TH_EDGE_SELECT, ts.colorEdgeSelect);
UI_GetThemeColor4fv(TH_EDGE_SEAM, ts.colorEdgeSeam);
UI_GetThemeColor4fv(TH_EDGE_SHARP, ts.colorEdgeSharp);
UI_GetThemeColor4fv(TH_EDGE_CREASE, ts.colorEdgeCrease);

View File

@ -41,6 +41,7 @@ struct PTCacheEdit;
typedef struct GlobalsUboStorage {
/* UBOs data needs to be 16 byte aligned (size of vec4) */
float colorWire[4];
float colorWireInactive[4];
float colorWireEdit[4];
float colorActive[4];
float colorSelect[4];

View File

@ -91,12 +91,23 @@ typedef struct EDIT_MESH_Data {
static struct {
/* weight/vert-color */
GPUShader *vcolor_face_shader;
/* Geometry */
GPUShader *overlay_tri_sh;
GPUShader *overlay_tri_fast_sh;
GPUShader *overlay_tri_vcol_sh;
GPUShader *overlay_tri_vcol_fast_sh;
GPUShader *overlay_edge_sh;
GPUShader *overlay_edge_vcol_sh;
GPUShader *overlay_tri_edgesel_sh;
GPUShader *overlay_tri_edgesel_fast_sh;
GPUShader *overlay_tri_vcol_edgesel_sh;
GPUShader *overlay_tri_vcol_edgesel_fast_sh;
/* Loose Edges */
GPUShader *overlay_loose_edge_sh;
GPUShader *overlay_loose_edge_vcol_sh;
GPUShader *overlay_loose_edge_edgesel_sh;
GPUShader *overlay_loose_edge_vcol_edgesel_sh;
GPUShader *overlay_vert_sh;
GPUShader *overlay_facedot_sh;
GPUShader *overlay_mix_sh;
@ -195,8 +206,54 @@ static void EDIT_MESH_engine_init(void *vedata)
"#define ANTI_ALIASING\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_edge_sh) {
e_data.overlay_edge_sh = DRW_shader_create_with_lib(
if (!e_data.overlay_tri_edgesel_sh) {
e_data.overlay_tri_edgesel_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define EDGE_FIX\n"
"#define EDGE_SELECTION\n"
"#define ANTI_ALIASING\n"
"#define VERTEX_FACING");
}
if (!e_data.overlay_tri_edgesel_fast_sh) {
e_data.overlay_tri_edgesel_fast_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define ANTI_ALIASING\n"
"#define EDGE_SELECTION\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_tri_vcol_edgesel_sh) {
e_data.overlay_tri_vcol_edgesel_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define EDGE_FIX\n"
"#define VERTEX_SELECTION\n"
"#define EDGE_SELECTION\n"
"#define ANTI_ALIASING\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_tri_vcol_edgesel_fast_sh) {
e_data.overlay_tri_vcol_edgesel_fast_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define VERTEX_SELECTION\n"
"#define EDGE_SELECTION\n"
"#define ANTI_ALIASING\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_loose_edge_sh) {
e_data.overlay_loose_edge_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_edge_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
@ -204,8 +261,8 @@ static void EDIT_MESH_engine_init(void *vedata)
"#define ANTI_ALIASING\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_edge_vcol_sh) {
e_data.overlay_edge_vcol_sh = DRW_shader_create_with_lib(
if (!e_data.overlay_loose_edge_vcol_sh) {
e_data.overlay_loose_edge_vcol_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_edge_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
@ -213,6 +270,26 @@ static void EDIT_MESH_engine_init(void *vedata)
"#define VERTEX_SELECTION\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_loose_edge_edgesel_sh) {
e_data.overlay_loose_edge_edgesel_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_edge_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define ANTI_ALIASING\n"
"#define EDGE_SELECTION\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_loose_edge_vcol_edgesel_sh) {
e_data.overlay_loose_edge_vcol_edgesel_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
datatoc_edit_mesh_overlay_geom_edge_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define VERTEX_SELECTION\n"
"#define EDGE_SELECTION\n"
"#define VERTEX_FACING\n");
}
if (!e_data.overlay_vert_sh) {
e_data.overlay_vert_sh = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_loosevert_vert_glsl, NULL,
@ -271,22 +348,23 @@ static DRWPass *edit_mesh_create_overlay_pass(
RegionView3D *rv3d = draw_ctx->rv3d;
Scene *scene = draw_ctx->scene;
ToolSettings *tsettings = scene->toolsettings;
const bool in_edge_mode = (tsettings->selectmode & SCE_SELECT_EDGE) > 0;
if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
ledge_sh = e_data.overlay_edge_vcol_sh;
ledge_sh = in_edge_mode? e_data.overlay_loose_edge_vcol_edgesel_sh: e_data.overlay_loose_edge_vcol_sh;
if ((rv3d->rflag & RV3D_NAVIGATING) != 0)
tri_sh = e_data.overlay_tri_vcol_fast_sh;
tri_sh = in_edge_mode? e_data.overlay_tri_vcol_edgesel_fast_sh: e_data.overlay_tri_vcol_fast_sh;
else
tri_sh = e_data.overlay_tri_vcol_sh;
tri_sh = in_edge_mode? e_data.overlay_tri_vcol_edgesel_sh: e_data.overlay_tri_vcol_sh;
}
else {
ledge_sh = e_data.overlay_edge_sh;
ledge_sh = in_edge_mode? e_data.overlay_loose_edge_edgesel_sh: e_data.overlay_loose_edge_sh;
if ((rv3d->rflag & RV3D_NAVIGATING) != 0)
tri_sh = e_data.overlay_tri_fast_sh;
tri_sh = in_edge_mode? e_data.overlay_tri_edgesel_fast_sh: e_data.overlay_tri_fast_sh;
else
tri_sh = e_data.overlay_tri_sh;
tri_sh = in_edge_mode? e_data.overlay_tri_edgesel_sh: e_data.overlay_tri_sh;
}
DRWPass *pass = DRW_pass_create(
@ -435,7 +513,7 @@ static void edit_mesh_add_ob_to_pass(
DRW_shgroup_call_add(lverts_shgrp, geo_ovl_lverts, ob->obmat);
}
if ((tsettings->selectmode & SCE_SELECT_FACE) != 0) {
if (facedot_shgrp && (tsettings->selectmode & SCE_SELECT_FACE) != 0 ) {
geo_ovl_fcenter = DRW_cache_face_centers_get(ob);
DRW_shgroup_call_add(facedot_shgrp, geo_ovl_fcenter, ob->obmat);
}
@ -505,7 +583,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
else {
edit_mesh_add_ob_to_pass(
scene, ob, stl->g_data->face_overlay_shgrp, stl->g_data->ledges_overlay_shgrp,
stl->g_data->lverts_overlay_shgrp, stl->g_data->facedot_overlay_shgrp, NULL);
stl->g_data->lverts_overlay_shgrp, NULL, NULL);
}
/* 3D text overlay */
@ -561,8 +639,14 @@ static void EDIT_MESH_engine_free(void)
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_edge_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_edge_vcol_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_edgesel_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_edgesel_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_edgesel_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_edgesel_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_vcol_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_edgesel_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_vcol_edgesel_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);

View File

@ -2,6 +2,7 @@
/* keep in sync with GlobalsUboStorage */
layout(std140) uniform globalsBlock {
vec4 colorWire;
vec4 colorWireInactive;
vec4 colorWireEdit;
vec4 colorActive;
vec4 colorSelect;

View File

@ -11,7 +11,7 @@ void main()
if (isSelected != 0)
FragColor = colorFaceDot;
else
FragColor = colorWireEdit;
FragColor = colorVertex;
#ifdef VERTEX_FACING
FragColor.a *= 1.0 - abs(facing) * 0.4;

View File

@ -10,7 +10,6 @@
* TODO Refine the range to only affect GPUs. */
uniform float faceAlphaMod;
flat in vec3 edgesCrease;
flat in vec3 edgesBweight;
flat in vec4 faceColor;
@ -181,10 +180,13 @@ void main()
#ifdef VERTEX_SELECTION
colorDistEdge(vec4(vertexColor, 1.0), innerEdge);
#else
# ifdef EDGE_SELECTION
vec4 inner_edge_color = colorWireEdit;
inner_edge_color = ((flag[v] & EDGE_SELECTED) != 0) ? colorEdgeSelect : inner_edge_color;
inner_edge_color = ((flag[v] & EDGE_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : inner_edge_color;
# else
vec4 inner_edge_color = colorWireInactive;
# endif
colorDistEdge(inner_edge_color, innerEdge);
#endif
}

View File

@ -76,7 +76,11 @@ vec3 getVertexColor(int v)
if ((vData[v].x & (VERTEX_ACTIVE | VERTEX_SELECTED)) != 0)
return colorEdgeSelect.rgb;
else
#ifdef EDGE_SELECTION
return colorWireEdit.rgb;
#else
return colorWireInactive.rgb;
#endif
}
void doVertex(int v, vec4 pos)

View File

@ -95,7 +95,11 @@ vec3 getVertexColor(int v)
if ((vData[v].x & (VERTEX_ACTIVE | VERTEX_SELECTED)) != 0)
return colorEdgeSelect.rgb;
else
#ifdef EDGE_SELECTION
return colorWireEdit.rgb;
#else
return colorWireInactive.rgb;
#endif
}
vec4 getClipData(vec2 pos[3], ivec2 vidx)

View File

@ -90,6 +90,7 @@ typedef enum ThemeColorID {
TH_WIRE,
TH_WIRE_INNER,
TH_WIRE_EDIT,
TH_WIRE_INACTIVE,
TH_SELECT,
TH_ACTIVE,
TH_GROUP,

View File

@ -298,6 +298,8 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
cp = ts->syntaxr; break;
case TH_WIRE_EDIT:
cp = ts->wire_edit; break;
case TH_WIRE_INACTIVE:
cp = ts->wire_inactive; break;
case TH_LAMP:
cp = ts->lamp; break;
case TH_SPEAKER:
@ -934,6 +936,7 @@ void ui_theme_init_default(void)
rgba_char_args_set(btheme->tv3d.view_overlay, 0, 0, 0, 255);
rgba_char_args_set(btheme->tv3d.wire, 0x0, 0x0, 0x0, 255);
rgba_char_args_set(btheme->tv3d.wire_edit, 0x0, 0x0, 0x0, 255);
rgba_char_args_set(btheme->tv3d.wire_inactive, 128, 128, 128, 255);
rgba_char_args_set(btheme->tv3d.lamp, 0, 0, 0, 40);
rgba_char_args_set(btheme->tv3d.speaker, 0, 0, 0, 255);
rgba_char_args_set(btheme->tv3d.camera, 0, 0, 0, 255);
@ -3046,6 +3049,17 @@ void init_userdef_do_versions(Main *bmain)
}
}
for (bTheme *btheme = U.themes.first; btheme; btheme = btheme->next) {
ThemeSpace *ts;
for (ts = UI_THEMESPACE_START(btheme); ts != UI_THEMESPACE_END(btheme); ts++) {
if (btheme->tv3d.wire_inactive[3] == 0) {
rgba_char_args_set(btheme->tv3d.wire_inactive, 128, 128, 128, 255);
}
}
}
if (U.pixelsize == 0.0f)
U.pixelsize = 1.0f;

View File

@ -253,7 +253,7 @@ typedef struct ThemeSpace {
char view_overlay[4];
char wire[4], wire_edit[4], select[4];
char wire[4], wire_edit[4], wire_inactive[4], select[4];
char lamp[4], speaker[4], empty[4], camera[4];
char active[4], group[4], group_active[4], transform[4];
char vertex[4], vertex_select[4], vertex_bevel[4], vertex_unreferenced[4];
@ -361,6 +361,7 @@ typedef struct ThemeSpace {
char metadatabg[4];
char metadatatext[4];
int pad;
} ThemeSpace;

View File

@ -1746,9 +1746,14 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Wire", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "wire_inactive", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire Inactive", "Color for wireframe when in edit mode, but edge selection is not active");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "wire_edit", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire Edit", "");
RNA_def_property_ui_text(prop, "Wire Edit", "Color for wireframe when in edit mode, but edge selection is active");
RNA_def_property_update(prop, 0, "rna_userdef_update");