UV Editor: Add filter option to control what is visible when Draw Other Objects is enabled

Previously the editor will always try to only show UV faces with the same exact active
image or image texture, which is quite difficult to control on a production shaders, where
each material can have multiple objects assigned.

The idea of this commit is to bring option which allows to easily control what to display
when "Draw Other Objects" is enabled, so currently we can have old behavior ("Same Image")
or tell editor to show everything ("All"). In the future we can extend it with such filters
as "Same Material" and things like that.

Hopefully this will help @eyecandy's workflow of texturing.
This commit is contained in:
Sergey Sharybin 2016-10-17 14:28:16 +02:00
parent 7f19c4fdf9
commit c2d0832c6e
4 changed files with 58 additions and 16 deletions

View File

@ -687,6 +687,12 @@ class IMAGE_PT_view_properties(Panel):
sub.active = uvedit.show_stretch
sub.row().prop(uvedit, "draw_stretch_type", expand=True)
col = layout.column()
col.prop(uvedit, "show_other_objects")
row = col.row()
row.active = uvedit.show_other_objects
row.prop(uvedit, "other_uv_filter", text="Filter")
if show_render and ima:
layout.separator()
render_slot = ima.render_slots.active

View File

@ -377,7 +377,7 @@ static void draw_uvs_lineloop_mpoly(Mesh *me, MPoly *mpoly)
glEnd();
}
static void draw_uvs_other_mesh_texface(Object *ob, const Image *curimage)
static void draw_uvs_other_mesh_texface(Object *ob, const Image *curimage, const int other_uv_filter)
{
Mesh *me = ob->data;
MPoly *mpoly = me->mpoly;
@ -389,14 +389,19 @@ static void draw_uvs_other_mesh_texface(Object *ob, const Image *curimage)
}
for (a = me->totpoly; a != 0; a--, mpoly++, mtpoly++) {
if (mtpoly->tpage != curimage) {
continue;
if (other_uv_filter == SI_FILTER_ALL) {
/* Nothing to compare, all UV faces are visible. */
}
else if (other_uv_filter == SI_FILTER_SAME_IMAGE) {
if (mtpoly->tpage != curimage) {
continue;
}
}
draw_uvs_lineloop_mpoly(me, mpoly);
}
}
static void draw_uvs_other_mesh_new_shading(Object *ob, const Image *curimage)
static void draw_uvs_other_mesh_new_shading(Object *ob, const Image *curimage, const int other_uv_filter)
{
Mesh *me = ob->data;
MPoly *mpoly = me->mpoly;
@ -436,27 +441,34 @@ static void draw_uvs_other_mesh_new_shading(Object *ob, const Image *curimage)
}
for (a = me->totpoly; a != 0; a--, mpoly++) {
const int mat_nr = mpoly->mat_nr;
if ((mat_nr >= totcol) ||
(BLI_BITMAP_TEST(mat_test_array, mat_nr)) == 0)
{
continue;
if (other_uv_filter == SI_FILTER_ALL) {
/* Nothing to compare, all UV faces are visible. */
}
else if (other_uv_filter == SI_FILTER_SAME_IMAGE) {
const int mat_nr = mpoly->mat_nr;
if ((mat_nr >= totcol) ||
(BLI_BITMAP_TEST(mat_test_array, mat_nr)) == 0)
{
continue;
}
}
draw_uvs_lineloop_mpoly(me, mpoly);
}
}
static void draw_uvs_other_mesh(Object *ob, const Image *curimage, const bool new_shading_nodes)
static void draw_uvs_other_mesh(Object *ob, const Image *curimage, const bool new_shading_nodes,
const int other_uv_filter)
{
if (new_shading_nodes) {
draw_uvs_other_mesh_new_shading(ob, curimage);
draw_uvs_other_mesh_new_shading(ob, curimage, other_uv_filter);
}
else {
draw_uvs_other_mesh_texface(ob, curimage);
draw_uvs_other_mesh_texface(ob, curimage, other_uv_filter);
}
}
static void draw_uvs_other(Scene *scene, Object *obedit, const Image *curimage, const bool new_shading_nodes)
static void draw_uvs_other(Scene *scene, Object *obedit, const Image *curimage, const bool new_shading_nodes,
const int other_uv_filter)
{
Base *base;
@ -470,7 +482,7 @@ static void draw_uvs_other(Scene *scene, Object *obedit, const Image *curimage,
if (ob->restrictflag & OB_RESTRICT_VIEW) continue;
if ((ob->type == OB_MESH) && (ob != obedit) && ((Mesh *)ob->data)->mloopuv) {
draw_uvs_other_mesh(ob, curimage, new_shading_nodes);
draw_uvs_other_mesh(ob, curimage, new_shading_nodes, other_uv_filter);
}
}
}
@ -483,7 +495,7 @@ static void draw_uvs_texpaint(SpaceImage *sima, Scene *scene, Object *ob)
Material *ma;
if (sima->flag & SI_DRAW_OTHER) {
draw_uvs_other(scene, ob, curimage, new_shading_nodes);
draw_uvs_other(scene, ob, curimage, new_shading_nodes, sima->other_uv_filter);
}
UI_ThemeColor(TH_UV_SHADOW);
@ -586,7 +598,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
curimage = (activetf) ? activetf->tpage : ima;
}
draw_uvs_other(scene, obedit, curimage, new_shading_nodes);
draw_uvs_other(scene, obedit, curimage, new_shading_nodes, sima->other_uv_filter);
}
/* 1. draw shadow mesh */

View File

@ -898,6 +898,10 @@ typedef struct SpaceImage {
char dt_uvstretch;
char around;
/* Filter settings when editor shows other object's UVs. */
int other_uv_filter;
int pad2;
MaskSpaceInfo mask_info;
} SpaceImage;
@ -976,6 +980,12 @@ typedef enum eSpaceImage_Flag {
SI_SHOW_B = (1 << 29),
} eSpaceImage_Flag;
/* SpaceImage->other_uv_filter */
typedef enum eSpaceImage_OtherUVFilter {
SI_FILTER_SAME_IMAGE = 0,
SI_FILTER_ALL = 1,
} eSpaceImage_OtherUVFilter;
/* Text Editor ============================================ */
/* Text Editor */

View File

@ -1977,6 +1977,13 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem other_uv_filter_items[] = {
{SI_FILTER_ALL, "ALL", 0, "All", "No filter, show all islands from other objects"},
{SI_FILTER_SAME_IMAGE, "SAME_IMAGE", ICON_IMAGE_DATA, "Same Image",
"Only show others' UV islads who's active image matches image of the active face"},
{0, NULL, 0, NULL, NULL}
};
srna = RNA_def_struct(brna, "SpaceUVEditor", NULL);
RNA_def_struct_sdna(srna, "SpaceImage");
RNA_def_struct_nested(brna, srna, "SpaceImageEditor");
@ -2064,6 +2071,13 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Live Unwrap",
"Continuously unwrap the selected UV island while transforming pinned vertices");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
/* Other UV filtering */
prop = RNA_def_property(srna, "other_uv_filter", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, other_uv_filter_items);
RNA_def_property_ui_text(prop, "Other UV filter",
"Filter applied on the other object's UV to limit displayed");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
}
static void rna_def_space_outliner(BlenderRNA *brna)