diff options
Diffstat (limited to 'source/blender/editors/uvedit/uvedit_buttons.c')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_buttons.c | 315 |
1 files changed, 169 insertions, 146 deletions
diff --git a/source/blender/editors/uvedit/uvedit_buttons.c b/source/blender/editors/uvedit/uvedit_buttons.c index 6f8bfac8c57..16620436029 100644 --- a/source/blender/editors/uvedit/uvedit_buttons.c +++ b/source/blender/editors/uvedit/uvedit_buttons.c @@ -53,62 +53,63 @@ #include "WM_api.h" #include "WM_types.h" -#define B_UVEDIT_VERTEX 3 +#define B_UVEDIT_VERTEX 3 /* UV Utilities */ static int uvedit_center(Scene *scene, Object *obedit, BMEditMesh *em, Image *ima, float center[2]) { - BMFace *f; - BMLoop *l; - BMIter iter, liter; - MLoopUV *luv; - int tot = 0; - - const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV); - - zero_v2(center); - BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { - if (!uvedit_face_visible_test(scene, obedit, ima, f)) - continue; - - BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - add_v2_v2(center, luv->uv); - tot++; - } - } - } - - if (tot > 0) { - center[0] /= tot; - center[1] /= tot; - } - - return tot; + BMFace *f; + BMLoop *l; + BMIter iter, liter; + MLoopUV *luv; + int tot = 0; + + const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV); + + zero_v2(center); + BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { + if (!uvedit_face_visible_test(scene, obedit, ima, f)) + continue; + + BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { + if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { + luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); + add_v2_v2(center, luv->uv); + tot++; + } + } + } + + if (tot > 0) { + center[0] /= tot; + center[1] /= tot; + } + + return tot; } -static void uvedit_translate(Scene *scene, Object *obedit, BMEditMesh *em, Image *ima, float delta[2]) +static void uvedit_translate( + Scene *scene, Object *obedit, BMEditMesh *em, Image *ima, float delta[2]) { - BMFace *f; - BMLoop *l; - BMIter iter, liter; - MLoopUV *luv; - - const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV); - - BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { - if (!uvedit_face_visible_test(scene, obedit, ima, f)) - continue; - - BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - add_v2_v2(luv->uv, delta); - } - } - } + BMFace *f; + BMLoop *l; + BMIter iter, liter; + MLoopUV *luv; + + const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV); + + BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) { + if (!uvedit_face_visible_test(scene, obedit, ima, f)) + continue; + + BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { + if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { + luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); + add_v2_v2(luv->uv, delta); + } + } + } } /* Button Functions, using an evil static variable */ @@ -117,122 +118,144 @@ static float uvedit_old_center[2]; static void uvedit_vertex_buttons(const bContext *C, uiBlock *block) { - SpaceImage *sima = CTX_wm_space_image(C); - Scene *scene = CTX_data_scene(C); - Object *obedit = CTX_data_edit_object(C); - Image *ima = sima->image; - BMEditMesh *em; - float center[2]; - int imx, imy, step, digits; - float width = 8 * UI_UNIT_X; - - ED_space_image_get_size(sima, &imx, &imy); - - em = BKE_editmesh_from_object(obedit); - - if (uvedit_center(scene, obedit, em, ima, center)) { - float range_xy[2][2] = { - {-10.0f, 10.0f}, - {-10.0f, 10.0f}, - }; - - copy_v2_v2(uvedit_old_center, center); - - /* expand UI range by center */ - CLAMP_MAX(range_xy[0][0], uvedit_old_center[0]); - CLAMP_MIN(range_xy[0][1], uvedit_old_center[0]); - CLAMP_MAX(range_xy[1][0], uvedit_old_center[1]); - CLAMP_MIN(range_xy[1][1], uvedit_old_center[1]); - - if (!(sima->flag & SI_COORDFLOATS)) { - uvedit_old_center[0] *= imx; - uvedit_old_center[1] *= imy; - - mul_v2_fl(range_xy[0], imx); - mul_v2_fl(range_xy[1], imy); - } - - if (sima->flag & SI_COORDFLOATS) { - step = 1; - digits = 3; - } - else { - step = 100; - digits = 2; - } - - UI_block_align_begin(block); - uiDefButF(block, UI_BTYPE_NUM, B_UVEDIT_VERTEX, IFACE_("X:"), 0, 0, width, UI_UNIT_Y, &uvedit_old_center[0], - UNPACK2(range_xy[0]), step, digits, ""); - uiDefButF(block, UI_BTYPE_NUM, B_UVEDIT_VERTEX, IFACE_("Y:"), width, 0, width, UI_UNIT_Y, &uvedit_old_center[1], - UNPACK2(range_xy[1]), step, digits, ""); - UI_block_align_end(block); - } + SpaceImage *sima = CTX_wm_space_image(C); + Scene *scene = CTX_data_scene(C); + Object *obedit = CTX_data_edit_object(C); + Image *ima = sima->image; + BMEditMesh *em; + float center[2]; + int imx, imy, step, digits; + float width = 8 * UI_UNIT_X; + + ED_space_image_get_size(sima, &imx, &imy); + + em = BKE_editmesh_from_object(obedit); + + if (uvedit_center(scene, obedit, em, ima, center)) { + float range_xy[2][2] = { + {-10.0f, 10.0f}, + {-10.0f, 10.0f}, + }; + + copy_v2_v2(uvedit_old_center, center); + + /* expand UI range by center */ + CLAMP_MAX(range_xy[0][0], uvedit_old_center[0]); + CLAMP_MIN(range_xy[0][1], uvedit_old_center[0]); + CLAMP_MAX(range_xy[1][0], uvedit_old_center[1]); + CLAMP_MIN(range_xy[1][1], uvedit_old_center[1]); + + if (!(sima->flag & SI_COORDFLOATS)) { + uvedit_old_center[0] *= imx; + uvedit_old_center[1] *= imy; + + mul_v2_fl(range_xy[0], imx); + mul_v2_fl(range_xy[1], imy); + } + + if (sima->flag & SI_COORDFLOATS) { + step = 1; + digits = 3; + } + else { + step = 100; + digits = 2; + } + + UI_block_align_begin(block); + uiDefButF(block, + UI_BTYPE_NUM, + B_UVEDIT_VERTEX, + IFACE_("X:"), + 0, + 0, + width, + UI_UNIT_Y, + &uvedit_old_center[0], + UNPACK2(range_xy[0]), + step, + digits, + ""); + uiDefButF(block, + UI_BTYPE_NUM, + B_UVEDIT_VERTEX, + IFACE_("Y:"), + width, + 0, + width, + UI_UNIT_Y, + &uvedit_old_center[1], + UNPACK2(range_xy[1]), + step, + digits, + ""); + UI_block_align_end(block); + } } static void do_uvedit_vertex(bContext *C, void *UNUSED(arg), int event) { - SpaceImage *sima = CTX_wm_space_image(C); - Scene *scene = CTX_data_scene(C); - Object *obedit = CTX_data_edit_object(C); - Image *ima = sima->image; - BMEditMesh *em; - float center[2], delta[2]; - int imx, imy; - - if (event != B_UVEDIT_VERTEX) - return; - - em = BKE_editmesh_from_object(obedit); - - ED_space_image_get_size(sima, &imx, &imy); - uvedit_center(scene, obedit, em, ima, center); - - if (sima->flag & SI_COORDFLOATS) { - delta[0] = uvedit_old_center[0] - center[0]; - delta[1] = uvedit_old_center[1] - center[1]; - } - else { - delta[0] = uvedit_old_center[0] / imx - center[0]; - delta[1] = uvedit_old_center[1] / imy - center[1]; - } - - uvedit_translate(scene, obedit, em, ima, delta); - - WM_event_add_notifier(C, NC_IMAGE, sima->image); - DEG_id_tag_update((ID *)obedit->data, ID_RECALC_GEOMETRY); + SpaceImage *sima = CTX_wm_space_image(C); + Scene *scene = CTX_data_scene(C); + Object *obedit = CTX_data_edit_object(C); + Image *ima = sima->image; + BMEditMesh *em; + float center[2], delta[2]; + int imx, imy; + + if (event != B_UVEDIT_VERTEX) + return; + + em = BKE_editmesh_from_object(obedit); + + ED_space_image_get_size(sima, &imx, &imy); + uvedit_center(scene, obedit, em, ima, center); + + if (sima->flag & SI_COORDFLOATS) { + delta[0] = uvedit_old_center[0] - center[0]; + delta[1] = uvedit_old_center[1] - center[1]; + } + else { + delta[0] = uvedit_old_center[0] / imx - center[0]; + delta[1] = uvedit_old_center[1] / imy - center[1]; + } + + uvedit_translate(scene, obedit, em, ima, delta); + + WM_event_add_notifier(C, NC_IMAGE, sima->image); + DEG_id_tag_update((ID *)obedit->data, ID_RECALC_GEOMETRY); } /* Panels */ static bool image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt)) { - SpaceImage *sima = CTX_wm_space_image(C); - if (sima->mode != SI_MODE_UV) { - return false; - } - Object *obedit = CTX_data_edit_object(C); - return ED_uvedit_test(obedit); + SpaceImage *sima = CTX_wm_space_image(C); + if (sima->mode != SI_MODE_UV) { + return false; + } + Object *obedit = CTX_data_edit_object(C); + return ED_uvedit_test(obedit); } static void image_panel_uv(const bContext *C, Panel *pa) { - uiBlock *block; + uiBlock *block; - block = uiLayoutAbsoluteBlock(pa->layout); - UI_block_func_handle_set(block, do_uvedit_vertex, NULL); + block = uiLayoutAbsoluteBlock(pa->layout); + UI_block_func_handle_set(block, do_uvedit_vertex, NULL); - uvedit_vertex_buttons(C, block); + uvedit_vertex_buttons(C, block); } void ED_uvedit_buttons_register(ARegionType *art) { - PanelType *pt; - - pt = MEM_callocN(sizeof(PanelType), "spacetype image panel uv"); - strcpy(pt->idname, "IMAGE_PT_uv"); - strcpy(pt->label, N_("UV Vertex")); /* XXX C panels unavailable through RNA bpy.types! */ - pt->draw = image_panel_uv; - pt->poll = image_panel_uv_poll; - BLI_addtail(&art->paneltypes, pt); + PanelType *pt; + + pt = MEM_callocN(sizeof(PanelType), "spacetype image panel uv"); + strcpy(pt->idname, "IMAGE_PT_uv"); + strcpy(pt->label, N_("UV Vertex")); /* XXX C panels unavailable through RNA bpy.types! */ + pt->draw = image_panel_uv; + pt->poll = image_panel_uv_poll; + BLI_addtail(&art->paneltypes, pt); } |