Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2011-05-09 03:43:18 +0400
committerJoseph Eagar <joeedh@gmail.com>2011-05-09 03:43:18 +0400
commit6ef77cf95accc3cb914e7efd964118ce6e9521cf (patch)
tree1d8dbf95355038c93f79f9053a0bf1d55b561ec3 /source/blender/editors/uvedit
parent3462ddf17f38eb61fc3bb2751d55de15a47455c3 (diff)
parent770119d16f7dbee99a60d19540818892c970c4e2 (diff)
=bmesh= merge from trunk at r36529
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt1
-rw-r--r--source/blender/editors/uvedit/uvedit_buttons.c214
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c2
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c63
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c4
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c13
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;