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