[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