UV Edit: move uv vertex buttons code to uvedit module.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 2 May 2011 11:11:57 +0000 (11:11 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 2 May 2011 11:11:57 +0000 (11:11 +0000)
source/blender/editors/include/ED_uvedit.h
source/blender/editors/space_image/image_buttons.c
source/blender/editors/space_image/space_image.c
source/blender/editors/uvedit/CMakeLists.txt
source/blender/editors/uvedit/uvedit_buttons.c [new file with mode: 0644]

index b975be54f5f1275d48293082af3c624d75b92224..f6106e62533da86601fb45eea3e21d200385a494 100644 (file)
 #ifndef ED_UVEDIT_H
 #define ED_UVEDIT_H
 
-struct bContext;
-struct Scene;
-struct Object;
-struct MTFace;
+struct ARegionType;
 struct EditFace;
 struct Image;
+struct MTFace;
+struct Object;
+struct Scene;
+struct bContext;
 struct wmKeyConfig;
 
 /* uvedit_ops.c */
@@ -77,5 +78,8 @@ void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel)
 /* uvedit_draw.c */
 void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
 
+/* uvedit_buttons.c */
+void ED_uvedit_buttons_register(struct ARegionType *art);
+
 #endif /* ED_UVEDIT_H */
 
index fc20e2a744e51c81fabab8c42ffd6e57e32598a4..0fd7ac3e7547adf57c3bbd7a4275bb3b42715c35 100644 (file)
@@ -63,8 +63,6 @@
 #include "ED_gpencil.h"
 #include "ED_image.h"
 #include "ED_screen.h"
-#include "ED_uvedit.h"
-
 
 #include "RNA_access.h"
 
@@ -78,7 +76,6 @@
 
 #define B_REDR                         1
 #define B_IMAGECHANGED         2
-#define B_TRANS_IMAGE          3
 #define B_NOP                          0
 #define B_TWINANIM                     5
 #define B_SIMAGETILE           6
 #define B_SIMACLONEDELETE      26
 
 /* proto */
-static void image_editvertex_buts(const bContext *C, uiBlock *block);
-
 
 static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
 {
@@ -110,9 +105,6 @@ static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
        switch(event) {
                case B_REDR:
                        break;
-               case B_TRANS_IMAGE:
-                       image_editvertex_buts(C, NULL);
-                       break;
        }
 
        /* all events now */
@@ -193,127 +185,6 @@ struct ImageUser *ntree_get_active_iuser(bNodeTree *ntree)
 
 /* ************ panel stuff ************* */
 
-/* this function gets the values for cursor and vertex number buttons */
-static void image_transform_but_attr(SpaceImage *sima, int *imx, int *imy, int *step, int *digits) /*, float *xcoord, float *ycoord)*/
-{
-       ED_space_image_size(sima, imx, imy);
-       
-       if (sima->flag & SI_COORDFLOATS) {
-               *step= 1;
-               *digits= 3;
-       }
-       else {
-               *step= 100;
-               *digits= 2;
-       }
-}
-
-
-/* is used for both read and write... */
-static void image_editvertex_buts(const bContext *C, uiBlock *block)
-{
-       Scene *scene= CTX_data_scene(C);
-       SpaceImage *sima= CTX_wm_space_image(C);
-       Image *ima= sima->image;
-       Object *obedit= CTX_data_edit_object(C);
-       static float ocent[2];
-       float cent[2]= {0.0, 0.0};
-       int imx= 256, imy= 256;
-       int nactive= 0, step, digits;
-       EditMesh *em;
-       EditFace *efa;
-       MTFace *tf;
-       
-       image_transform_but_attr(sima, &imx, &imy, &step, &digits);
-       
-       em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-               if (uvedit_face_visible(scene, ima, efa, tf)) {
-                       
-                       if (uvedit_uv_selected(scene, efa, tf, 0)) {
-                               cent[0]+= tf->uv[0][0];
-                               cent[1]+= tf->uv[0][1];
-                               nactive++;
-                       }
-                       if (uvedit_uv_selected(scene, efa, tf, 1)) {
-                               cent[0]+= tf->uv[1][0];
-                               cent[1]+= tf->uv[1][1];
-                               nactive++;
-                       }
-                       if (uvedit_uv_selected(scene, efa, tf, 2)) {
-                               cent[0]+= tf->uv[2][0];
-                               cent[1]+= tf->uv[2][1];
-                               nactive++;
-                       }
-                       if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
-                               cent[0]+= tf->uv[3][0];
-                               cent[1]+= tf->uv[3][1];
-                               nactive++;
-                       }
-               }
-       }
-               
-       if(block) {     // do the buttons
-               if (nactive) {
-                       ocent[0]= cent[0]/nactive;
-                       ocent[1]= cent[1]/nactive;
-                       if (sima->flag & SI_COORDFLOATS) {
-                       } else {
-                               ocent[0] *= imx;
-                               ocent[1] *= imy;
-                       }
-                       
-                       uiBlockBeginAlign(block);
-                       uiDefButF(block, NUM, B_TRANS_IMAGE, "X:",      10, 10, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
-                       uiDefButF(block, NUM, B_TRANS_IMAGE, "Y:",      165, 10, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
-                       uiBlockEndAlign(block);
-               }
-       }
-       else {  // apply event
-               float delta[2];
-               
-               cent[0]= cent[0]/nactive;
-               cent[1]= cent[1]/nactive;
-                       
-               if (sima->flag & SI_COORDFLOATS) {
-                       delta[0]= ocent[0]-cent[0];
-                       delta[1]= ocent[1]-cent[1];
-               }
-               else {
-                       delta[0]= ocent[0]/imx - cent[0];
-                       delta[1]= ocent[1]/imy - cent[1];
-               }
-
-               for (efa= em->faces.first; efa; efa= efa->next) {
-                       tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-                       if (uvedit_face_visible(scene, ima, efa, tf)) {
-                               if (uvedit_uv_selected(scene, efa, tf, 0)) {
-                                       tf->uv[0][0]+= delta[0];
-                                       tf->uv[0][1]+= delta[1];
-                               }
-                               if (uvedit_uv_selected(scene, efa, tf, 1)) {
-                                       tf->uv[1][0]+= delta[0];
-                                       tf->uv[1][1]+= delta[1];
-                               }
-                               if (uvedit_uv_selected(scene, efa, tf, 2)) {
-                                       tf->uv[2][0]+= delta[0];
-                                       tf->uv[2][1]+= delta[1];
-                               }
-                               if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
-                                       tf->uv[3][0]+= delta[0];
-                                       tf->uv[3][1]+= delta[1];
-                               }
-                       }
-               }
-               
-               WM_event_add_notifier(C, NC_IMAGE, sima->image);
-       }
-
-       BKE_mesh_end_editmesh(obedit->data, em);
-}
-
-
 /* is used for both read and write... */
 
 static int image_panel_poll(const bContext *C, PanelType *UNUSED(pt))
@@ -976,22 +847,6 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
        }
 }
 
-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_image_panel_events, NULL);
-
-       image_editvertex_buts(C, block);
-}      
-
 void image_buttons_register(ARegionType *art)
 {
        PanelType *pt;
@@ -1009,13 +864,6 @@ void image_buttons_register(ARegionType *art)
        strcpy(pt->label, "Grease Pencil");
        pt->draw= gpencil_panel_standard;
        BLI_addtail(&art->paneltypes, 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);
 }
 
 static int image_properties(bContext *C, wmOperator *UNUSED(op))
index 451e0e6e89baba2620e5fc6df4f4e94b0f1d75e4..e923ec5344f927a2b46f2194d2c188195788a1de 100644 (file)
@@ -989,6 +989,7 @@ void ED_spacetype_image(void)
        BLI_addhead(&st->regiontypes, art);
 
        image_buttons_register(art);
+       ED_uvedit_buttons_register(art);
        
        /* regions: statistics/scope buttons */
        art= MEM_callocN(sizeof(ARegionType), "spacetype image region");
index 16e3536b6461fa9549e0371632be59280dd01940..60d730e8c52fe52d7486aeda2828484a47c97d1e 100644 (file)
@@ -33,6 +33,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 (file)
index 0000000..5380f51
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * $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 "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, EditMesh *em, Image *ima, float center[2])
+{
+       EditFace *efa;
+       MTFace *tf;
+       int tot= 0;
+
+       zero_v2(center);
+
+       for(efa= em->faces.first; efa; efa= efa->next) {
+               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
+               if(uvedit_face_visible(scene, ima, efa, tf)) {
+                       if(uvedit_uv_selected(scene, efa, tf, 0)) {
+                               add_v2_v2(center, tf->uv[0]);
+                               tot++;
+                       }
+                       if(uvedit_uv_selected(scene, efa, tf, 1)) {
+                               add_v2_v2(center, tf->uv[1]);
+                               tot++;
+                       }
+                       if(uvedit_uv_selected(scene, efa, tf, 2)) {
+                               add_v2_v2(center, tf->uv[2]);
+                               tot++;
+                       }
+                       if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
+                               add_v2_v2(center, tf->uv[3]);
+                               tot++;
+                       }
+               }
+       }
+
+       if(tot > 0) {
+               center[0] /= tot;
+               center[1] /= tot;
+       }
+
+       return tot;
+}
+
+static void uvedit_translate(Scene *scene, EditMesh *em, Image *ima, float delta[2])
+{
+       EditFace *efa;
+       MTFace *tf;
+
+       for(efa= em->faces.first; efa; efa= efa->next) {
+               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
+               if(uvedit_face_visible(scene, ima, efa, tf)) {
+                       if(uvedit_uv_selected(scene, efa, tf, 0))
+                               add_v2_v2(tf->uv[0], delta);
+                       if(uvedit_uv_selected(scene, efa, tf, 1))
+                               add_v2_v2(tf->uv[1], delta);
+                       if(uvedit_uv_selected(scene, efa, tf, 2))
+                               add_v2_v2(tf->uv[2], delta);
+                       if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3))
+                               add_v2_v2(tf->uv[3], 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;
+       float center[2];
+       int imx, imy, step, digits;
+       EditMesh *em;
+
+       ED_space_image_size(sima, &imx, &imy);
+       
+       em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+       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);
+       }
+
+       BKE_mesh_end_editmesh(obedit->data, em);
+}
+
+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;
+       EditMesh *em;
+       float center[2], delta[2];
+       int imx, imy;
+
+       if(event != B_UVEDIT_VERTEX)
+               return;
+
+       em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+       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);
+
+       BKE_mesh_end_editmesh(obedit->data, em);
+
+       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);
+}
+