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)

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to