diff options
Diffstat (limited to 'source/blender/editors/space_image')
-rw-r--r-- | source/blender/editors/space_image/CMakeLists.txt | 7 | ||||
-rw-r--r-- | source/blender/editors/space_image/SConscript | 6 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 36 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_draw.c | 7 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 85 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 10 |
7 files changed, 131 insertions, 22 deletions
diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt index 62ac3c2d985..30bfc2fbdfd 100644 --- a/source/blender/editors/space_image/CMakeLists.txt +++ b/source/blender/editors/space_image/CMakeLists.txt @@ -23,14 +23,15 @@ set(INC ../../blenfont ../../blenkernel ../../blenlib - ../../imbuf ../../bmesh + ../../imbuf + ../../gpu ../../makesdna ../../makesrna ../../render/extern/include ../../windowmanager ../../../../intern/guardedalloc - ../../gpu + ../../../../intern/glew-mx ) set(INC_SYS @@ -71,4 +72,6 @@ if(WITH_IMAGE_CINEON) add_definitions(-DWITH_CINEON) endif() +add_definitions(${GL_DEFINITIONS}) + blender_add_lib(bf_editor_space_image "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript index d878a726b55..e983db431b4 100644 --- a/source/blender/editors/space_image/SConscript +++ b/source/blender/editors/space_image/SConscript @@ -31,12 +31,14 @@ sources = env.Glob('*.c') incs = [ '#/intern/guardedalloc', - '#/extern/glew/include', + env['BF_GLEW_INC'], + '#/intern/glew-mx', '../include', '../../blenfont', '../../blenkernel', '../../blenlib', '../../bmesh', + '../../gpu', '../../imbuf', '../../makesdna', '../../makesrna', @@ -46,7 +48,7 @@ incs = [ ] incs = ' '.join(incs) -defs = [] +defs = env['BF_GL_DEFINITIONS'] if env['WITH_BF_INTERNATIONAL']: defs.append('WITH_INTERNATIONAL') diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index ed6e6ba1e1b..ffdb8ecfce6 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -284,10 +284,10 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PRE /* ********************* callbacks for standard image buttons *************** */ -static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void *render_slot_p) +static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void *image_p) { uiBlock *block = uiLayoutGetBlock(layout); - short *render_slot = render_slot_p; + Image *image = image_p; int slot; uiDefBut(block, LABEL, 0, IFACE_("Slot"), @@ -296,10 +296,15 @@ static void ui_imageuser_slot_menu(bContext *UNUSED(C), uiLayout *layout, void * slot = IMA_MAX_RENDER_SLOT; while (slot--) { - char str[32]; - BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), slot + 1); + char str[64]; + if (image->render_slots[slot].name[0] != '\0') { + BLI_strncpy(str, image->render_slots[slot].name, sizeof(str)); + } + else { + BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), slot + 1); + } uiDefButS(block, BUTM, B_NOP, str, 0, 0, - UI_UNIT_X * 5, UI_UNIT_X, render_slot, (float) slot, 0.0, 0, -1, ""); + UI_UNIT_X * 5, UI_UNIT_X, &image->render_slot, (float) slot, 0.0, 0, -1, ""); } } @@ -492,7 +497,7 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused) } #endif -static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w, short *render_slot) +static void uiblock_layer_pass_buttons(uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, int w, short *render_slot) { static void *rnd_pt[3]; /* XXX, workaround */ uiBlock *block = uiLayoutGetBlock(layout); @@ -516,8 +521,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image /* menu buts */ if (render_slot) { char str[64]; - BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), *render_slot + 1); - but = uiDefMenuBut(block, ui_imageuser_slot_menu, render_slot, str, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select Slot")); + if (image->render_slots[*render_slot].name[0] != '\0') { + BLI_strncpy(str, image->render_slots[*render_slot].name, sizeof(str)); + } + else { + BLI_snprintf(str, sizeof(str), IFACE_("Slot %d"), *render_slot + 1); + } + but = uiDefMenuBut(block, ui_imageuser_slot_menu, image, str, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select Slot")); uiButSetFunc(but, image_multi_cb, rr, iuser); uiButSetMenuFromPulldown(but); } @@ -547,7 +557,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image } } -static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, short *render_slot) +static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, Image *image, RenderResult *rr, ImageUser *iuser, short *render_slot) { uiBlock *block = uiLayoutGetBlock(layout); uiLayout *row; @@ -569,7 +579,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, but = uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Layer")); uiButSetFunc(but, image_multi_inclay_cb, rr, iuser); - uiblock_layer_pass_buttons(row, rr, iuser, 230 * dpi_fac, render_slot); + uiblock_layer_pass_buttons(row, image, rr, iuser, 230 * dpi_fac, render_slot); /* decrease, increase arrows */ but = uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Pass")); @@ -691,7 +701,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char /* use BKE_image_acquire_renderresult so we get the correct slot in the menu */ rr = BKE_image_acquire_renderresult(scene, ima); - uiblock_layer_pass_arrow_buttons(layout, rr, iuser, &ima->render_slot); + uiblock_layer_pass_arrow_buttons(layout, ima, rr, iuser, &ima->render_slot); BKE_image_release_renderresult(scene, ima); } } @@ -724,7 +734,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char /* multilayer? */ if (ima->type == IMA_TYPE_MULTILAYER && ima->rr) { - uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser, NULL); + uiblock_layer_pass_arrow_buttons(layout, ima, ima->rr, iuser, NULL); } else if (ima->source != IMA_SRC_GENERATED) { if (compact == 0) { @@ -937,7 +947,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser /* use BKE_image_acquire_renderresult so we get the correct slot in the menu */ rr = BKE_image_acquire_renderresult(scene, ima); - uiblock_layer_pass_buttons(layout, rr, iuser, 160 * dpi_fac, (ima->type == IMA_TYPE_R_RESULT) ? &ima->render_slot : NULL); + uiblock_layer_pass_buttons(layout, ima, rr, iuser, 160 * dpi_fac, (ima->type == IMA_TYPE_R_RESULT) ? &ima->render_slot : NULL); BKE_image_release_renderresult(scene, ima); } } diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 79c21bab01c..f41e237beb4 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -83,6 +83,7 @@ static void draw_render_info(Scene *scene, Image *ima, ARegion *ar, float zoomx, { RenderResult *rr; Render *re = RE_GetRender(scene->id.name); + RenderData *rd = RE_engine_get_render_data(re); rr = BKE_image_acquire_renderresult(scene, ima); @@ -110,9 +111,9 @@ static void draw_render_info(Scene *scene, Image *ima, ARegion *ar, float zoomx, glTranslatef(x, y, 0.0f); glScalef(zoomx, zoomy, 1.0f); - if (scene->r.mode & R_BORDER) { - glTranslatef((int)(-scene->r.border.xmin * scene->r.xsch * scene->r.size / 100.0f), - (int)(-scene->r.border.ymin * scene->r.ysch * scene->r.size / 100.0f), + if (rd->mode & R_BORDER) { + glTranslatef((int)(-rd->border.xmin * rd->xsch * rd->size / 100.0f), + (int)(-rd->border.ymin * rd->ysch * rd->size / 100.0f), 0.0f); } diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index 74a0a18b0c8..aecc43f4fdf 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -92,6 +92,8 @@ void IMAGE_OT_curves_point_set(struct wmOperatorType *ot); void IMAGE_OT_change_frame(struct wmOperatorType *ot); void IMAGE_OT_read_renderlayers(struct wmOperatorType *ot); +void IMAGE_OT_render_border(struct wmOperatorType *ot); +void IMAGE_OT_clear_render_border(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 58b56e99119..df556f94f28 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -3101,3 +3101,88 @@ void IMAGE_OT_read_renderlayers(wmOperatorType *ot) /* flags */ ot->flag = 0; } + +/* ********************* Render border operator ****************** */ + +static int render_border_exec(bContext *C, wmOperator *op) +{ + ARegion *ar = CTX_wm_region(C); + Scene *scene = CTX_data_scene(C); + rctf border; + + /* get rectangle from operator */ + WM_operator_properties_border_to_rctf(op, &border); + UI_view2d_region_to_view_rctf(&ar->v2d, &border, &border); + + /* actually set border */ + CLAMP(border.xmin, 0.0f, 1.0f); + CLAMP(border.ymin, 0.0f, 1.0f); + CLAMP(border.xmax, 0.0f, 1.0f); + CLAMP(border.ymax, 0.0f, 1.0f); + scene->r.border = border; + + /* drawing a border surrounding the entire camera view switches off border rendering + * or the border covers no pixels */ + if ((border.xmin <= 0.0f && border.xmax >= 1.0f && + border.ymin <= 0.0f && border.ymax >= 1.0f) || + (border.xmin == border.xmax || border.ymin == border.ymax)) + { + scene->r.mode &= ~R_BORDER; + } + else { + scene->r.mode |= R_BORDER; + } + + WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + return OPERATOR_FINISHED; + +} + +void IMAGE_OT_render_border(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Render Border"; + ot->description = "Set the boundaries of the border render and enable border render"; + ot->idname = "IMAGE_OT_render_border"; + + /* api callbacks */ + ot->invoke = WM_border_select_invoke; + ot->exec = render_border_exec; + ot->modal = WM_border_select_modal; + ot->cancel = WM_border_select_cancel; + ot->poll = image_cycle_render_slot_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* rna */ + WM_operator_properties_border(ot); +} + +/* ********************* Clear render border operator ****************** */ + +static int clear_render_border_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Scene *scene = CTX_data_scene(C); + scene->r.mode &= ~R_BORDER; + WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, NULL); + BLI_rctf_init(&scene->r.border, 0.0f, 1.0f, 0.0f, 1.0f); + return OPERATOR_FINISHED; + +} + +void IMAGE_OT_clear_render_border(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Render Border"; + ot->description = "Clear the boundaries of the border render and disable border render"; + ot->idname = "IMAGE_OT_clear_render_border"; + + /* api callbacks */ + ot->exec = clear_render_border_exec; + ot->poll = image_cycle_render_slot_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index ab616bf592f..9cfd2e645f9 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -257,6 +257,8 @@ static void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_change_frame); WM_operatortype_append(IMAGE_OT_read_renderlayers); + WM_operatortype_append(IMAGE_OT_render_border); + WM_operatortype_append(IMAGE_OT_clear_render_border); } static void image_keymap(struct wmKeyConfig *keyconf) @@ -325,9 +327,9 @@ static void image_keymap(struct wmKeyConfig *keyconf) RNA_boolean_set(kmi->ptr, "toggle", true); /* fast switch to render slots */ - for (i = 0; i < MAX2(IMA_MAX_RENDER_SLOT, 9); i++) { + for (i = 0; i < MIN2(IMA_MAX_RENDER_SLOT, 9); i++) { kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY + i, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "data_path", "space_data.image.render_slot"); + RNA_string_set(kmi->ptr, "data_path", "space_data.image.render_slots.active_index"); RNA_int_set(kmi->ptr, "value", i); } @@ -343,6 +345,10 @@ static void image_keymap(struct wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0); RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point"); RNA_string_set(kmi->ptr, "value", "CURSOR"); + + /* render border */ + WM_keymap_add_item(keymap, "IMAGE_OT_render_border", BKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_clear_render_border", BKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); } /* dropboxes */ |