svn merge ^/trunk/blender -r43887:43918
[blender.git] / source / blender / blenkernel / BKE_mesh.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): (mar-2001 nzc)
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 #ifndef BKE_MESH_H
28 #define BKE_MESH_H
29
30 /** \file BKE_mesh.h
31  *  \ingroup bke
32  */
33
34 /***/
35
36 struct BoundBox;
37 struct DispList;
38 struct ListBase;
39 struct BMEditMesh;
40 struct BMesh;
41 struct Mesh;
42 struct MPoly;
43 struct MLoop;
44 struct MFace;
45 struct MEdge;
46 struct MVert;
47 struct MDeformVert;
48 struct MCol;
49 struct Object;
50 struct MTFace;
51 struct VecNor;
52 struct CustomData;
53 struct DerivedMesh;
54 struct Scene;
55 struct MLoopUV;
56 struct UvVertMap;
57 struct UvMapVert;
58 struct UvElementMap;
59 struct UvElement;
60 #ifdef __cplusplus
61 extern "C" {
62 #endif
63
64 struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob);
65
66 /*
67  * this function recreates a tesselation.
68  * returns number of tesselation faces.
69  *
70  * use_poly_origindex sets whether or not the tesselation faces' origindex
71  * layer should point to original poly indices or real poly indices.
72  *
73  * use_face_origindex sets the tesselation faces' origindex layer
74  * to point to the tesselation faces themselves, not the polys.
75  *
76  * if both of the above are 0, it'll use the indices of the mpolys of the MPoly
77  * data in pdata, and ignore the origindex layer altogether.
78  */
79 int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata,
80                            struct MVert *mvert,
81                            int totface, int totloop, int totpoly,
82                            const int do_face_normals);
83
84 /* for forwards compat only quad->tri polys to mface, skip ngons.
85  */
86 int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
87         struct CustomData *pdata, int totface, int totloop, int totpoly);
88
89 /*calculates a face normal.*/
90 void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, 
91                            struct MVert *mvarray, float no[3]);
92
93 void mesh_calc_poly_normal_coords(struct MPoly *mpoly, struct MLoop *loopstart,
94                                   const float (*vertex_coords)[3], float no[3]);
95
96 void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
97                            struct MVert *mvarray, float cent[3]);
98
99 float mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
100                           struct MVert *mvarray, float polynormal[3]);
101
102 void unlink_mesh(struct Mesh *me);
103 void free_mesh(struct Mesh *me, int unlink);
104 struct Mesh *add_mesh(const char *name);
105 struct Mesh *copy_mesh(struct Mesh *me);
106 void mesh_update_customdata_pointers(struct Mesh *me, const short do_ensure_tess_cd);
107
108 void make_local_mesh(struct Mesh *me);
109 void boundbox_mesh(struct Mesh *me, float *loc, float *size);
110 void tex_space_mesh(struct Mesh *me);
111 float *get_mesh_orco_verts(struct Object *ob);
112 void transform_mesh_orco_verts(struct Mesh *me, float (*orco)[3], int totvert, int invert);
113 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
114 struct Mesh *get_mesh(struct Object *ob);
115 void set_mesh(struct Object *ob, struct Mesh *me);
116 void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
117 int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *totvert,
118         struct MEdge **alledge, int *totedge, struct MLoop **allloop, struct MPoly **allpoly,
119         int *totloop, int *totpoly);
120 int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert,
121         struct MEdge **alledge, int *_totedge, struct MLoop **allloop, struct MPoly **allpoly,
122         int *_totloop, int *_totpoly);
123 void nurbs_to_mesh(struct Object *ob);
124 void mesh_to_curve(struct Scene *scene, struct Object *ob);
125 void free_dverts(struct MDeformVert *dvert, int totvert);
126 void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
127 void mesh_delete_material_index(struct Mesh *me, short index);
128 void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
129 void convert_mfaces_to_mpolys(struct Mesh *mesh);
130 void mesh_calc_normals_tessface(struct MVert *mverts, int numVerts,struct  MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
131
132 /*used for unit testing; compares two meshes, checking only
133   differences we care about.  should be usable with leaf's
134   testing framework I get RNA work done, will use hackish
135   testing code for now.*/
136 const char *mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh);
137
138 struct BoundBox *mesh_get_bb(struct Object *ob);
139 void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
140
141 /* if old, it converts mface->edcode to edge drawflags */
142 void make_edges(struct Mesh *me, int old);
143
144 void mesh_strip_loose_faces(struct Mesh *me);
145 void mesh_strip_loose_edges(struct Mesh *me);
146
147         /* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
148          * and vertex normals are stored in actual mverts.
149          */
150 void mesh_calc_normals_mapping(
151         struct MVert *mverts, int numVerts,
152         struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
153         struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]);
154         /* extended version of 'mesh_calc_normals' with option not to calc vertex normals */
155 void mesh_calc_normals_mapping_ex(
156         struct MVert *mverts, int numVerts,
157         struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
158         struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3],
159         const short only_face_normals);
160
161 void mesh_calc_normals(
162         struct MVert *mverts, int numVerts,
163         struct MLoop *mloop, struct MPoly *mpolys,
164         int numLoops, int numPolys, float (*polyNors_r)[3]);
165
166         /* Return a newly MEM_malloc'd array of all the mesh vertex locations
167          * (_numVerts_r_ may be NULL) */
168 float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
169
170 /* map from uv vertex to face (for select linked, stitch, uv suburf) */
171
172 /* UvVertMap */
173
174 #define STD_UV_CONNECT_LIMIT    0.0001f
175
176 typedef struct UvVertMap {
177         struct UvMapVert **vert;
178         struct UvMapVert *buf;
179 } UvVertMap;
180
181 typedef struct UvMapVert {
182         struct UvMapVert *next;
183         unsigned int f;
184         unsigned char tfindex, separate, flag;
185 } UvMapVert;
186
187 typedef struct UvElementMap {
188         /* address UvElements by their vertex */
189         struct UvElement **vert;
190         /* UvElement Store */
191         struct UvElement *buf;
192         /* Total number of UVs in the layer. Useful to know */
193         int totalUVs;
194         /* Number of Islands in the mesh */
195         int totalIslands;
196         /* Stores the starting index in buf where each island begins */
197         int *islandIndices;
198 } UvElementMap;
199
200 typedef struct UvElement {
201         /* Next UvElement corresponding to same vertex */
202         struct UvElement *next;
203         /* Face the element belongs to */
204         struct BMFace *face;
205         /* Index in the editFace of the uv */
206         unsigned char tfindex;
207         /* Whether this element is the first of coincident elements */
208         unsigned char separate;
209         /* general use flag */
210         unsigned char flag;
211         /* If generating element map with island sorting, this stores the island index */
212         unsigned short island;
213 } UvElement;
214
215 /* invalid island index is max short. If any one has the patience
216  * to make that many islands, he can bite me :p */
217 #define INVALID_ISLAND 0xFFFF
218
219 UvVertMap *make_uv_vert_map(struct MPoly *mpoly, struct MLoop *mloop, struct MLoopUV *mloopuv, unsigned int totpoly, unsigned int totvert, int selected, float *limit);
220 UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
221 void free_uv_vert_map(UvVertMap *vmap);
222
223 /* Connectivity data */
224 typedef struct IndexNode {
225         struct IndexNode *next, *prev;
226         int index;
227 } IndexNode;
228 void create_vert_poly_map(struct ListBase **map, IndexNode **mem,
229                           struct MPoly *mface, struct MLoop *mloop,
230                           const int totvert, const int totface, const int totloop);
231 void create_vert_face_map(struct ListBase **map, IndexNode **mem, const struct MFace *mface,
232                           const int totvert, const int totface);
233 void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge,
234                           const int totvert, const int totedge);
235
236 /* functions for making menu's from customdata layers */
237 int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
238 void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
239 int mesh_layers_menu(struct CustomData *data, int type);
240
241 /* vertex level transformations & checks (no derived mesh) */
242
243 int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
244 int mesh_center_median(struct Mesh *me, float cent[3]);
245 int mesh_center_bounds(struct Mesh *me, float cent[3]);
246 void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
247
248 /* mesh_validate.c */
249 int BKE_mesh_validate_arrays(
250                 struct Mesh *me,
251         struct MVert *mverts, unsigned int totvert,
252         struct MEdge *medges, unsigned int totedge,
253         struct MFace *mfaces, unsigned int totface,
254         struct MDeformVert *dverts, /* assume totvert length */
255         const short do_verbose, const short do_fixes);
256 int BKE_mesh_validate(struct Mesh *me, int do_verbose);
257 int BKE_mesh_validate_dm(struct DerivedMesh *dm);
258
259 void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
260
261 void BKE_mesh_ensure_navmesh(struct Mesh *me);
262
263 void BKE_mesh_calc_tessface(struct Mesh *mesh);
264 void BKE_mesh_ensure_tessface(struct Mesh *mesh);
265
266 /*convert a triangle of loop facedata to mface facedata*/
267 void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
268                                  struct CustomData *pdata, int lindex[4], int findex,
269                                  const int polyindex, const int mf_len,
270                                  const int numTex, const int numCol, const int hasWCol, const int hasOrigSpace);
271
272 #ifdef __cplusplus
273 }
274 #endif
275
276 #endif /* BKE_MESH_H */