[Bf-blender-cvs] [d3d0c8febce] temp-udim-images: Add operators for adding and removing tiles
Lukas Stockner
noreply at git.blender.org
Tue Jun 12 18:56:26 CEST 2018
Commit: d3d0c8febceab90272635815108b8b5ba6cd3f8c
Author: Lukas Stockner
Date: Tue Jun 12 18:55:21 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rBd3d0c8febceab90272635815108b8b5ba6cd3f8c
Add operators for adding and removing tiles
===================================================================
M release/scripts/startup/bl_ui/space_image.py
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/intern/image.c
M source/blender/editors/space_image/image_intern.h
M source/blender/editors/space_image/image_ops.c
M source/blender/editors/space_image/space_image.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index e8c9925ba9e..bc1883799f8 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -730,6 +730,27 @@ class IMAGE_PT_view_properties(Panel):
layout.prop(render_slot, "name", text="Slot Name")
+class IMAGE_PT_tile_properties(Panel):
+ bl_space_type = 'IMAGE_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Tiles"
+
+ @classmethod
+ def poll(cls, context):
+ sima = context.space_data
+ return (sima and sima.image and sima.image.source == 'TILED')
+
+ def draw(self, context):
+ layout = self.layout
+
+ sima = context.space_data
+ ima = sima.image
+
+ row = layout.row(align=True)
+ row.operator("image.add_tile")
+ row.operator("image.remove_tile")
+
+
class IMAGE_PT_tools_transform_uvs(Panel, UVToolsPanel):
bl_label = "Transform"
@@ -1362,6 +1383,7 @@ classes = (
IMAGE_PT_active_mask_point,
IMAGE_PT_image_properties,
IMAGE_PT_view_properties,
+ IMAGE_PT_tile_properties,
IMAGE_PT_tools_transform_uvs,
IMAGE_PT_tools_align_uvs,
IMAGE_PT_tools_uvs,
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 2f44ac28316..6d2caf8f93f 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -277,6 +277,8 @@ bool BKE_image_has_opengl_texture(struct Image *ima);
/* get tile index for tiled images */
int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser);
+struct ImageTile *BKE_image_add_tile(struct Image *ima);
+bool BKE_image_remove_tile(struct Image *ima);
bool BKE_image_make_tiled(struct Image *ima, int num_tiles);
struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 526e222463e..5b1ed1bb67a 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -3024,6 +3024,38 @@ int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser)
return iuser->tile;
}
+ImageTile *BKE_image_add_tile(struct Image *ima)
+{
+ if (ima->source != IMA_SRC_TILED) {
+ return NULL;
+ }
+
+ int tile_id = ima->num_tiles;
+ ima->num_tiles++;
+ ima->tiles = MEM_recallocN(ima->tiles, sizeof(ImageTile)*ima->num_tiles);
+ ima->tiles[tile_id].ok = 1;
+
+ return &ima->tiles[tile_id];
+}
+
+bool BKE_image_remove_tile(struct Image *ima)
+{
+ if (ima->source != IMA_SRC_TILED) {
+ return false;
+ }
+
+ if (ima->num_tiles == 1) {
+ return false;
+ }
+
+ image_free_tile(ima, ima->num_tiles-1);
+
+ ima->num_tiles--;
+ ima->tiles = MEM_reallocN(ima->tiles, sizeof(ImageTile)*ima->num_tiles);
+
+ return true;
+}
+
bool BKE_image_make_tiled(struct Image *ima, int num_tiles)
{
if (ima->source != IMA_SRC_FILE) {
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 9167a193f2d..0db4605adad 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -94,6 +94,9 @@ void IMAGE_OT_read_viewlayers(struct wmOperatorType *ot);
void IMAGE_OT_render_border(struct wmOperatorType *ot);
void IMAGE_OT_clear_render_border(struct wmOperatorType *ot);
+void IMAGE_OT_add_tile(struct wmOperatorType *ot);
+void IMAGE_OT_remove_tile(struct wmOperatorType *ot);
+
/* image_panels.c */
struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree);
void image_buttons_register(struct ARegionType *art);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 55cca0fc739..26a2f542788 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -3858,3 +3858,77 @@ void IMAGE_OT_clear_render_border(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
+
+/* ********************* Add tile operator ****************** */
+
+static int add_tile_poll(bContext *C)
+{
+ Image *ima = CTX_data_edit_image(C);
+
+ return (ima && ima->source == IMA_SRC_TILED);
+}
+
+static int add_tile_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Image *ima = ED_space_image(sima);
+
+ if (BKE_image_add_tile(ima) == NULL)
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void IMAGE_OT_add_tile(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Add tile";
+ ot->description = "Adds a tile to the image";
+ ot->idname = "IMAGE_OT_add_tile";
+
+ /* api callbacks */
+ ot->poll = add_tile_poll;
+ ot->exec = add_tile_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+/* ********************* Remove tile operator ****************** */
+
+static int remove_tile_poll(bContext *C)
+{
+ Image *ima = CTX_data_edit_image(C);
+
+ return (ima && ima->source == IMA_SRC_TILED && ima->num_tiles > 1);
+}
+
+static int remove_tile_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ SpaceImage *sima = CTX_wm_space_image(C);
+ Image *ima = ED_space_image(sima);
+
+ if (BKE_image_remove_tile(ima))
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void IMAGE_OT_remove_tile(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Remove tile";
+ ot->description = "Removes a tile from the image";
+ ot->idname = "IMAGE_OT_remove_tile";
+
+ /* api callbacks */
+ ot->poll = remove_tile_poll;
+ ot->exec = remove_tile_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
\ No newline at end of file
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 028926e21eb..549dcfee4fa 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -285,6 +285,9 @@ static void image_operatortypes(void)
WM_operatortype_append(IMAGE_OT_read_viewlayers);
WM_operatortype_append(IMAGE_OT_render_border);
WM_operatortype_append(IMAGE_OT_clear_render_border);
+
+ WM_operatortype_append(IMAGE_OT_add_tile);
+ WM_operatortype_append(IMAGE_OT_remove_tile);
}
static void image_keymap(struct wmKeyConfig *keyconf)
More information about the Bf-blender-cvs
mailing list