86f84c1e0284bdd4a01e39b1a4dca0368f381c4b
[blender.git] / source / blender / include / BIF_editmesh.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /* External for editmesh_xxxx.c functions */
31
32 #ifndef BIF_EDITMESH_H
33 #define BIF_EDITMESH_H
34
35 #include "BKE_mesh.h"
36
37 struct EditMesh;
38 struct EditFace;
39 struct EditEdge;
40 struct EditVert;
41 struct Mesh;
42 struct bDeformGroup;
43 struct View3D;
44 struct EditSelection;
45 struct CustomData;
46
47 // edge and face flag both
48 #define EM_FGON         2
49 // face flag
50 #define EM_FGON_DRAW    1
51
52 extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
53
54 /* ******************* editmesh.c */
55 extern void make_editMesh(void);
56 extern void load_editMesh(void);
57 extern void free_editMesh(struct EditMesh *);
58 extern void remake_editMesh(void);
59
60         /* Editmesh Undo code */
61 extern void undo_push_mesh(char *name);
62
63 extern void separatemenu(void);
64 extern void separate_mesh(void);
65 extern void separate_mesh_loose(void);
66 extern void separate_material(void);
67
68 /* ******************* editmesh_add.c */
69 extern void make_prim(int type, float imat[3][3], int tot, int seg,
70                 int subdiv, float dia, float d, int ext, int fill,
71         float cent[3] );
72 extern void add_primitiveMesh(int type);
73 extern void adduplicate_mesh(void);
74 extern void add_click_mesh(void);
75 extern void addedgeface_mesh(void);
76 void addfaces_from_edgenet();
77
78 /* ******************* editmesh_lib.c */
79
80 extern void EM_set_flag_all(int flag);
81 extern void EM_clear_flag_all(int flag);
82
83 extern void EM_select_face(struct EditFace *efa, int sel);
84 extern void EM_select_edge(struct EditEdge *eed, int sel);
85 extern float EM_face_area(struct EditFace *efa);
86 extern float EM_face_perimeter(struct EditFace *efa);
87 extern void EM_editselection_center(float *center, struct EditSelection *ese);
88 extern void EM_editselection_normal(float *normal, struct EditSelection *ese);
89 extern void EM_editselection_plane(float *plane, struct EditSelection *ese);
90
91 extern void EM_deselect_flush(void);    // vertices to edges/faces (exception!)
92 extern void EM_select_flush(void);      // vertices to edges/faces (exception!)
93 extern void EM_selectmode_set(void); // when mode changes
94 extern void EM_selectmode_flush(void); // when selection changes
95 extern void EM_convertsel(short oldmode, short selectmode);
96 extern void EM_remove_selection(void *data, int type);
97 extern void EM_store_selection(void *data, int type);
98 extern void EM_validate_selections(void);
99
100 extern int EM_nfaces_selected(void);
101 extern int EM_nvertices_selected(void);
102
103 extern int faceselectedAND(struct EditFace *efa, int flag);
104 extern void recalc_editnormals(void);
105 extern void flip_editnormals(void);
106
107 extern void EM_data_interp_from_verts(struct EditVert *v1,
108         struct EditVert *v2, struct EditVert *eve, float fac);
109 extern struct EditFace *EM_face_from_faces(struct EditFace *efa1,
110         struct EditFace *efa2, int i1, int i2, int i3, int i4);
111 extern void EM_data_interp_from_faces(struct EditFace *efa1,
112         struct EditFace *efa2, struct EditFace *efan, int i1, int i2, int i3, int i4);
113
114 void EM_add_data_layer(struct CustomData *data, int type);
115 void EM_free_data_layer(struct CustomData *data, int type);
116
117 /* ******************* editmesh_mods.c */
118
119 extern void EM_init_index_arrays(int forVert, int forEdge, int forFace);
120 extern void EM_free_index_arrays(void);
121
122 extern struct EditVert *EM_get_vert_for_index(int index);
123 extern struct EditEdge *EM_get_edge_for_index(int index);
124 extern struct EditFace *EM_get_face_for_index(int index);
125
126 extern void EM_select_face_fgon(struct EditFace *efa, int sel);
127
128 extern int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax);
129 extern int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
130 extern int EM_init_backbuf_circle(short xs, short ys, short rads);
131 extern int EM_check_backbuf(unsigned int index);
132 extern void EM_free_backbuf(void);
133
134 extern void EM_selectmode_menu(void);
135
136
137 extern void vertexnoise(void);
138 extern void vertexsmooth(void);
139 extern void righthandfaces(int select);
140 extern void mouse_mesh(void);
141
142 extern void deselectall_mesh(void);
143 extern void selectconnected_mesh_all(void);
144 extern void selectconnected_mesh(void);
145 extern void selectconnected_delimit_mesh(void);
146 extern void selectconnected_delimit_mesh_all(void);
147 extern void selectswap_mesh(void);
148
149 extern void hide_mesh(int swap);
150 extern void reveal_mesh(void);
151
152 extern void vertices_to_sphere(void);
153
154         /** Aligns the selected MTFace's of @a me to the @a v3d,
155          * using the given axis (0-2). Can give a user error.
156          */
157 extern void faceselect_align_view_to_selected(struct View3D *v3d, struct Mesh *me, int axis);
158         /** Aligns the selected faces or vertices of @a me to the @a v3d,
159          * using the given axis (0-2). Can give a user error.
160          */
161 extern void editmesh_align_view_to_selected(struct View3D *v3d, int axis);
162
163         /* Selection */
164 extern void select_non_manifold(void);
165 extern void select_sharp_edges(void);
166 extern void select_linked_flat_faces(void);
167 extern void select_faces_by_numverts(int numverts);
168 extern void select_more(void);
169 extern void select_less(void);
170 extern void selectrandom_mesh(void);
171 extern void editmesh_select_by_material(int index);
172 extern void editmesh_deselect_by_material(int index);
173
174 extern void Vertex_Menu(void);
175 extern void Edge_Menu(void);
176 extern void Face_Menu(void);
177 extern void select_mesh_group_menu(void);
178 extern void editmesh_mark_seam(int clear);
179 extern void loop_multiselect(int looptype);
180
181 extern void EM_select_more(void);
182 extern void EM_select_less(void);
183
184 /* ******************* editmesh_loop.c */
185
186 #define KNIFE_PROMPT 0
187 #define KNIFE_EXACT 1
188 #define KNIFE_MIDPOINT 2
189 #define KNIFE_MULTICUT 3
190
191 extern void CutEdgeloop(int numcuts);
192 extern void KnifeSubdivide(char mode);
193 extern void LoopMenu(void);
194
195 #define LOOP_SELECT     1
196 #define LOOP_CUT        2
197
198 extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2);
199
200 /* ******************* editmesh_tools.c */
201
202 #define SUBDIV_SELECT_ORIG      0
203 #define SUBDIV_SELECT_INNER     1
204 #define SUBDIV_SELECT_INNER_SEL 2
205 #define SUBDIV_SELECT_LOOPCUT 3
206
207 extern void convert_to_triface(int direction);
208 extern int removedoublesflag(short flag, short automerge, float limit);
209 extern void xsortvert_flag(int flag);
210 extern void hashvert_flag(int flag);
211
212 extern void esubdivideflag(int flag, float rad, int beauty, int numcuts, int selecttype);
213
214 extern void extrude_mesh(void);
215 extern void split_mesh(void);
216 extern void extrude_repeat_mesh(int steps, float offs);
217 extern void spin_mesh(int steps,float degr,float *dvec, int mode);
218 extern void screw_mesh(int steps,int turns);
219 extern void delete_mesh(void);
220 extern void beauty_fill(void);
221 extern void join_triangles(void);
222 extern void edge_flip(void);
223 extern void fill_mesh(void);
224 extern void bevel_menu();
225 void mesh_set_face_flags(short mode);
226 extern void mesh_set_smooth_faces(short event);
227 extern void mesh_rotate_uvs(void);
228 extern void mesh_mirror_uvs(void);
229 extern void mesh_rotate_colors(void);
230 extern void mesh_mirror_colors(void);
231 void mesh_copy_menu(void);
232 void edge_rotate_selected(int dir);
233 int EdgeSlide(short immediate, float imperc);
234 int EdgeLoopDelete(void);
235 void mesh_rip(void);
236  
237 struct EditVert *editedge_getOtherVert(struct EditEdge *eed, struct EditVert *ev);
238 struct EditVert *editedge_getSharedVert(struct EditEdge *eed, struct EditEdge *eed2);
239 int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
240 int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
241 int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
242
243 void shape_copy_select_from(void);
244 void shape_propagate(void);
245
246 int collapseEdges(void);
247 int merge_firstlast(int first, int uvmerge);
248 int merge_target( int target, int uvmerge);
249
250 void pathselect(void);
251 void loop_to_region(void);
252 void region_to_loop(void);
253
254 UvVertMap *make_uv_vert_map_EM(int selected, int do_face_idx_array, float *limit);
255 UvMapVert *get_uv_map_vert_EM(UvVertMap *vmap, unsigned int v);
256 void free_uv_vert_map_EM(UvVertMap *vmap);
257
258 int EM_texFaceCheck(void); /* can we edit UV's for this mesh?*/
259 int EM_vertColorCheck(void); /* can we edit colors for this mesh?*/
260
261 void EM_set_actFace(struct EditFace *efa);
262 struct EditFace * EM_get_actFace(int sloppy);
263
264 #endif