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:
parent
3523958de9
commit
37fea2c0f0
|
@ -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)
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue