3D View: support object type visibility/selection

Trying to have a single option for this is too likely to be
insufficient in some cases.

Instead, support object type visibility & selectability per view-port.
This commit is contained in:
Campbell Barton
2018-07-06 17:43:53 +02:00
parent 63f3e1ac7c
commit a48b52d546
5 changed files with 127 additions and 22 deletions

View File

@@ -112,6 +112,14 @@ class VIEW3D_HT_header(Header):
sub.active = overlay.show_overlays
sub.popover(space_type='VIEW_3D', region_type='HEADER', panel_type="VIEW3D_PT_overlay")
layout.popover(
text="",
icon='HIDE_OFF',
space_type='VIEW_3D',
region_type='HEADER',
panel_type="VIEW3D_PT_object_type_visibility",
)
layout.separator_spacer()
# Mode & Transform Settings
@@ -3834,7 +3842,6 @@ class VIEW3D_PT_overlay(Panel):
sub.prop(overlay, "show_all_objects_origin")
sub = split.column()
sub.prop(overlay, "show_non_geometry")
sub.prop(overlay, "show_relationship_lines")
sub.prop(overlay, "show_motion_paths")
#sub.prop(overlay, "show_onion_skins")
@@ -4110,6 +4117,51 @@ class VIEW3D_PT_overlay_paint(Panel):
col.prop(overlay, "show_paint_wire")
class VIEW3D_PT_object_type_visibility(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
bl_label = "Object Visibility"
def draw(self, context):
layout = self.layout
view = context.space_data
col = layout.column()
split = col.split()
heading_pair = ("Visible", "Selectable")
attr_object_types = (
"mesh",
"curve",
"surf",
"meta",
"font",
"armature",
"lattice",
"empty",
"camera",
"lamp",
"light_probe",
"speaker",
)
attr_vis = [f"show_object_viewport_{attr}" for attr in attr_object_types]
attr_sel = [f"show_object_select_{attr}" for attr in attr_object_types]
sub = split.column()
sub.label("Visible")
for attr_v in attr_vis:
sub.prop(view, attr_v)
sub = split.column()
sub.label("Selectable")
for attr_v, attr_s in zip(attr_vis, attr_sel):
row = sub.row(align=True)
row.active = getattr(view, attr_v)
row.prop(view, attr_s)
class VIEW3D_PT_pivot_point(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
@@ -4458,6 +4510,7 @@ classes = (
VIEW3D_PT_overlay_pose,
VIEW3D_PT_overlay_paint,
VIEW3D_PT_overlay_sculpt,
VIEW3D_PT_object_type_visibility,
VIEW3D_PT_pivot_point,
VIEW3D_PT_snapping,
VIEW3D_PT_transform_orientations,

View File

@@ -1274,9 +1274,12 @@ void DRW_draw_render_loop_ex(
PROFILE_START(stime);
drw_engines_cache_init();
const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
{
drw_engines_cache_populate(ob);
if ((object_type_exclude_viewport & (1 << ob->type)) == 0) {
drw_engines_cache_populate(ob);
}
}
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
@@ -1557,12 +1560,17 @@ void DRW_render_object_iter(
void *vedata, RenderEngine *engine, struct Depsgraph *depsgraph,
void (*callback)(void *vedata, Object *ob, RenderEngine *engine, struct Depsgraph *depsgraph))
{
const DRWContextState *draw_ctx = DRW_context_state_get();
DRW_hair_init();
const int object_type_exclude_viewport = draw_ctx->v3d->object_type_exclude_viewport;
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
{
DST.ob_state = NULL;
callback(vedata, ob, engine, depsgraph);
if ((object_type_exclude_viewport & (1 << ob->type)) == 0) {
DST.ob_state = NULL;
callback(vedata, ob, engine, depsgraph);
}
}
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
}
@@ -1701,6 +1709,9 @@ void DRW_draw_select_loop(
#endif
}
else {
const int object_type_exclude_select = (
v3d->object_type_exclude_viewport | v3d->object_type_exclude_select
);
bool filter_exclude = false;
DEG_OBJECT_ITER_BEGIN(
depsgraph, ob,
@@ -1708,8 +1719,9 @@ void DRW_draw_select_loop(
DEG_ITER_OBJECT_FLAG_VISIBLE |
DEG_ITER_OBJECT_FLAG_DUPLI)
{
if ((ob->base_flag & BASE_SELECTABLE) != 0) {
if ((ob->base_flag & BASE_SELECTABLE) &&
(object_type_exclude_select & (1 << ob->type)) == 0)
{
if (object_filter_fn != NULL) {
if (ob->base_flag & BASE_FROMDUPLI) {
/* pass (use previous filter_exclude value) */
@@ -1880,9 +1892,12 @@ void DRW_draw_depth_loop(
{
drw_engines_cache_init();
const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
{
drw_engines_cache_populate(ob);
if ((object_type_exclude_viewport & (1 << ob->type)) == 0) {
drw_engines_cache_populate(ob);
}
}
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;

View File

@@ -2127,10 +2127,6 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
return;
}
if (v3d->overlay.object_type_exclude & (1 << ob->type)) {
return;
}
bool do_outlines = (draw_ctx->v3d->flag & V3D_SELECT_OUTLINE) && ((ob->base_flag & BASE_SELECTED) != 0);
bool show_relations = ((draw_ctx->v3d->flag & V3D_HIDE_HELPLINES) == 0);

View File

@@ -179,7 +179,7 @@ typedef struct View3DOverlay {
/* Other settings */
float wireframe_threshold;
int object_type_exclude;
char _pad0[4];
} View3DOverlay;
@@ -202,6 +202,9 @@ typedef struct View3D {
unsigned int lay_prev; /* for active layer toggle */
unsigned int lay_used; /* used while drawing */
int object_type_exclude_viewport;
int object_type_exclude_select;
short persp DNA_DEPRECATED;
short view DNA_DEPRECATED;

View File

@@ -2609,16 +2609,6 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show 3D Cursor", "Display 3D Cursor Overlay");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_non_geometry", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(
prop, NULL, "overlay.object_type_exclude",
((1 << OB_TYPE_MAX) - 1) &
~((1 << OB_MESH) | (1 << OB_CURVE) | (1 << OB_SURF) | (1 << OB_FONT) | (1 << OB_MBALL)));
RNA_def_property_boolean_default(prop, true);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Show Non Renderable", "Draw not renderable objects in the overlay");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
prop = RNA_def_property(srna, "show_text", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_TEXT);
RNA_def_property_ui_text(prop, "Show Text", "Display overlay text");
@@ -3024,6 +3014,54 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Volume Alpha", "Opacity (alpha) of the cameras' frustum volume");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
{
struct {
const char *name;
int type_mask;
const char *identifier[2];
} info[] = {
{"Mesh", (1 << OB_MESH),
{"show_object_viewport_mesh", "show_object_select_mesh"}},
{"Curve", (1 << OB_CURVE),
{"show_object_viewport_curve", "show_object_select_curve"}},
{"Surface", (1 << OB_SURF),
{"show_object_viewport_surf", "show_object_select_surf"}},
{"Meta", (1 << OB_MBALL),
{"show_object_viewport_meta", "show_object_select_meta"}},
{"Font", (1 << OB_FONT),
{"show_object_viewport_font", "show_object_select_font"}},
{"Armature", (1 << OB_ARMATURE),
{"show_object_viewport_armature", "show_object_select_armature"}},
{"Lattice", (1 << OB_LATTICE),
{"show_object_viewport_lattice", "show_object_select_lattice"}},
{"Empty", (1 << OB_EMPTY),
{"show_object_viewport_empty", "show_object_select_empty"}},
{"Camera", (1 << OB_CAMERA),
{"show_object_viewport_camera", "show_object_select_camera"}},
{"Lamp", (1 << OB_LAMP),
{"show_object_viewport_lamp", "show_object_select_lamp"}},
{"Speaker", (1 << OB_SPEAKER),
{"show_object_viewport_speaker", "show_object_select_speaker"}},
{"Light Probe", (1 << OB_LIGHTPROBE),
{"show_object_viewport_light_probe", "show_object_select_light_probe"}},
};
const char *view_mask_member[2] = {
"object_type_exclude_viewport",
"object_type_exclude_select",
};
for (int mask_index = 0; mask_index < 2; mask_index++) {
for (int type_index = 0; type_index < ARRAY_SIZE(info); type_index++) {
prop = RNA_def_property(srna, info[type_index].identifier[mask_index], PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(
prop, NULL, view_mask_member[mask_index], info[type_index].type_mask);
RNA_def_property_ui_text(prop, info[type_index].name, "");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
}
}
}
/* Nested Structs */
prop = RNA_def_property(srna, "shading", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);