|
Blender
V2.59
|
00001 /* 00002 * $Id: mesh_ops.c 36491 2011-05-04 20:42:34Z campbellbarton $ 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) 2009 Blender Foundation. 00021 * All rights reserved. 00022 * 00023 * 00024 * Contributor(s): Blender Foundation 00025 * 00026 * ***** END GPL LICENSE BLOCK ***** 00027 */ 00028 00034 #include <stdlib.h> 00035 #include <math.h> 00036 00037 00038 #include "DNA_object_types.h" 00039 #include "DNA_scene_types.h" 00040 00041 #include "BLI_math.h" 00042 #include "BLI_blenlib.h" 00043 #include "BLI_editVert.h" 00044 00045 #include "BKE_context.h" 00046 00047 #include "RNA_access.h" 00048 00049 #include "WM_api.h" 00050 #include "WM_types.h" 00051 00052 #include "ED_object.h" 00053 #include "ED_mesh.h" 00054 #include "ED_screen.h" 00055 #include "ED_view3d.h" 00056 00057 00058 #include "mesh_intern.h" 00059 00060 /**************************** registration **********************************/ 00061 00062 void ED_operatortypes_mesh(void) 00063 { 00064 WM_operatortype_append(MESH_OT_select_all); 00065 WM_operatortype_append(MESH_OT_select_more); 00066 WM_operatortype_append(MESH_OT_select_less); 00067 WM_operatortype_append(MESH_OT_select_inverse); 00068 WM_operatortype_append(MESH_OT_select_non_manifold); 00069 WM_operatortype_append(MESH_OT_select_linked); 00070 WM_operatortype_append(MESH_OT_select_linked_pick); 00071 WM_operatortype_append(MESH_OT_select_random); 00072 WM_operatortype_append(MESH_OT_hide); 00073 WM_operatortype_append(MESH_OT_reveal); 00074 WM_operatortype_append(MESH_OT_select_by_number_vertices); 00075 WM_operatortype_append(MESH_OT_select_mirror); 00076 WM_operatortype_append(MESH_OT_normals_make_consistent); 00077 WM_operatortype_append(MESH_OT_merge); 00078 WM_operatortype_append(MESH_OT_subdivide); 00079 WM_operatortype_append(MESH_OT_faces_select_linked_flat); 00080 WM_operatortype_append(MESH_OT_edges_select_sharp); 00081 WM_operatortype_append(MESH_OT_primitive_plane_add); 00082 WM_operatortype_append(MESH_OT_primitive_cube_add); 00083 WM_operatortype_append(MESH_OT_primitive_circle_add); 00084 WM_operatortype_append(MESH_OT_primitive_cylinder_add); 00085 WM_operatortype_append(MESH_OT_primitive_cone_add); 00086 WM_operatortype_append(MESH_OT_primitive_grid_add); 00087 WM_operatortype_append(MESH_OT_primitive_monkey_add); 00088 WM_operatortype_append(MESH_OT_primitive_uv_sphere_add); 00089 WM_operatortype_append(MESH_OT_primitive_ico_sphere_add); 00090 WM_operatortype_append(MESH_OT_fgon_clear); 00091 WM_operatortype_append(MESH_OT_fgon_make); 00092 WM_operatortype_append(MESH_OT_duplicate); 00093 WM_operatortype_append(MESH_OT_remove_doubles); 00094 WM_operatortype_append(MESH_OT_vertices_sort); 00095 WM_operatortype_append(MESH_OT_vertices_randomize); 00096 WM_operatortype_append(MESH_OT_extrude); 00097 WM_operatortype_append(MESH_OT_spin); 00098 WM_operatortype_append(MESH_OT_screw); 00099 00100 WM_operatortype_append(MESH_OT_split); 00101 WM_operatortype_append(MESH_OT_extrude_repeat); 00102 WM_operatortype_append(MESH_OT_edge_rotate); 00103 WM_operatortype_append(MESH_OT_select_vertex_path); 00104 WM_operatortype_append(MESH_OT_loop_to_region); 00105 WM_operatortype_append(MESH_OT_region_to_loop); 00106 WM_operatortype_append(MESH_OT_select_axis); 00107 00108 WM_operatortype_append(MESH_OT_uvs_rotate); 00109 WM_operatortype_append(MESH_OT_uvs_mirror); 00110 WM_operatortype_append(MESH_OT_colors_rotate); 00111 WM_operatortype_append(MESH_OT_colors_mirror); 00112 00113 WM_operatortype_append(MESH_OT_fill); 00114 WM_operatortype_append(MESH_OT_beautify_fill); 00115 WM_operatortype_append(MESH_OT_quads_convert_to_tris); 00116 WM_operatortype_append(MESH_OT_tris_convert_to_quads); 00117 WM_operatortype_append(MESH_OT_edge_flip); 00118 WM_operatortype_append(MESH_OT_faces_shade_smooth); 00119 WM_operatortype_append(MESH_OT_faces_shade_flat); 00120 WM_operatortype_append(MESH_OT_sort_faces); 00121 00122 WM_operatortype_append(MESH_OT_delete); 00123 00124 WM_operatortype_append(MESH_OT_separate); 00125 WM_operatortype_append(MESH_OT_dupli_extrude_cursor); 00126 WM_operatortype_append(MESH_OT_loop_select); 00127 WM_operatortype_append(MESH_OT_edge_face_add); 00128 WM_operatortype_append(MESH_OT_select_shortest_path); 00129 WM_operatortype_append(MESH_OT_select_similar); 00130 WM_operatortype_append(MESH_OT_loop_multi_select); 00131 WM_operatortype_append(MESH_OT_mark_seam); 00132 WM_operatortype_append(MESH_OT_mark_sharp); 00133 WM_operatortype_append(MESH_OT_vertices_smooth); 00134 WM_operatortype_append(MESH_OT_noise); 00135 WM_operatortype_append(MESH_OT_flip_normals); 00136 WM_operatortype_append(MESH_OT_knife_cut); 00137 WM_operatortype_append(MESH_OT_rip); 00138 WM_operatortype_append(MESH_OT_blend_from_shape); 00139 WM_operatortype_append(MESH_OT_shape_propagate_to_all); 00140 00141 WM_operatortype_append(MESH_OT_uv_texture_add); 00142 WM_operatortype_append(MESH_OT_uv_texture_remove); 00143 WM_operatortype_append(MESH_OT_vertex_color_add); 00144 WM_operatortype_append(MESH_OT_vertex_color_remove); 00145 WM_operatortype_append(MESH_OT_sticky_add); 00146 WM_operatortype_append(MESH_OT_sticky_remove); 00147 WM_operatortype_append(MESH_OT_drop_named_image); 00148 00149 WM_operatortype_append(MESH_OT_edgering_select); 00150 WM_operatortype_append(MESH_OT_loopcut); 00151 00152 WM_operatortype_append(MESH_OT_solidify); 00153 WM_operatortype_append(MESH_OT_select_nth); 00154 } 00155 00156 #if 0 /* UNUSED, remove? */ 00157 static int ED_operator_editmesh_face_select(bContext *C) 00158 { 00159 Object *obedit= CTX_data_edit_object(C); 00160 if(obedit && obedit->type==OB_MESH) { 00161 EditMesh *em = ((Mesh *)obedit->data)->edit_mesh; 00162 if (em && em->selectmode & SCE_SELECT_FACE) { 00163 return 1; 00164 } 00165 } 00166 return 0; 00167 } 00168 #endif 00169 00170 void ED_operatormacros_mesh(void) 00171 { 00172 wmOperatorType *ot; 00173 wmOperatorTypeMacro *otmacro; 00174 00175 ot= WM_operatortype_append_macro("MESH_OT_loopcut_slide", "Loop Cut and Slide", OPTYPE_UNDO|OPTYPE_REGISTER); 00176 ot->description = "Cut mesh loop and slide it"; 00177 WM_operatortype_macro_define(ot, "MESH_OT_loopcut"); 00178 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_edge_slide"); 00179 RNA_struct_idprops_unset(otmacro->ptr, "release_confirm"); 00180 00181 ot= WM_operatortype_append_macro("MESH_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); 00182 ot->description = "Duplicate mesh and move"; 00183 WM_operatortype_macro_define(ot, "MESH_OT_duplicate"); 00184 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); 00185 RNA_enum_set(otmacro->ptr, "proportional", 0); 00186 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00187 00188 ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER); 00189 ot->description = "Rip polygons and move the result"; 00190 WM_operatortype_macro_define(ot, "MESH_OT_rip"); 00191 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); 00192 RNA_enum_set(otmacro->ptr, "proportional", 0); 00193 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00194 00195 ot= WM_operatortype_append_macro("MESH_OT_extrude_region_move", "Extrude Region and Move", OPTYPE_UNDO|OPTYPE_REGISTER); 00196 ot->description = "Extrude region and move result"; 00197 otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude"); 00198 RNA_enum_set(otmacro->ptr, "type", 1); 00199 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); 00200 RNA_enum_set(otmacro->ptr, "proportional", 0); 00201 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00202 00203 ot= WM_operatortype_append_macro("MESH_OT_extrude_faces_move", "Extrude Individual Faces and Move", OPTYPE_UNDO|OPTYPE_REGISTER); 00204 ot->description = "Extrude faces and move result"; 00205 otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude"); 00206 RNA_enum_set(otmacro->ptr, "type", 2); 00207 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_shrink_fatten"); 00208 RNA_enum_set(otmacro->ptr, "proportional", 0); 00209 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00210 00211 ot= WM_operatortype_append_macro("MESH_OT_extrude_edges_move", "Extrude Only Edges and Move", OPTYPE_UNDO|OPTYPE_REGISTER); 00212 ot->description = "Extrude edges and move result"; 00213 otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude"); 00214 RNA_enum_set(otmacro->ptr, "type", 3); 00215 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); 00216 RNA_enum_set(otmacro->ptr, "proportional", 0); 00217 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00218 00219 ot= WM_operatortype_append_macro("MESH_OT_extrude_vertices_move", "Extrude Only Vertices and Move", OPTYPE_UNDO|OPTYPE_REGISTER); 00220 ot->description = "Extrude vertices and move result"; 00221 otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude"); 00222 RNA_enum_set(otmacro->ptr, "type", 4); 00223 otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); 00224 RNA_enum_set(otmacro->ptr, "proportional", 0); 00225 RNA_boolean_set(otmacro->ptr, "mirror", 0); 00226 } 00227 00228 /* note mesh keymap also for other space? */ 00229 void ED_keymap_mesh(wmKeyConfig *keyconf) 00230 { 00231 wmKeyMap *keymap; 00232 wmKeyMapItem *kmi; 00233 int i; 00234 00235 keymap= WM_keymap_find(keyconf, "Mesh", 0, 0); 00236 keymap->poll= ED_operator_editmesh; 00237 00238 WM_keymap_add_item(keymap, "MESH_OT_loopcut_slide", RKEY, KM_PRESS, KM_CTRL, 0); 00239 00240 /* selecting */ 00241 /* standard mouse selection goes via space_view3d */ 00242 WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0); 00243 kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0); 00244 RNA_boolean_set(kmi->ptr, "extend", 1); 00245 00246 WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0); 00247 kmi= WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0); 00248 RNA_boolean_set(kmi->ptr, "extend", 1); 00249 00250 WM_keymap_add_item(keymap, "MESH_OT_select_shortest_path", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); 00251 00252 WM_keymap_add_item(keymap, "MESH_OT_select_all", AKEY, KM_PRESS, 0, 0); 00253 WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); 00254 WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); 00255 WM_keymap_add_item(keymap, "MESH_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); 00256 WM_keymap_add_item(keymap, "MESH_OT_select_non_manifold", MKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0); 00257 00258 WM_keymap_add_item(keymap, "MESH_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); 00259 WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); 00260 RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1); 00261 00262 WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0); 00263 00264 WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0); 00265 00266 /* selection mode */ 00267 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0); 00268 00269 /* hide */ 00270 WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, 0, 0); 00271 RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); 00272 WM_keymap_add_item(keymap, "MESH_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); 00273 00274 /* tools */ 00275 WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0); 00276 RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1); 00277 00278 WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0); /* python operator */ 00279 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, KM_ALT, 0); 00280 00281 WM_keymap_add_item(keymap, "TRANSFORM_OT_edge_crease", EKEY, KM_PRESS, KM_SHIFT, 0); 00282 00283 WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0); 00284 00285 WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0); 00286 WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); 00287 WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0); 00288 WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0); 00289 WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); 00290 00291 WM_keymap_add_item(keymap, "MESH_OT_rip_move",VKEY, KM_PRESS, 0, 0); 00292 WM_keymap_add_item(keymap, "MESH_OT_merge", MKEY, KM_PRESS, KM_ALT, 0); 00293 00294 WM_keymap_add_item(keymap, "TRANSFORM_OT_shrink_fatten", SKEY, KM_PRESS, KM_ALT, 0); 00295 00296 /* add/remove */ 00297 WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0); 00298 // WM_keymap_add_item(keymap, "MESH_OT_skin", FKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); /* python, removed */ 00299 WM_keymap_add_item(keymap, "MESH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); 00300 00301 WM_keymap_add_menu(keymap, "INFO_MT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0); 00302 00303 WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, 0, 0); 00304 WM_keymap_add_item(keymap, "MESH_OT_split", YKEY, KM_PRESS, 0, 0); 00305 00306 /* use KM_CLICK because same key is used for tweaks */ 00307 WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0); 00308 RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_SHIFT|KM_CTRL, 0)->ptr, "rotate_source", 0); 00309 00310 WM_keymap_add_item(keymap, "MESH_OT_delete", XKEY, KM_PRESS, 0, 0); 00311 WM_keymap_add_item(keymap, "MESH_OT_delete", DELKEY, KM_PRESS, 0, 0); 00312 00313 WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, 0, KKEY); 00314 RNA_enum_set(WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_SHIFT, KKEY)->ptr, "type", 2/*KNIFE_MIDPOINT*/); 00315 00316 WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); 00317 00318 /* menus */ 00319 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_specials", WKEY, KM_PRESS, 0, 0); 00320 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_faces", FKEY, KM_PRESS, KM_CTRL, 0); 00321 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_edges", EKEY, KM_PRESS, KM_CTRL, 0); 00322 WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_vertices", VKEY, KM_PRESS, KM_CTRL, 0); 00323 WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0); 00324 WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0); 00325 WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0); 00326 00327 /* useful stuff from object-mode */ 00328 for (i=0; i<=5; i++) { 00329 kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY+i, KM_PRESS, KM_CTRL, 0); 00330 RNA_int_set(kmi->ptr, "level", i); 00331 } 00332 00333 ED_object_generic_keymap(keyconf, keymap, 3); 00334 } 00335