[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