|
Blender
V2.59
|
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