diff options
author | Joseph Eagar <joeedh@gmail.com> | 2011-05-09 03:43:18 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2011-05-09 03:43:18 +0400 |
commit | 6ef77cf95accc3cb914e7efd964118ce6e9521cf (patch) | |
tree | 1d8dbf95355038c93f79f9053a0bf1d55b561ec3 /source/blender/editors/uvedit | |
parent | 3462ddf17f38eb61fc3bb2751d55de15a47455c3 (diff) | |
parent | 770119d16f7dbee99a60d19540818892c970c4e2 (diff) |
=bmesh= merge from trunk at r36529
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_buttons.c | 214 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_draw.c | 2 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 63 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_parametrizer.c | 4 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_unwrap_ops.c | 13 |
6 files changed, 231 insertions, 66 deletions
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt index 04b27a37c0d..027f7f62203 100644 --- a/source/blender/editors/uvedit/CMakeLists.txt +++ b/source/blender/editors/uvedit/CMakeLists.txt @@ -34,6 +34,7 @@ set(INC ) set(SRC + uvedit_buttons.c uvedit_draw.c uvedit_ops.c uvedit_parametrizer.c diff --git a/source/blender/editors/uvedit/uvedit_buttons.c b/source/blender/editors/uvedit/uvedit_buttons.c new file mode 100644 index 00000000000..5338a1229b6 --- /dev/null +++ b/source/blender/editors/uvedit/uvedit_buttons.c @@ -0,0 +1,214 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * Contributor(s): Blender Foundation, 2002-2009 + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/uvedit/uvedit_buttons.c + * \ingroup eduv + */ + +#include <string.h> +#include <stdio.h> + +#include "MEM_guardedalloc.h" + +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_space_types.h" + +#include "BLI_blenlib.h" +#include "BLI_math.h" +#include "BLI_editVert.h" +#include "BLI_utildefines.h" + +#include "BKE_context.h" +#include "BKE_customdata.h" +#include "BKE_mesh.h" +#include "BKE_screen.h" +#include "BKE_tessmesh.h" + +#include "ED_image.h" +#include "ED_uvedit.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "WM_api.h" +#include "WM_types.h" + +#define B_UVEDIT_VERTEX 3 + +/* UV Utilities */ + +static int uvedit_center(Scene *scene, BMEditMesh *em, Image *ima, float center[2]) +{ + BMFace *f; + BMLoop *l; + BMIter iter, liter; + MLoopUV *luv; + int tot = 0.0; + + zero_v2(center); + BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) { + BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) { + luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); + if (uvedit_uv_selected(em, scene, l)) { + add_v2_v2(center, luv->uv); + tot++; + } + } + } + + if(tot > 0) { + center[0] /= tot; + center[1] /= tot; + } + + return tot; +} + +static void uvedit_translate(Scene *scene, BMEditMesh *em, Image *ima, float delta[2]) +{ + BMFace *f; + BMLoop *l; + BMIter iter, liter; + MLoopUV *luv; + + BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) { + BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) { + luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); + if (uvedit_uv_selected(em, scene, l)) { + add_v2_v2(luv->uv, delta); + } + } + } +} + +/* Button Functions, using an evil static variable */ + +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; + + ED_space_image_size(sima, &imx, &imy); + + em= ((Mesh *)obedit->data)->edit_btmesh; + + if(uvedit_center(scene, em, ima, center)) { + copy_v2_v2(uvedit_old_center, center); + + if(!(sima->flag & SI_COORDFLOATS)) { + uvedit_old_center[0] *= imx; + uvedit_old_center[1] *= imy; + } + + if(sima->flag & SI_COORDFLOATS) { + step= 1; + digits= 3; + } + else { + step= 100; + digits= 2; + } + + uiBlockBeginAlign(block); + uiDefButF(block, NUM, B_UVEDIT_VERTEX, "X:", 10, 10, 145, 19, &uvedit_old_center[0], -10*imx, 10.0*imx, step, digits, ""); + uiDefButF(block, NUM, B_UVEDIT_VERTEX, "Y:", 165, 10, 145, 19, &uvedit_old_center[1], -10*imy, 10.0*imy, step, digits, ""); + uiBlockEndAlign(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= ((Mesh *)obedit->data)->edit_btmesh; + + ED_space_image_size(sima, &imx, &imy); + uvedit_center(scene, 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, em, ima, delta); + + WM_event_add_notifier(C, NC_IMAGE, sima->image); +} + +/* Panels */ + +static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt)) +{ + Object *obedit= CTX_data_edit_object(C); + return ED_uvedit_test(obedit); +} + +static void image_panel_uv(const bContext *C, Panel *pa) +{ + uiBlock *block; + + block= uiLayoutAbsoluteBlock(pa->layout); + uiBlockSetHandleFunc(block, do_uvedit_vertex, NULL); + + 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, "UV Vertex"); + pt->draw= image_panel_uv; + pt->poll= image_panel_uv_poll; + BLI_addtail(&art->paneltypes, pt); +} + diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index 4986f4b46ba..6b3cc1a8278 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -487,7 +487,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) int drawfaces, interpedges; int i; Image *ima= sima->image; - + em= me->edit_btmesh; activetf= EDBM_get_active_mtexpoly(em, &efa_act, 0); /* will be set to NULL if hidden */ activef = EDBM_get_actFace(em, 0); diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 473b24da4a5..de749be8457 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1517,62 +1517,6 @@ static void UV_OT_stitch(wmOperatorType *ot) /* ******************** (de)select all operator **************** */ -static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op)) -{ - Scene *scene; - ToolSettings *ts; - Object *obedit; - BMEditMesh *em; - BMFace *efa; - BMLoop *l; - BMIter iter, liter; - Image *ima; - MTexPoly *tf; - MLoopUV *luv; - - scene= CTX_data_scene(C); - ts= CTX_data_tool_settings(C); - obedit= CTX_data_edit_object(C); - em= ((Mesh*)obedit->data)->edit_btmesh; - ima= CTX_data_edit_image(C); - - if(ts->uv_flag & UV_SYNC_SELECTION) { - EDBM_select_swap(em); - } - else { - BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) { - tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - - if(!uvedit_face_visible(scene, ima, efa, tf)) - continue; - - BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) { - luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - luv->flag = luv->flag ^ MLOOPUV_VERTSEL; - } - } - } - - WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); - - return OPERATOR_FINISHED; -} - -static void UV_OT_select_inverse(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Select Inverse"; - ot->description= "Select inverse of (un)selected UV vertices"; - ot->idname= "UV_OT_select_inverse"; - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* api callbacks */ - ot->exec= select_inverse_exec; - ot->poll= ED_operator_uvedit; -} - -/* ******************** (de)select all operator **************** */ - static int select_all_exec(bContext *C, wmOperator *op) { Scene *scene; @@ -2013,7 +1957,7 @@ static void UV_OT_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Select"; - ot->description= "Select UV vertice"; + ot->description= "Select UV vertices"; ot->idname= "UV_OT_select"; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -2551,7 +2495,7 @@ static int circle_select_exec(bContext *C, wmOperator *op) int x, y, radius, width, height, select; float zoomx, zoomy, offset[2], ellipse[2]; int gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); - + /* get operator properties */ select= (gesture_mode == GESTURE_MODAL_SELECT); x= RNA_int_get(op->ptr, "x"); @@ -3325,7 +3269,6 @@ static void UV_OT_tile_set(wmOperatorType *ot) void ED_operatortypes_uvedit(void) { WM_operatortype_append(UV_OT_select_all); - WM_operatortype_append(UV_OT_select_inverse); WM_operatortype_append(UV_OT_select); WM_operatortype_append(UV_OT_select_loop); WM_operatortype_append(UV_OT_select_linked); @@ -3387,7 +3330,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "UV_OT_unlink_selected", LKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "UV_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "action", SEL_INVERT); WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_weldalign", WKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index b2f3c0572f1..cbc673b9391 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -595,7 +595,7 @@ static void p_vert_load_pin_select_uvs(PHandle *handle, PVert *v) if (e->flag & PEDGE_SELECT) v->flag |= PVERT_SELECT; - if (e->flag & PEDGE_PIN) { + if (e->flag & PEDGE_PIN) { pinuv[0] += e->orig_uv[0]*handle->aspx; pinuv[1] += e->orig_uv[1]*handle->aspy; npins++; @@ -1144,7 +1144,7 @@ static void p_chart_boundaries(PChart *chart, int *nboundaries, PEdge **outer) (*nboundaries)++; len = 0.0f; - + be = e; do { be->flag |= PEDGE_DONE; diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 3ff12d71583..e6672339cdc 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -188,8 +188,15 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em, float *uv[4]; int lsel; - if((BM_TestHFlag(efa, BM_HIDDEN)) || (sel && BM_TestHFlag(efa, BM_SELECT)==0)) - continue; + if(scene->toolsettings->uv_flag & UV_SYNC_SELECTION) { + if(BM_TestHFlag(efa, BM_HIDDEN)) { + continue; + } + } + else { + if((BM_TestHFlag(efa, BM_HIDDEN)) || (sel && BM_TestHFlag(efa, BM_SELECT)==0)) + continue; + } tf= (MTexPoly *)CustomData_em_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); lsel = 0; @@ -679,7 +686,7 @@ static void uv_map_rotation_matrix(float result[][4], RegionView3D *rv3d, Object rotside[1][0]= (float)sin(sideangle); rotside[1][1]= (float)cos(sideangle); rotside[2][2]= 1.0f; - + upangle= (float)M_PI*upangledeg/180.0f; rotup[1][1]= (float)cos(upangle)/radius; rotup[1][2]= -(float)sin(upangle)/radius; |