diff options
-rw-r--r-- | release/scripts/startup/bl_ui/space_image.py | 190 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_290.c | 14 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_edit_uv.c | 42 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_engine.c | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_private.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_view.c | 11 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_space_types.h | 13 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 36 |
10 files changed, 224 insertions, 86 deletions
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 300f367ab27..9c6ad39e25b 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -742,6 +742,7 @@ class IMAGE_HT_header(Header): layout = self.layout sima = context.space_data + overlay = sima.overlay ima = sima.image iuser = sima.image_user tool_settings = context.tool_settings @@ -787,6 +788,13 @@ class IMAGE_HT_header(Header): layout.separator_spacer() + # Overlay toggle & popover + row = layout.row(align=True) + row.prop(overlay, "show_overlays", icon='OVERLAY', text="") + sub = row.row(align=True) + sub.active = overlay.show_overlays + sub.popover(panel="IMAGE_PT_overlay", text="") + if show_uvedit: uvedit = sima.uv_editor @@ -994,68 +1002,6 @@ class IMAGE_PT_view_display(Panel): col.prop(uvedit, "show_pixel_coords", text="Pixel Coordinates") -class IMAGE_PT_view_display_uv_edit_overlays(Panel): - bl_space_type = 'IMAGE_EDITOR' - bl_region_type = 'UI' - bl_label = "Overlays" - bl_parent_id = 'IMAGE_PT_view_display' - bl_category = "View" - bl_options = {'DEFAULT_CLOSED'} - - @classmethod - def poll(cls, context): - sima = context.space_data - return (sima and (sima.show_uvedit)) - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - sima = context.space_data - uvedit = sima.uv_editor - - col = layout.column() - - col.prop(uvedit, "edge_display_type", text="Display As") - col.prop(uvedit, "show_faces", text="Faces") - - col = layout.column() - if context.preferences.experimental.use_image_editor_legacy_drawing: - col.prop(uvedit, "show_smooth_edges", text="Smooth") - col.prop(uvedit, "show_modified_edges", text="Modified") - col.prop(uvedit, "uv_opacity") - - -class IMAGE_PT_view_display_uv_edit_overlays_stretch(Panel): - bl_space_type = 'IMAGE_EDITOR' - bl_region_type = 'UI' - bl_label = "Stretching" - bl_parent_id = 'IMAGE_PT_view_display_uv_edit_overlays' - bl_category = "View" - bl_options = {'DEFAULT_CLOSED'} - - @classmethod - def poll(cls, context): - sima = context.space_data - return (sima and (sima.show_uvedit)) - - def draw_header(self, context): - sima = context.space_data - uvedit = sima.uv_editor - self.layout.prop(uvedit, "show_stretch", text="") - - def draw(self, context): - layout = self.layout - layout.use_property_split = True - - sima = context.space_data - uvedit = sima.uv_editor - - layout.active = uvedit.show_stretch - layout.prop(uvedit, "display_stretch_type", text="Type") - - class IMAGE_UL_render_slots(UIList): def draw_item(self, _context, layout, _data, item, _icon, _active_data, _active_propname, _index): slot = item @@ -1512,6 +1458,119 @@ class IMAGE_PT_udim_grid(Panel): col.prop(uvedit, "tile_grid_shape", text="Grid Shape") +class IMAGE_PT_overlay(Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'HEADER' + bl_label = "Overlays" + bl_ui_units_x = 13 + + def draw(self, context): + pass + + +class IMAGE_PT_overlay_uv_edit(Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'HEADER' + bl_label = "UV Editing" + bl_parent_id = 'IMAGE_PT_overlay' + + @classmethod + def poll(cls, context): + sima = context.space_data + return (sima and (sima.show_uvedit)) + + def draw(self, context): + layout = self.layout + + sima = context.space_data + uvedit = sima.uv_editor + overlay = sima.overlay + + layout.active = overlay.show_overlays + + # UV Stretching + row = layout.row() + row.prop(uvedit, "show_stretch") + subrow = row.row(align=True) + subrow.active = uvedit.show_stretch + subrow.prop(uvedit, "display_stretch_type", text="") + + + +class IMAGE_PT_overlay_uv_edit_geometry(Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'HEADER' + bl_label = "Geometry" + bl_parent_id = 'IMAGE_PT_overlay' + + @classmethod + def poll(cls, context): + sima = context.space_data + return (sima and (sima.show_uvedit)) + + def draw(self, context): + layout = self.layout + + sima = context.space_data + uvedit = sima.uv_editor + overlay = sima.overlay + + layout.active = overlay.show_overlays + + # Edges + col = layout.column() + col.prop(uvedit, "uv_opacity") + col.prop(uvedit, "edge_display_type", text="") + if context.preferences.experimental.use_image_editor_legacy_drawing: + col.prop(uvedit, "show_smooth_edges", text="Smooth") + col.prop(uvedit, "show_modified_edges", text="Modified Edges") + + # Faces + row = col.row() + row.active = not uvedit.show_stretch + row.prop(uvedit, "show_faces", text="Faces") + + + +class IMAGE_PT_overlay_texture_paint(Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'HEADER' + bl_label = "Geometry" + bl_parent_id = 'IMAGE_PT_overlay' + + @classmethod + def poll(cls, context): + sima = context.space_data + return (sima and (sima.show_paint)) + + def draw(self, context): + layout = self.layout + + sima = context.space_data + uvedit = sima.uv_editor + overlay = sima.overlay + + layout.active = overlay.show_overlays + layout.prop(uvedit, "show_texpaint") + + +class IMAGE_PT_overlay_image(Panel): + bl_space_type = 'IMAGE_EDITOR' + bl_region_type = 'HEADER' + bl_label = "Image" + bl_parent_id = 'IMAGE_PT_overlay' + + def draw(self, context): + layout = self.layout + + sima = context.space_data + uvedit = sima.uv_editor + overlay = sima.overlay + + layout.active = overlay.show_overlays + layout.prop(uvedit, "show_metadata") + + # Grease Pencil properties class IMAGE_PT_annotation(AnnotationDataPanel, Panel): bl_space_type = 'IMAGE_EDITOR' @@ -1560,8 +1619,6 @@ classes = ( IMAGE_UL_udim_tiles, IMAGE_PT_udim_tiles, IMAGE_PT_view_display, - IMAGE_PT_view_display_uv_edit_overlays, - IMAGE_PT_view_display_uv_edit_overlays_stretch, IMAGE_PT_paint_select, IMAGE_PT_paint_settings, IMAGE_PT_paint_color, @@ -1587,6 +1644,11 @@ classes = ( IMAGE_PT_uv_cursor, IMAGE_PT_annotation, IMAGE_PT_udim_grid, + IMAGE_PT_overlay, + IMAGE_PT_overlay_uv_edit, + IMAGE_PT_overlay_uv_edit_geometry, + IMAGE_PT_overlay_texture_paint, + IMAGE_PT_overlay_image, ) diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index b9153307d70..520a5da878c 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -806,5 +806,19 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) } } } + + /* UV/Image show overlay option. */ + if (!DNA_struct_find(fd->filesdna, "SpaceImageOverlay")) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) { + if (space->spacetype == SPACE_IMAGE) { + SpaceImage *sima = (SpaceImage *)space; + sima->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS; + } + } + } + } + } } } diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c index bc41042ef02..af20e85a89b 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.c +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c @@ -78,6 +78,7 @@ void OVERLAY_edit_uv_init(OVERLAY_Data *vedata) SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; const Scene *scene = draw_ctx->scene; const ToolSettings *ts = scene->toolsettings; + const bool show_overlays = !pd->hide_overlays; Image *image = sima->image; /* By design no image is an image type. This so editor shows UV's by default. */ @@ -99,21 +100,20 @@ void OVERLAY_edit_uv_init(OVERLAY_Data *vedata) ((sima->flag & SI_DRAW_STRETCH) != 0); const bool do_tex_paint_shadows = (sima->flag & SI_NO_DRAW_TEXPAINT) == 0; - pd->edit_uv.do_faces = do_faces && !do_uvstretching_overlay; - pd->edit_uv.do_face_dots = do_faces && do_face_dots; - - pd->edit_uv.do_uv_overlay = do_uv_overlay; - pd->edit_uv.do_uv_shadow_overlay = is_image_type && + pd->edit_uv.do_faces = show_overlays && do_faces && !do_uvstretching_overlay; + pd->edit_uv.do_face_dots = show_overlays && do_faces && do_face_dots; + pd->edit_uv.do_uv_overlay = show_overlays && do_uv_overlay; + pd->edit_uv.do_uv_shadow_overlay = show_overlays && is_image_type && ((is_paint_mode && do_tex_paint_shadows && ((draw_ctx->object_mode & (OB_MODE_TEXTURE_PAINT | OB_MODE_EDIT)) != 0)) || (is_view_mode && do_tex_paint_shadows && ((draw_ctx->object_mode & (OB_MODE_TEXTURE_PAINT)) != 0)) || (do_uv_overlay && (show_modified_uvs))); - pd->edit_uv.do_uv_stretching_overlay = do_uvstretching_overlay; + pd->edit_uv.do_uv_stretching_overlay = show_overlays && do_uvstretching_overlay; pd->edit_uv.uv_opacity = sima->uv_opacity; - pd->edit_uv.do_tiled_image_overlay = is_image_type && is_tiled_image; - + pd->edit_uv.do_tiled_image_overlay = show_overlays && is_image_type && is_tiled_image; + pd->edit_uv.do_tiled_image_border_overlay = is_image_type && is_tiled_image; pd->edit_uv.dash_length = 4.0f * UI_DPI_FAC; pd->edit_uv.line_style = edit_uv_line_style_from_space_image(sima); pd->edit_uv.do_smooth_wire = ((U.gpu_flag & USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE) > 0); @@ -223,7 +223,7 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) } } - if (pd->edit_uv.do_tiled_image_overlay) { + if (pd->edit_uv.do_tiled_image_border_overlay) { const DRWContextState *draw_ctx = DRW_context_state_get(); SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; Image *image = sima->image; @@ -252,14 +252,22 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata) obmat[3][0] = (float)tile_x; DRW_shgroup_call_obmat(grp, geom, obmat); } + /* Only mark active border when overlays are enabled. */ + if (pd->edit_uv.do_tiled_image_overlay) { + /* Active tile border */ + ImageTile *active_tile = BLI_findlink(&image->tiles, image->active_tile_index); + obmat[3][0] = (float)((active_tile->tile_number - 1001) % 10); + obmat[3][1] = (float)((active_tile->tile_number - 1001) / 10); + grp = DRW_shgroup_create(sh, psl->edit_uv_tiled_image_borders_ps); + DRW_shgroup_uniform_vec4_copy(grp, "color", selected_color); + DRW_shgroup_call_obmat(grp, geom, obmat); + } + } - /* Active tile border */ - ImageTile *active_tile = BLI_findlink(&image->tiles, image->active_tile_index); - obmat[3][0] = (float)((active_tile->tile_number - 1001) % 10); - obmat[3][1] = (float)((active_tile->tile_number - 1001) / 10); - grp = DRW_shgroup_create(sh, psl->edit_uv_tiled_image_borders_ps); - DRW_shgroup_uniform_vec4_copy(grp, "color", selected_color); - DRW_shgroup_call_obmat(grp, geom, obmat); + if (pd->edit_uv.do_tiled_image_overlay) { + const DRWContextState *draw_ctx = DRW_context_state_get(); + SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; + Image *image = sima->image; struct DRWTextStore *dt = DRW_text_cache_ensure(); uchar color[4]; @@ -377,7 +385,7 @@ void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata) OVERLAY_StorageList *stl = vedata->stl; OVERLAY_PrivateData *pd = stl->pd; - if (pd->edit_uv.do_tiled_image_overlay) { + if (pd->edit_uv.do_tiled_image_border_overlay) { DRW_draw_pass(psl->edit_uv_tiled_image_borders_ps); } diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index 5a87af7238e..76697b42a52 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -66,6 +66,7 @@ static void OVERLAY_engine_init(void *vedata) pd->is_image_editor = sima != NULL; if (pd->is_image_editor) { + pd->hide_overlays = (sima->overlay.flag & SI_OVERLAY_SHOW_OVERLAYS) == 0; pd->clipping_state = 0; OVERLAY_grid_init(data); OVERLAY_edit_uv_init(data); diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index ada2c2c8d1f..ef7a2db476c 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -356,6 +356,7 @@ typedef struct OVERLAY_PrivateData { bool do_uv_shadow_overlay; bool do_uv_stretching_overlay; bool do_tiled_image_overlay; + bool do_tiled_image_border_overlay; bool do_faces; bool do_face_dots; diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index 86f19c6cfd7..1f1b52e9577 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -208,11 +208,14 @@ static bool is_cursor_visible_2d(const DRWContextState *draw_ctx) if (space_data == NULL) { return false; } - if (space_data->spacetype == SPACE_IMAGE) { - SpaceImage *sima = (SpaceImage *)draw_ctx->space_data; - return sima->mode == SI_MODE_UV; + if (space_data->spacetype != SPACE_IMAGE) { + return false; + } + SpaceImage *sima = (SpaceImage *)space_data; + if (sima->mode != SI_MODE_UV) { + return false; } - return false; + return (sima->overlay.flag & SI_OVERLAY_SHOW_OVERLAYS) != 0; } void DRW_draw_cursor_2d(void) diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 510c638d227..7a53e9b75b6 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -128,6 +128,7 @@ static SpaceLink *image_create(const ScrArea *UNUSED(area), const Scene *UNUSED( simage->lock = true; simage->flag = SI_SHOW_GPENCIL | SI_USE_ALPHA | SI_COORDFLOATS; simage->uv_opacity = 1.0f; + simage->overlay.flag = SI_OVERLAY_SHOW_OVERLAYS; BKE_imageuser_default(&simage->iuser); simage->iuser.flag = IMA_SHOW_STEREO | IMA_ANIM_ALWAYS; diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 867da1bcb82..9d9b41a1f81 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1037,6 +1037,12 @@ enum { * \{ */ /* Image/UV Editor */ + +typedef struct SpaceImageOverlay { + int flag; + char _pad[4]; +} SpaceImageOverlay; + typedef struct SpaceImage { SpaceLink *next, *prev; /** Storage of regions for inactive spaces. */ @@ -1096,6 +1102,7 @@ typedef struct SpaceImage { int tile_grid_shape[2]; MaskSpaceInfo mask_info; + SpaceImageOverlay overlay; } SpaceImage; /* SpaceImage.dt_uv */ @@ -1158,7 +1165,7 @@ typedef enum eSpaceImage_Flag { SI_PREVSPACE = (1 << 15), SI_FULLWINDOW = (1 << 16), - SI_FLAG_UNUSED_17 = (1 << 17), /* cleared */ + SI_FLAG_UNUSED_17 = (1 << 17), SI_FLAG_UNUSED_18 = (1 << 18), /* cleared */ /** @@ -1181,6 +1188,10 @@ typedef enum eSpaceImage_Flag { SI_SHOW_B = (1 << 29), } eSpaceImage_Flag; +typedef enum eSpaceImageOverlay_Flag { + SI_OVERLAY_SHOW_OVERLAYS = (1 << 0), +} eSpaceImageOverlay_Flag; + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index cfd87f14d48..1c2db53b12c 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -585,6 +585,7 @@ extern StructRNA RNA_SpaceDopeSheetEditor; extern StructRNA RNA_SpaceFileBrowser; extern StructRNA RNA_SpaceGraphEditor; extern StructRNA RNA_SpaceImageEditor; +extern StructRNA RNA_SpaceImageOverlay; extern StructRNA RNA_SpaceInfo; extern StructRNA RNA_SpaceNLA; extern StructRNA RNA_SpaceNodeEditor; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 0e5780012dd..2a4bc6bae06 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -1397,6 +1397,16 @@ static char *rna_View3DOverlay_path(PointerRNA *UNUSED(ptr)) /* Space Image Editor */ +static PointerRNA rna_SpaceImage_overlay_get(PointerRNA *ptr) +{ + return rna_pointer_inherit_refine(ptr, &RNA_SpaceImageOverlay, ptr->data); +} + +static char *rna_SpaceImageOverlay_path(PointerRNA *UNUSED(ptr)) +{ + return BLI_strdup("overlay"); +} + static char *rna_SpaceUVEditor_path(PointerRNA *UNUSED(ptr)) { return BLI_strdup("uv_editor"); @@ -4512,6 +4522,23 @@ static void rna_def_space_properties(BlenderRNA *brna) prop, NC_SPACE | ND_SPACE_PROPERTIES, "rna_SpaceProperties_search_filter_update"); } +static void rna_def_space_image_overlay(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "SpaceImageOverlay", NULL); + RNA_def_struct_sdna(srna, "SpaceImage"); + RNA_def_struct_nested(brna, srna, "SpaceImageEditor"); + RNA_def_struct_path_func(srna, "rna_SpaceImageOverlay_path"); + RNA_def_struct_ui_text( + srna, "Overlay Settings", "Settings for display of overlays in the UV/Image editor"); + + prop = RNA_def_property(srna, "show_overlays", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", SI_OVERLAY_SHOW_OVERLAYS); + RNA_def_property_ui_text(prop, "Show Overlays", "Display overlays like UV Maps and Metadata"); +} + static void rna_def_space_image(BlenderRNA *brna) { StructRNA *srna; @@ -4675,7 +4702,16 @@ static void rna_def_space_image(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Show Mask Editor", "Show Mask editing related properties"); + /* Overlays */ + prop = RNA_def_property(srna, "overlay", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_struct_type(prop, "SpaceImageOverlay"); + RNA_def_property_pointer_funcs(prop, "rna_SpaceImage_overlay_get", NULL, NULL, NULL); + RNA_def_property_ui_text( + prop, "Overlay Settings", "Settings for display of overlays in the UV/Image editor"); + rna_def_space_image_uv(brna); + rna_def_space_image_overlay(brna); /* mask */ rna_def_space_mask_info(srna, NC_SPACE | ND_SPACE_IMAGE, "rna_SpaceImageEditor_mask_set"); |