[Bf-blender-cvs] [b91706368f1] temp-udim-images: Add operator for generating images in specific tiles

Lukas Stockner noreply at git.blender.org
Tue Jun 12 21:47:17 CEST 2018


Commit: b91706368f1f4f70c36336a585506e6895432371
Author: Lukas Stockner
Date:   Tue Jun 12 21:44:28 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rBb91706368f1f4f70c36336a585506e6895432371

Add operator for generating images in specific 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 e0a55326aab..72e07086bb0 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -753,6 +753,7 @@ class IMAGE_PT_tile_properties(Panel):
         layout.prop(sima, "current_tile")
         tile = ima.tiles[sima.current_tile]
         layout.prop(tile, "label")
+        layout.operator("image.generate_tile")
 
 
 class IMAGE_PT_tools_transform_uvs(Panel, UVToolsPanel):
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 6d04c4b9c39..aacea3851b2 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -282,6 +282,8 @@ struct ImageTile *BKE_image_add_tile(struct Image *ima, const char *label);
 bool BKE_image_remove_tile(struct Image *ima);
 bool BKE_image_make_tiled(struct Image *ima, int num_tiles);
 
+bool BKE_image_generate_tile(struct Image *ima, int tile, const float color[4], int gen_type);
+
 struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type);
 void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPUTexture *tex);
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 7e92f354438..5e482da2546 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -3104,6 +3104,37 @@ void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPU
 	ima->tiles[tile].gputexture[type] = tex;
 }
 
+bool BKE_image_generate_tile(struct Image *ima, int tile, const float color[4], int gen_type)
+{
+	if (!ima || ima->source != IMA_SRC_TILED || tile < 0 || tile >= ima->num_tiles) {
+		return false;
+	}
+
+	image_free_tile(ima, tile);
+
+	ImageUser iuser = {NULL};
+	iuser.ok = true;
+	ImBuf *main_ibuf = image_acquire_ibuf(ima, &iuser, NULL);
+	if (!main_ibuf) {
+		return false;
+	}
+	int x = main_ibuf->x;
+	int y = main_ibuf->y;
+	int planes = main_ibuf->planes;
+	bool is_float = (main_ibuf->rect_float != NULL);
+	BKE_image_release_ibuf(ima, main_ibuf, NULL);
+
+	ImBuf *tile_ibuf = add_ibuf_size(x, y, ima->name, planes, is_float, gen_type, color, &ima->colorspace_settings);
+
+	if (tile_ibuf) {
+		image_assign_ibuf(ima, tile_ibuf, 0, tile);
+		BKE_image_release_ibuf(ima, tile_ibuf, NULL);
+		ima->tiles[tile].ok = 1;
+		return true;
+	}
+	return false;
+}
+
 /* if layer or pass changes, we need an index for the imbufs list */
 /* note it is called for rendered results, but it doesnt use the index! */
 /* and because rendered results use fake layer/passes, don't correct for wrong indices here */
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 0db4605adad..1a11f4e2372 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -96,6 +96,7 @@ 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);
+void IMAGE_OT_generate_tile(struct wmOperatorType *ot);
 
 /* image_panels.c */
 struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index d809ba2ac62..9ce138532e3 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -3931,4 +3931,82 @@ void IMAGE_OT_remove_tile(wmOperatorType *ot)
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+/* ********************* Generate tile operator ****************** */
+
+static int generate_tile_poll(bContext *C)
+{
+	Image *ima = CTX_data_edit_image(C);
+	SpaceImage *sima = CTX_wm_space_image(C);
+
+	return (ima && ima->source == IMA_SRC_TILED && sima->curtile >= 0 && sima->curtile < ima->num_tiles);
+}
+
+static int generate_tile_exec(bContext *C, wmOperator *op)
+{
+	SpaceImage *sima = CTX_wm_space_image(C);
+	Image *ima = ED_space_image(sima);
+
+	float color[4];
+	RNA_float_get_array(op->ptr, "color", color);
+	int gen_type = RNA_enum_get(op->ptr, "generated_type");
+
+	if (!BKE_image_generate_tile(ima, sima->curtile, color, gen_type))
+		return OPERATOR_CANCELLED;
+
+	WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static int generate_tile_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, 5 * UI_UNIT_Y);
+}
+
+static void generate_tile_draw(bContext *UNUSED(C), wmOperator *op)
+{
+	uiLayout *split, *col[2];
+	uiLayout *layout = op->layout;
+	PointerRNA ptr;
+
+	RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
+
+	/* copy of WM_operator_props_dialog_popup() layout */
+
+	split = uiLayoutSplit(layout, 0.5f, false);
+	col[0] = uiLayoutColumn(split, false);
+	col[1] = uiLayoutColumn(split, false);
+
+	uiItemL(col[0], IFACE_("Color"), ICON_NONE);
+	uiItemR(col[1], &ptr, "color", 0, "", ICON_NONE);
+
+	uiItemL(col[0], IFACE_("Generated Type"), ICON_NONE);
+	uiItemR(col[1], &ptr, "generated_type", 0, "", ICON_NONE);
+}
+
+void IMAGE_OT_generate_tile(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Generate tile";
+	ot->description = "Generates an image in the current tile";
+	ot->idname = "IMAGE_OT_generate_tile";
+
+	/* api callbacks */
+	ot->poll = generate_tile_poll;
+	ot->exec = generate_tile_exec;
+	ot->invoke = generate_tile_invoke;
+	ot->ui = generate_tile_draw;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	PropertyRNA *prop;
+	static float default_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+	prop = RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color", 0.0f, 1.0f);
+	RNA_def_property_subtype(prop, PROP_COLOR_GAMMA);
+	RNA_def_property_float_array_default(prop, default_color);
+	RNA_def_enum(ot->srna, "generated_type", rna_enum_image_generated_type_items, IMA_GENTYPE_BLANK,
+	             "Generated Type", "Fill the image with a grid for UV map testing");
 }
\ 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 549dcfee4fa..f7da06aa27e 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -288,6 +288,7 @@ static void image_operatortypes(void)
 
 	WM_operatortype_append(IMAGE_OT_add_tile);
 	WM_operatortype_append(IMAGE_OT_remove_tile);
+	WM_operatortype_append(IMAGE_OT_generate_tile);
 }
 
 static void image_keymap(struct wmKeyConfig *keyconf)



More information about the Bf-blender-cvs mailing list