Edit Mode: Merge Xray and "Limit selection to visible" options behaviour

We now treat Xray as being the mode where Limit selection to visible is off.
If Xray is OFF, Limit selection to visible is considered ON.

To allow 'see through wires' with solid shading (not Xray shading) we still
draw solid shading if Xray is ON with Xray Alpha set to 1.0.
This commit is contained in:
Clément Foucault 2018-09-21 15:44:04 +02:00
parent 3523958de9
commit 37fea2c0f0
11 changed files with 36 additions and 57 deletions

View File

@ -55,15 +55,6 @@ class VIEW3D_HT_header(Header):
row = layout.row()
row.prop(tool_settings.particle_edit, "select_mode", text="", expand=True)
# Occlude geometry
if (
(((shading.type not in {'SOLID', 'TEXTURED'}) or not shading.show_xray) and
(object_mode == 'PARTICLE_EDIT' or (object_mode == 'EDIT' and obj.type == 'MESH'))) or
(object_mode in {'WEIGHT_PAINT', 'VERTEX_PAINT'})
):
row = layout.row()
row.prop(view, "use_occlude_geometry", text="")
# Pose
if obj and object_mode == 'POSE':
row = layout.row(align=True)
@ -4053,7 +4044,9 @@ class VIEW3D_PT_shading_color(Panel):
layout.row().prop(shading, "background_color", text="")
def draw(self, context):
self._draw_color_type(context)
shading = VIEW3D_PT_shading.get_shading(context)
if shading.type != 'WIREFRAME':
self._draw_color_type(context)
self._draw_background_color(context)
@ -4063,11 +4056,6 @@ class VIEW3D_PT_shading_options(Panel):
bl_label = "Options"
bl_parent_id = 'VIEW3D_PT_shading'
@classmethod
def poll(cls, context):
shading = VIEW3D_PT_shading.get_shading(context)
return shading.type in {'WIREFRAME', 'SOLID'}
def draw(self, context):
layout = self.layout
@ -4113,15 +4101,16 @@ class VIEW3D_PT_shading_options(Panel):
text=""
)
row = layout.split()
row.prop(shading, "show_object_outline")
sub = row.row()
sub.active = shading.show_object_outline
sub.prop(shading, "object_outline_color", text="")
if shading.type in {'SOLID', 'WIREFRAME'}:
row = layout.split()
row.prop(shading, "show_object_outline")
sub = row.row()
sub.active = shading.show_object_outline
sub.prop(shading, "object_outline_color", text="")
col = layout.column()
if shading.light not in {'WIREFRAME', 'MATCAP'}:
col.prop(shading, "show_specular_highlight")
col = layout.column()
if (shading.light is not 'MATCAP') and (shading.type is not 'WIREFRAME'):
col.prop(shading, "show_specular_highlight")
class VIEW3D_PT_shading_options_shadow(Panel):
@ -4365,6 +4354,7 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
view = context.space_data
overlay = view.overlay
shading = view.shading
display_all = overlay.show_overlays
data = context.active_object.data
@ -4378,7 +4368,7 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
sub = split.column()
sub.prop(data, "show_faces", text="Faces")
sub = split.column()
sub.active = view.use_occlude_geometry
sub.active = shading.show_xray
sub.prop(data, "show_face_center", text="Center")
row = col.row(align=True)

View File

@ -592,4 +592,6 @@ typedef struct DRWContextState {
const DRWContextState *DRW_context_state_get(void);
#define XRAY_ENABLED(v3d) ((((v3d)->shading.flag & V3D_SHADING_XRAY) != 0) && ((v3d)->shading.xray_alpha < 1.0f))
#endif /* __DRW_RENDER_H__ */

View File

@ -1160,7 +1160,7 @@ static void drw_engines_enable_external(void)
/* TODO revisit this when proper layering is implemented */
/* Gather all draw engines needed and store them in DST.enabled_engines
* That also define the rendering order of engines */
static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int drawtype, int shading_flags)
static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int drawtype, bool use_xray)
{
switch (drawtype) {
case OB_WIRE:
@ -1168,7 +1168,7 @@ static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int dr
break;
case OB_SOLID:
if (shading_flags & V3D_SHADING_XRAY) {
if (use_xray) {
use_drw_engine(&draw_engine_workbench_transparent);
}
else {
@ -1288,8 +1288,9 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode);
View3D * v3d = DST.draw_ctx.v3d;
const int drawtype = v3d->shading.type;
const bool use_xray = XRAY_ENABLED(v3d);
drw_engines_enable_from_engine(engine_type, drawtype, v3d->shading.flag);
drw_engines_enable_from_engine(engine_type, drawtype, use_xray);
if (DRW_state_draw_support()) {
/* Draw paint modes first so that they are drawn below the wireframes. */

View File

@ -393,9 +393,7 @@ static void EDIT_MESH_cache_init(void *vedata)
stl->g_data->do_faces = true;
stl->g_data->do_edges = true;
const bool xray_enabled = ((draw_ctx->v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
(draw_ctx->v3d->shading.type < OB_MATERIAL);
stl->g_data->do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0) || xray_enabled;
stl->g_data->do_zbufclip = ((v3d)->shading.flag & V3D_SHADING_XRAY) != 0;
/* Applies on top of the theme edge width, so edge-mode can have thick edges. */
stl->g_data->edge_width_scale = (tsettings->selectmode & (SCE_SELECT_EDGE)) ? 1.75f : 1.0f;

View File

@ -279,6 +279,8 @@ typedef struct OBJECT_PrivateData {
int id_ofs_prb_active;
int id_ofs_prb_select;
int id_ofs_prb_transform;
bool xray_enabled;
} OBJECT_PrivateData; /* Transient data */
static struct {
@ -934,8 +936,6 @@ static void OBJECT_cache_init(void *vedata)
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
OBJECT_PrivateData *g_data;
const DRWContextState *draw_ctx = DRW_context_state_get();
const bool xray_enabled = ((draw_ctx->v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
(draw_ctx->v3d->shading.type < OB_MATERIAL);
/* TODO : use dpi setting for enabling the second pass */
const bool do_outline_expand = false;
@ -945,6 +945,7 @@ static void OBJECT_cache_init(void *vedata)
}
g_data = stl->g_data;
g_data->xray_enabled = XRAY_ENABLED(draw_ctx->v3d) && (draw_ctx->v3d->shading.type < OB_MATERIAL);
{
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WIRE;
@ -952,7 +953,7 @@ static void OBJECT_cache_init(void *vedata)
GPUShader *sh = e_data.outline_prepass_sh;
if (xray_enabled) {
if (g_data->xray_enabled) {
sh = e_data.outline_prepass_wire_sh;
}
@ -990,14 +991,14 @@ static void OBJECT_cache_init(void *vedata)
DRWState state = DRW_STATE_WRITE_COLOR;
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
/* Don't occlude the "outline" detection pass if in xray mode (too much flickering). */
float alphaOcclu = (xray_enabled) ? 1.0f : 0.35f;
float alphaOcclu = (g_data->xray_enabled) ? 1.0f : 0.35f;
/* Reminder : bool uniforms need to be 4 bytes. */
static const int bTrue = true;
static const int bFalse = false;
psl->outlines_search = DRW_pass_create("Outlines Detect Pass", state);
GPUShader *sh = (xray_enabled) ? e_data.outline_detect_wire_sh : e_data.outline_detect_sh;
GPUShader *sh = (g_data->xray_enabled) ? e_data.outline_detect_wire_sh : e_data.outline_detect_sh;
DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->outlines_search);
DRW_shgroup_uniform_texture_ref(grp, "outlineId", &e_data.outlines_id_tx);
DRW_shgroup_uniform_texture_ref(grp, "outlineDepth", &e_data.outlines_depth_tx);
@ -2636,8 +2637,6 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
if (do_outlines) {
if (!BKE_object_is_in_editmode(ob) && !((ob == draw_ctx->obact) && (draw_ctx->object_mode & OB_MODE_ALL_PAINT))) {
struct GPUBatch *geom;
const bool xray_enabled = ((v3d->shading.flag & V3D_SHADING_XRAY) != 0) &&
(v3d->shading.type < OB_MATERIAL);
/* This fixes only the biggest case which is a plane in ortho view. */
int flat_axis = 0;
@ -2645,7 +2644,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
DRW_object_is_flat(ob, &flat_axis) &&
DRW_object_axis_orthogonal_to_view(ob, flat_axis);
if (xray_enabled || is_flat_object_viewed_from_side) {
if (stl->g_data->xray_enabled || is_flat_object_viewed_from_side) {
geom = DRW_cache_object_edge_detection_get(ob, NULL);
}
else {

View File

@ -536,7 +536,7 @@ void ED_view3d_stop_render_preview(struct wmWindowManager *wm, struct ARegion *a
void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa);
#define V3D_IS_ZBUF(v3d) \
(((v3d)->flag & V3D_ZBUF_SELECT) && ((v3d)->shading.type > OB_WIRE))
(((v3d)->shading.flag & V3D_SHADING_XRAY) == 0)
void ED_view3d_id_remap(struct View3D *v3d, const struct ID *old_id, struct ID *new_id);

View File

@ -4879,12 +4879,7 @@ static int toggle_shading_exec(bContext *C, wmOperator *op)
if (type == OB_SOLID) {
if (v3d->shading.type == OB_SOLID) {
/* Toggle X-Ray if already in solid mode. */
if (ED_operator_posemode(C) || ED_operator_editmesh(C)) {
v3d->flag ^= V3D_ZBUF_SELECT;
}
else {
v3d->shading.flag ^= V3D_SHADING_XRAY;
}
v3d->shading.flag ^= V3D_SHADING_XRAY;
}
else {
/* Go to solid mode. */

View File

@ -875,7 +875,7 @@ static void do_lasso_select_meshobject__doSelectVert(void *userData, MVert *mv,
}
static void do_lasso_select_paintvert(ViewContext *vc, const int mcords[][2], short moves, const eSelectOp sel_op)
{
const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Object *ob = vc->obact;
Mesh *me = ob->data;
rcti rect;
@ -1896,7 +1896,7 @@ static void do_paintvert_box_select__doSelectVert(void *userData, MVert *mv, con
static int do_paintvert_box_select(
ViewContext *vc, rcti *rect, const eSelectOp sel_op)
{
const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Mesh *me;
MVert *mvert;
struct ImBuf *ibuf;
@ -2606,7 +2606,7 @@ static bool ed_wpaint_vertex_select_pick(
bool extend, bool deselect, bool toggle, Object *obact)
{
View3D *v3d = CTX_wm_view3d(C);
const bool use_zbuf = (v3d->flag & V3D_ZBUF_SELECT) != 0;
const bool use_zbuf = V3D_IS_ZBUF(v3d);
Mesh *me = obact->data; /* already checked for NULL */
unsigned int index = 0;
@ -2877,7 +2877,7 @@ static void paint_vertsel_circle_select_doSelectVert(void *userData, MVert *mv,
}
static void paint_vertsel_circle_select(ViewContext *vc, const bool select, const int mval[2], float rad)
{
const bool use_zbuf = (vc->v3d->flag & V3D_ZBUF_SELECT) != 0;
const bool use_zbuf = V3D_IS_ZBUF(vc->v3d);
Object *ob = vc->obact;
Mesh *me = ob->data;
bool bbsel;

View File

@ -727,7 +727,7 @@ static bool raycastObj(
if (use_occlusion_test) {
if (use_obedit && sctx->use_v3d &&
!(sctx->v3d_data.v3d->flag & V3D_ZBUF_SELECT))
!V3D_IS_ZBUF(sctx->v3d_data.v3d))
{
/* Use of occlude geometry in editing mode disabled. */
return false;

View File

@ -308,7 +308,7 @@ typedef struct View3D {
/* #define V3D_FLAG_DEPRECATED_10 (1 << 10) */ /* UNUSED */
#define V3D_SELECT_OUTLINE 2048
#define V3D_ZBUF_SELECT 4096
#define V3D_ZBUF_SELECT 4096 /* XXX: DNA deprecated */
#define V3D_GLOBAL_STATS 8192
#define V3D_DRAW_CENTERS 32768

View File

@ -3051,12 +3051,6 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lock Camera to View", "Enable view navigation within the camera view");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "use_occlude_geometry", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_ZBUF_SELECT);
RNA_def_property_ui_text(prop, "Occlude Geometry", "Limit selection to visible (clipped with depth buffer)");
RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_gizmo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE);
RNA_def_property_ui_text(prop, "Show Gizmo", "Show gizmos of all types");