Blender  V2.59
uvedit_buttons.c
Go to the documentation of this file.
00001 /*
00002  * $Id: uvedit_buttons.c 36434 2011-05-02 11:11:57Z blendix $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
00021  * All rights reserved.
00022  *
00023  * Contributor(s): Blender Foundation, 2002-2009
00024  *
00025  * ***** END GPL LICENSE BLOCK *****
00026  */
00027 
00032 #include <string.h>
00033 #include <stdio.h>
00034 
00035 #include "MEM_guardedalloc.h"
00036 
00037 #include "DNA_meshdata_types.h"
00038 #include "DNA_object_types.h"
00039 #include "DNA_scene_types.h"
00040 #include "DNA_screen_types.h"
00041 #include "DNA_space_types.h"
00042 
00043 #include "BLI_blenlib.h"
00044 #include "BLI_math.h"
00045 #include "BLI_editVert.h"
00046 #include "BLI_utildefines.h"
00047 
00048 #include "BKE_context.h"
00049 #include "BKE_customdata.h"
00050 #include "BKE_mesh.h"
00051 #include "BKE_screen.h"
00052 
00053 #include "ED_image.h"
00054 #include "ED_uvedit.h"
00055 
00056 #include "UI_interface.h"
00057 #include "UI_resources.h"
00058 
00059 #include "WM_api.h"
00060 #include "WM_types.h"
00061 
00062 #define B_UVEDIT_VERTEX         3
00063 
00064 /* UV Utilities */
00065 
00066 static int uvedit_center(Scene *scene, EditMesh *em, Image *ima, float center[2])
00067 {
00068         EditFace *efa;
00069         MTFace *tf;
00070         int tot= 0;
00071 
00072         zero_v2(center);
00073 
00074         for(efa= em->faces.first; efa; efa= efa->next) {
00075                 tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
00076 
00077                 if(uvedit_face_visible(scene, ima, efa, tf)) {
00078                         if(uvedit_uv_selected(scene, efa, tf, 0)) {
00079                                 add_v2_v2(center, tf->uv[0]);
00080                                 tot++;
00081                         }
00082                         if(uvedit_uv_selected(scene, efa, tf, 1)) {
00083                                 add_v2_v2(center, tf->uv[1]);
00084                                 tot++;
00085                         }
00086                         if(uvedit_uv_selected(scene, efa, tf, 2)) {
00087                                 add_v2_v2(center, tf->uv[2]);
00088                                 tot++;
00089                         }
00090                         if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
00091                                 add_v2_v2(center, tf->uv[3]);
00092                                 tot++;
00093                         }
00094                 }
00095         }
00096 
00097         if(tot > 0) {
00098                 center[0] /= tot;
00099                 center[1] /= tot;
00100         }
00101 
00102         return tot;
00103 }
00104 
00105 static void uvedit_translate(Scene *scene, EditMesh *em, Image *ima, float delta[2])
00106 {
00107         EditFace *efa;
00108         MTFace *tf;
00109 
00110         for(efa= em->faces.first; efa; efa= efa->next) {
00111                 tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
00112 
00113                 if(uvedit_face_visible(scene, ima, efa, tf)) {
00114                         if(uvedit_uv_selected(scene, efa, tf, 0))
00115                                 add_v2_v2(tf->uv[0], delta);
00116                         if(uvedit_uv_selected(scene, efa, tf, 1))
00117                                 add_v2_v2(tf->uv[1], delta);
00118                         if(uvedit_uv_selected(scene, efa, tf, 2))
00119                                 add_v2_v2(tf->uv[2], delta);
00120                         if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3))
00121                                 add_v2_v2(tf->uv[3], delta);
00122                 }
00123         }
00124 }
00125 
00126 /* Button Functions, using an evil static variable */
00127 
00128 static float uvedit_old_center[2];
00129 
00130 static void uvedit_vertex_buttons(const bContext *C, uiBlock *block)
00131 {
00132         SpaceImage *sima= CTX_wm_space_image(C);
00133         Scene *scene= CTX_data_scene(C);
00134         Object *obedit= CTX_data_edit_object(C);
00135         Image *ima= sima->image;
00136         float center[2];
00137         int imx, imy, step, digits;
00138         EditMesh *em;
00139 
00140         ED_space_image_size(sima, &imx, &imy);
00141         
00142         em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
00143 
00144         if(uvedit_center(scene, em, ima, center)) {
00145                 copy_v2_v2(uvedit_old_center, center);
00146 
00147                 if(!(sima->flag & SI_COORDFLOATS)) {
00148                         uvedit_old_center[0] *= imx;
00149                         uvedit_old_center[1] *= imy;
00150                 }
00151 
00152                 if(sima->flag & SI_COORDFLOATS) {
00153                         step= 1;
00154                         digits= 3;
00155                 }
00156                 else {
00157                         step= 100;
00158                         digits= 2;
00159                 }
00160                 
00161                 uiBlockBeginAlign(block);
00162                 uiDefButF(block, NUM, B_UVEDIT_VERTEX, "X:",    10, 10, 145, 19, &uvedit_old_center[0], -10*imx, 10.0*imx, step, digits, "");
00163                 uiDefButF(block, NUM, B_UVEDIT_VERTEX, "Y:",    165, 10, 145, 19, &uvedit_old_center[1], -10*imy, 10.0*imy, step, digits, "");
00164                 uiBlockEndAlign(block);
00165         }
00166 
00167         BKE_mesh_end_editmesh(obedit->data, em);
00168 }
00169 
00170 static void do_uvedit_vertex(bContext *C, void *UNUSED(arg), int event)
00171 {
00172         SpaceImage *sima= CTX_wm_space_image(C);
00173         Scene *scene= CTX_data_scene(C);
00174         Object *obedit= CTX_data_edit_object(C);
00175         Image *ima= sima->image;
00176         EditMesh *em;
00177         float center[2], delta[2];
00178         int imx, imy;
00179 
00180         if(event != B_UVEDIT_VERTEX)
00181                 return;
00182 
00183         em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
00184 
00185         ED_space_image_size(sima, &imx, &imy);
00186         uvedit_center(scene, em, ima, center);
00187 
00188         if(sima->flag & SI_COORDFLOATS) {
00189                 delta[0]= uvedit_old_center[0] - center[0];
00190                 delta[1]= uvedit_old_center[1] - center[1];
00191         }
00192         else {
00193                 delta[0]= uvedit_old_center[0]/imx - center[0];
00194                 delta[1]= uvedit_old_center[1]/imy - center[1];
00195         }
00196 
00197         uvedit_translate(scene, em, ima, delta);
00198 
00199         BKE_mesh_end_editmesh(obedit->data, em);
00200 
00201         WM_event_add_notifier(C, NC_IMAGE, sima->image);
00202 }
00203 
00204 /* Panels */
00205 
00206 static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
00207 {
00208         Object *obedit= CTX_data_edit_object(C);
00209         return ED_uvedit_test(obedit);
00210 }
00211 
00212 static void image_panel_uv(const bContext *C, Panel *pa)
00213 {
00214         uiBlock *block;
00215         
00216         block= uiLayoutAbsoluteBlock(pa->layout);
00217         uiBlockSetHandleFunc(block, do_uvedit_vertex, NULL);
00218 
00219         uvedit_vertex_buttons(C, block);
00220 }       
00221 
00222 void ED_uvedit_buttons_register(ARegionType *art)
00223 {
00224         PanelType *pt;
00225 
00226         pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
00227         strcpy(pt->idname, "IMAGE_PT_uv");
00228         strcpy(pt->label, "UV Vertex");
00229         pt->draw= image_panel_uv;
00230         pt->poll= image_panel_uv_poll;
00231         BLI_addtail(&art->paneltypes, pt);
00232 }
00233