UI: improve mesh edge highlighting

Changes to edit mode mesh overlays, use hue shift instead of color
fading/darkening for selection mode visual differentiation, and some
theme changes to improve the display of mesh edges and faces with good
selection visibility.

- Removed "edge" toggle from edit mode overlays panel.
- No longer halves the edge and face alpha depending on selection mode.
  Half the face alpha in wire-frame mode. For better visibility on most
  themes.

Ref !111431
This commit is contained in:
Gilberto Rodrigues 2023-11-02 18:12:20 +11:00 committed by Campbell Barton
parent b54a26ede4
commit dfd1b63cc7
21 changed files with 101 additions and 66 deletions

View File

@ -317,14 +317,16 @@ const bTheme U_theme_default = {
.vertex_select = RGBA(0xff7a00ff),
.vertex_bevel = RGBA(0x00a5ffff),
.edge = RGBA(0x000000ff),
.edge_select = RGBA(0xffa000ff),
.edge_select = RGBA(0xff9900ff),
.edge_mode_select = RGBA(0xffd800ff),
.edge_seam = RGBA(0xdb2512ff),
.edge_sharp = RGBA(0x00ffffff),
.edge_facesel = RGBA(0x4b4b4bff),
.edge_crease = RGBA(0xcc0099ff),
.edge_bevel = RGBA(0x00a5ffff),
.face = RGBA(0xffffff02),
.face_select = RGBA(0xffa5522e),
.face_select = RGBA(0xffa30033),
.face_mode_select = RGBA(0xffb70033),
.face_retopology = RGBA(0x50c8ff0f),
.face_back = RGBA(0xff0000b3),
.face_front = RGBA(0x0000ffb3),

View File

@ -368,12 +368,13 @@
light="#00000028"
speaker="#000000"
vertex="#000000"
vertex_select="#ff8500"
vertex_select="#ff7a00"
vertex_active="#000000"
vertex_size="3"
vertex_bevel="#00a5ff"
vertex_unreferenced="#000000"
edge_select="#ffa000"
edge_select="#ff9900"
edge_mode_select="#ffd800"
edge_seam="#db2512"
edge_sharp="#00ffff"
edge_crease="#cc0099"
@ -381,7 +382,8 @@
edge_facesel="#4b4b4b"
freestyle_edge_mark="#7fff7f"
face="#00000012"
face_select="#ff85004d"
face_select="#ffa30033"
face_mode_select="#ffb70033"
face_dot="#ff8500"
facedot_size="4"
freestyle_face_mark="#7fff7f33"

View File

@ -7055,9 +7055,6 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
split = col.split()
sub = split.column()
sub.active = is_any_solid_shading
sub.prop(overlay, "show_edges", text="Edges")
sub = split.column()
sub.prop(overlay, "show_faces", text="Faces")
sub = split.column()

View File

@ -29,7 +29,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 3
#define BLENDER_FILE_SUBVERSION 4
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and cancel loading the file, showing a warning to

View File

@ -4148,8 +4148,8 @@ void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain)
View3D *v3d = (View3D *)sl;
v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_FACES | V3D_OVERLAY_EDIT_SEAMS |
V3D_OVERLAY_EDIT_SHARP | V3D_OVERLAY_EDIT_FREESTYLE_EDGE |
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_EDGES |
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS;
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_CREASES |
V3D_OVERLAY_EDIT_BWEIGHTS;
}
}
}

View File

@ -188,8 +188,8 @@ static void blo_update_defaults_screen(bScreen *screen,
v3d->overlay.texture_paint_mode_opacity = 1.0f;
v3d->overlay.weight_paint_mode_opacity = 1.0f;
v3d->overlay.vertex_paint_mode_opacity = 1.0f;
/* Use dimmed selected edges. */
v3d->overlay.edit_flag &= ~V3D_OVERLAY_EDIT_EDGES;
/* Clear this deprecated bit for later reuse. */
v3d->overlay.edit_flag &= ~V3D_OVERLAY_EDIT_EDGES_DEPRECATED;
/* grease pencil settings */
v3d->vertex_opacity = 1.0f;
v3d->gp_flag |= V3D_GP_SHOW_EDIT_LINES;

View File

@ -133,6 +133,13 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
memcpy(btheme, &U_theme_default, sizeof(*btheme));
}
if (!USER_VERSION_ATLEAST(401, 4)) {
FROM_DEFAULT_V4_UCHAR(space_view3d.edge_select);
FROM_DEFAULT_V4_UCHAR(space_view3d.edge_mode_select);
FROM_DEFAULT_V4_UCHAR(space_view3d.face_select);
FROM_DEFAULT_V4_UCHAR(space_view3d.face_mode_select);
}
/**
* Versioning code until next subversion bump goes here.
*

View File

@ -53,6 +53,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
const DRWContextState *draw_ctx = DRW_context_state_get();
const View3DShading *shading = &draw_ctx->v3d->shading;
ToolSettings *tsettings = draw_ctx->scene->toolsettings;
View3D *v3d = draw_ctx->v3d;
bool select_vert = pd->edit_mesh.select_vert = (tsettings->selectmode & SCE_SELECT_VERTEX) != 0;
@ -66,7 +67,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
float retopology_offset = RETOPOLOGY_OFFSET(v3d);
pd->edit_mesh.do_faces = true;
pd->edit_mesh.do_edges = true;
int *mask = shdata->data_mask;
mask[0] = 0xFF; /* Face Flag */
@ -85,16 +85,8 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
if ((flag & V3D_OVERLAY_EDIT_FACES) == 0) {
pd->edit_mesh.do_faces = false;
}
if ((flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
if ((tsettings->selectmode & SCE_SELECT_EDGE) == 0) {
if ((v3d->shading.type < OB_SOLID) || (v3d->shading.flag & V3D_SHADING_XRAY)) {
/* Special case, when drawing wire, draw edges, see: #67637. */
}
else {
pd->edit_mesh.do_edges = false;
}
}
}
const bool is_wire_shmode = (shading->type == OB_WIRE);
float backwire_opacity = (pd->edit_mesh.do_zbufclip) ? v3d->overlay.backwire_opacity : 1.0f;
float face_alpha = (!pd->edit_mesh.do_faces) ? 0.0f : 1.0f;
@ -172,7 +164,8 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1);
DRW_shgroup_uniform_float_copy(grp, "alpha", face_alpha);
DRW_shgroup_uniform_bool_copy(grp, "selectFaces", select_face);
DRW_shgroup_uniform_bool_copy(grp, "selectFace", select_face);
DRW_shgroup_uniform_bool_copy(grp, "wireShading", is_wire_shmode);
DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset);
}
@ -191,7 +184,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1);
DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity);
DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex);
DRW_shgroup_uniform_bool_copy(grp, "selectEdges", pd->edit_mesh.do_edges || select_edge);
DRW_shgroup_uniform_bool_copy(grp, "selectEdge", select_edge);
DRW_shgroup_uniform_bool_copy(grp, "do_smooth_wire", do_smooth_wire);
DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset);

View File

@ -367,7 +367,6 @@ struct OVERLAY_PrivateData {
struct {
bool do_zbufclip;
bool do_faces;
bool do_edges;
bool select_vert;
bool select_face;
bool select_edge;

View File

@ -108,7 +108,10 @@ struct ThemeColorData {
float4 color_vertex_unreferenced;
float4 color_vertex_missing_data;
float4 color_edit_mesh_active;
/** For edge selection, not edge select mode. */
float4 color_edge_select;
/** For edge mode selection. */
float4 color_edge_mode_select;
float4 color_edge_seam;
float4 color_edge_sharp;
float4 color_edge_crease;
@ -116,7 +119,10 @@ struct ThemeColorData {
float4 color_edge_face_select;
float4 color_edge_freestyle;
float4 color_face;
/** For face selection, not face select mode. */
float4 color_face_select;
/** For face mode selection. */
float4 color_face_mode_select;
float4 color_face_freestyle;
float4 color_gpencil_vertex;
float4 color_gpencil_vertex_select;

View File

@ -17,8 +17,9 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common)
.define("blender_srgb_to_framebuffer_space(a)", "a")
.sampler(0, ImageType::DEPTH_2D, "depthTex")
.fragment_out(0, Type::VEC4, "fragColor")
.push_constant(Type::BOOL, "selectFaces")
.push_constant(Type::BOOL, "selectEdges")
.push_constant(Type::BOOL, "wireShading")
.push_constant(Type::BOOL, "selectFace")
.push_constant(Type::BOOL, "selectEdge")
.push_constant(Type::FLOAT, "alpha")
.push_constant(Type::FLOAT, "retopologyOffset")
.push_constant(Type::IVEC4, "dataMask")
@ -31,8 +32,9 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom)
.define("blender_srgb_to_framebuffer_space(a)", "a")
.sampler(0, ImageType::DEPTH_2D, "depthTex")
.fragment_out(0, Type::VEC4, "fragColor")
.push_constant(Type::BOOL, "selectFaces")
.push_constant(Type::BOOL, "selectEdges")
.push_constant(Type::BOOL, "wireShading")
.push_constant(Type::BOOL, "selectFace")
.push_constant(Type::BOOL, "selectEdge")
.push_constant(Type::FLOAT, "alpha")
.push_constant(Type::FLOAT, "retopologyOffset")
.push_constant(Type::IVEC4, "dataMask")

View File

@ -16,23 +16,20 @@ vec4 EDIT_MESH_edge_color_outer(uint edge_flag, uint face_flag, float crease, fl
vec4 EDIT_MESH_edge_color_inner(uint edge_flag)
{
vec4 color = colorWireEdit;
vec4 color_select = (selectEdges) ? colorEdgeSelect : mix(colorEdgeSelect, colorWireEdit, .45);
color = ((edge_flag & EDGE_SELECTED) != 0u) ? color_select : color;
vec4 selected_edge_col = (selectEdge) ? colorEdgeModeSelect : colorEdgeSelect;
color = ((edge_flag & EDGE_SELECTED) != 0u) ? selected_edge_col : color;
color = ((edge_flag & EDGE_ACTIVE) != 0u) ? colorEditMeshActive : color;
color.a = (selectEdges || (edge_flag & (EDGE_SELECTED | EDGE_ACTIVE)) != 0u) ? 1.0 : 0.7;
color.a = 1.0;
return color;
}
vec4 EDIT_MESH_edge_vertex_color(uint vertex_flag)
{
vec4 color = colorWireEdit;
vec4 color_select = (selectEdges) ? colorEdgeSelect : mix(colorEdgeSelect, colorWireEdit, .45);
/* Edge color in vextex selection mode. */
vec4 selected_edge_col = (selectEdge) ? colorEdgeModeSelect : colorEdgeSelect;
bool edge_selected = (vertex_flag & (VERT_ACTIVE | VERT_SELECTED)) != 0u;
color = (edge_selected) ? color_select : color;
color.a = (selectEdges || edge_selected) ? 1.0 : 0.7;
vec4 color = (edge_selected) ? selected_edge_col : colorWireEdit;
color.a = 1.0;
return color;
}
@ -55,15 +52,26 @@ vec4 EDIT_MESH_vertex_color(uint vertex_flag, float vertex_crease)
vec4 EDIT_MESH_face_color(uint face_flag)
{
bool face_freestyle = (face_flag & FACE_FREESTYLE) != 0u;
bool face_selected = (face_flag & FACE_SELECTED) != 0u;
bool face_active = (face_flag & FACE_ACTIVE) != 0u;
vec4 selected_face_col = (selectFace) ? colorFaceModeSelect : colorFaceSelect;
vec4 color = colorFace;
vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5);
color = (retopologyOffset > 0.0) ? colorFaceRetopology : color;
color = ((face_flag & FACE_FREESTYLE) != 0u) ? colorFaceFreestyle : color;
color = ((face_flag & FACE_SELECTED) != 0u) ? colorFaceSelect : color;
color = ((face_flag & FACE_ACTIVE) != 0u) ? color_active : color;
color.a *= ((face_flag & (FACE_FREESTYLE | FACE_SELECTED | FACE_ACTIVE)) == 0u || selectFaces) ?
1.0 :
0.5;
color = face_freestyle ? colorFaceFreestyle : color;
color = face_selected ? selected_face_col : color;
if (selectFace && face_active) {
color = mix(selected_face_col, colorEditMeshActive, 0.5);
color.a = selected_face_col.a;
}
if (wireShading) {
/* Lower face selection opacity for better wireframe visibility. */
color.a = (face_selected) ? color.a * 0.6 : color.a;
}
else {
/* Don't always fill 'colorFace'. */
color.a = (selectFace || face_selected || face_active || face_freestyle) ? color.a : 0.0;
}
return color;
}

View File

@ -61,6 +61,7 @@ void DRW_globals_update()
UI_COLOR_RGBA_FROM_U8(0xB0, 0x00, 0xB0, 0xFF, gb->color_vertex_missing_data);
UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, gb->color_edit_mesh_active);
UI_GetThemeColor4fv(TH_EDGE_SELECT, gb->color_edge_select);
UI_GetThemeColor4fv(TH_EDGE_MODE_SELECT, gb->color_edge_mode_select);
UI_GetThemeColor4fv(TH_GP_VERTEX, gb->color_gpencil_vertex);
UI_GetThemeColor4fv(TH_GP_VERTEX_SELECT, gb->color_gpencil_vertex_select);
@ -71,6 +72,7 @@ void DRW_globals_update()
UI_GetThemeColor4fv(TH_EDGE_FACESEL, gb->color_edge_face_select);
UI_GetThemeColor4fv(TH_FACE, gb->color_face);
UI_GetThemeColor4fv(TH_FACE_SELECT, gb->color_face_select);
UI_GetThemeColor4fv(TH_FACE_MODE_SELECT, gb->color_face_mode_select);
UI_GetThemeColor4fv(TH_FACE_RETOPOLOGY, gb->color_face_retopology);
UI_GetThemeColor4fv(TH_FACE_BACK, gb->color_face_back);
UI_GetThemeColor4fv(TH_FACE_FRONT, gb->color_face_front);

View File

@ -40,7 +40,8 @@ struct GlobalsUboStorage {
float4 color_vertex_unreferenced;
float4 color_vertex_missing_data;
float4 color_edit_mesh_active;
float4 color_edge_select;
float4 color_edge_select; /* Stands for edge selection, not edge select mode. */
float4 color_edge_mode_select; /* Stands for edge mode selection. */
float4 color_edge_seam;
float4 color_edge_sharp;
float4 color_edge_crease;
@ -48,7 +49,8 @@ struct GlobalsUboStorage {
float4 color_edge_face_select;
float4 color_edge_freestyle;
float4 color_face;
float4 color_face_select;
float4 color_face_select; /* Stands for face selection, not face select mode. */
float4 color_face_mode_select; /* Stands for face mode selection. */
float4 color_face_retopology;
float4 color_face_freestyle;
float4 color_gpencil_vertex;
@ -160,6 +162,7 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
# define colorVertexMissingData globalsBlock.color_vertex_missing_data
# define colorEditMeshActive globalsBlock.color_edit_mesh_active
# define colorEdgeSelect globalsBlock.color_edge_select
# define colorEdgeModeSelect globalsBlock.color_edge_mode_select
# define colorEdgeSeam globalsBlock.color_edge_seam
# define colorEdgeSharp globalsBlock.color_edge_sharp
# define colorEdgeCrease globalsBlock.color_edge_crease
@ -168,6 +171,7 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
# define colorEdgeFreestyle globalsBlock.color_edge_freestyle
# define colorFace globalsBlock.color_face
# define colorFaceSelect globalsBlock.color_face_select
# define colorFaceModeSelect globalsBlock.color_face_mode_select
# define colorFaceRetopology globalsBlock.color_face_retopology
# define colorFaceFreestyle globalsBlock.color_face_freestyle
# define colorGpencilVertex globalsBlock.color_gpencil_vertex

View File

@ -92,11 +92,13 @@ enum ThemeColorID {
TH_OUTLINE_WIDTH,
TH_OBCENTER_DIA,
TH_EDGE,
TH_EDGE_SELECT,
TH_EDGE_SELECT, /* Stands for edge selection, not edge select mode. */
TH_EDGE_MODE_SELECT,
TH_EDGE_SEAM,
TH_EDGE_FACESEL,
TH_FACE,
TH_FACE_SELECT,
TH_FACE_SELECT, /* Stands for face selection, not face select mode. */
TH_FACE_MODE_SELECT,
TH_FACE_RETOPOLOGY,
TH_FACE_BACK,
TH_FACE_FRONT,

View File

@ -391,6 +391,9 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
case TH_EDGE_SELECT:
cp = ts->edge_select;
break;
case TH_EDGE_MODE_SELECT:
cp = ts->edge_mode_select;
break;
case TH_EDGE_SEAM:
cp = ts->edge_seam;
break;
@ -415,6 +418,9 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
case TH_FACE_SELECT:
cp = ts->face_select;
break;
case TH_FACE_MODE_SELECT:
cp = ts->face_mode_select;
break;
case TH_FACE_RETOPOLOGY:
cp = ts->face_retopology;
break;

View File

@ -287,10 +287,11 @@ typedef struct ThemeSpace {
unsigned char active[4], group[4], group_active[4], transform[4];
unsigned char vertex[4], vertex_select[4], vertex_active[4], vertex_bevel[4],
vertex_unreferenced[4];
unsigned char edge[4], edge_select[4];
unsigned char edge[4], edge_select[4], edge_mode_select[4];
unsigned char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4], edge_bevel[4];
/** Solid faces. */
unsigned char face[4], face_select[4], face_retopology[4], face_back[4], face_front[4];
unsigned char face[4], face_select[4], face_mode_select[4], face_retopology[4];
unsigned char face_back[4], face_front[4];
/** Selected color. */
unsigned char face_dot[4];
unsigned char extra_edge_len[4], extra_edge_angle[4], extra_face_angle[4], extra_face_area[4];
@ -350,7 +351,6 @@ typedef struct ThemeSpace {
unsigned char node_zone_simulation[4];
unsigned char node_zone_repeat[4];
unsigned char _pad9[4];
unsigned char simulated_frames[4];
/** For sequence editor. */
@ -378,7 +378,7 @@ typedef struct ThemeSpace {
unsigned char path_keyframe_before[4], path_keyframe_after[4];
unsigned char camera_path[4];
unsigned char camera_passepartout[4];
unsigned char _pad1[6];
unsigned char _pad1[2];
unsigned char gp_vertex_size;
unsigned char gp_vertex[4], gp_vertex_select[4];

View File

@ -56,8 +56,8 @@
\
.edit_flag = V3D_OVERLAY_EDIT_FACES | V3D_OVERLAY_EDIT_SEAMS | \
V3D_OVERLAY_EDIT_SHARP | V3D_OVERLAY_EDIT_FREESTYLE_EDGE | \
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_EDGES | \
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS, \
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_CREASES | \
V3D_OVERLAY_EDIT_BWEIGHTS, \
.handle_display = CURVE_HANDLE_SELECTED, \
\
.gpencil_paper_opacity = 0.5f, \

View File

@ -587,7 +587,7 @@ enum {
V3D_OVERLAY_EDIT_WEIGHT = (1 << 4),
V3D_OVERLAY_EDIT_EDGES = (1 << 5),
V3D_OVERLAY_EDIT_EDGES_DEPRECATED = (1 << 5),
V3D_OVERLAY_EDIT_FACES = (1 << 6),
V3D_OVERLAY_EDIT_FACE_DOT = (1 << 7),

View File

@ -4610,11 +4610,6 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
prop, "Display Split Normals", "Display vertex-per-face normals as lines");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, nullptr);
prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGES);
RNA_def_property_ui_text(prop, "Display Edges", "Highlight selected edges");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, nullptr);
prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACES);
RNA_def_property_ui_text(prop, "Display Faces", "Highlight selected faces");

View File

@ -2132,7 +2132,12 @@ static void rna_def_userdef_theme_spaces_edge(StructRNA *srna)
prop = RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Select", "");
RNA_def_property_ui_text(prop, "Edge Selection", "");
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
prop = RNA_def_property(srna, "edge_mode_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Mode Selection", "");
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
prop = RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR_GAMMA);
@ -2178,7 +2183,12 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna)
prop = RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face Selected", "");
RNA_def_property_ui_text(prop, "Face Selection", "");
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
prop = RNA_def_property(srna, "face_mode_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face Mode Selection", "");
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
prop = RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR_GAMMA);