9b5e38dfea7aba497d13158eb46f7ab5022b4beb
[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
57 #ifdef __cplusplus
58 extern "C" {
59 #endif
60
61 struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob);
62
63 /*
64  * this function recreates a tesselation.
65  * returns number of tesselation faces.
66  *
67  * use_poly_origindex sets whether or not the tesselation faces' origindex
68  * layer should point to original poly indices or real poly indices.
69  *
70  * use_face_origindex sets the tesselation faces' origindex layer
71  * to point to the tesselation faces themselves, not the polys.
72  *
73  * if both of the above are 0, it'll use the indices of the mpolys of the MPoly
74  * data in pdata, and ignore the origindex layer altogether.
75  */
76 int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, 
77         struct CustomData *pdata, struct MVert *mvert, int totface, 
78         int totloop, int totpoly);
79
80 /* for forwards compat only quad->tri polys to mface, skip ngons.
81  */
82 int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
83         struct CustomData *pdata, int totface, int totloop, int totpoly);
84
85 /*calculates a face normal.*/
86 void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, 
87                            struct MVert *mvarray, float no[3]);
88
89 void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
90                            struct MVert *mvarray, float cent[3]);
91
92 float mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
93                           struct MVert *mvarray, float polynormal[3]);
94
95 void unlink_mesh(struct Mesh *me);
96 void free_mesh(struct Mesh *me, int unlink);
97 struct Mesh *add_mesh(const char *name);
98 struct Mesh *copy_mesh(struct Mesh *me);
99 void mesh_update_customdata_pointers(struct Mesh *me, const short do_ensure_tess_cd);
100
101 void make_local_mesh(struct Mesh *me);
102 void boundbox_mesh(struct Mesh *me, float *loc, float *size);
103 void tex_space_mesh(struct Mesh *me);
104 float *get_mesh_orco_verts(struct Object *ob);
105 void transform_mesh_orco_verts(struct Mesh *me, float (*orco)[3], int totvert, int invert);
106 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
107 struct Mesh *get_mesh(struct Object *ob);
108 void set_mesh(struct Object *ob, struct Mesh *me);
109 void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
110 int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *totvert,
111         struct MEdge **alledge, int *totedge, struct MFace **allface, struct MLoop **allloop, struct MPoly **allpoly, 
112         int *totface, int *totloop, int *totpoly);
113 int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert,
114         struct MEdge **alledge, int *_totedge, struct MFace **allface, struct MLoop **allloop, struct MPoly **allpoly, 
115         int *_totface, int *_totloop, int *_totpoly);
116 void nurbs_to_mesh(struct Object *ob);
117 void mesh_to_curve(struct Scene *scene, struct Object *ob);
118 void free_dverts(struct MDeformVert *dvert, int totvert);
119 void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
120 void mesh_delete_material_index(struct Mesh *me, short index);
121 void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
122 void convert_mfaces_to_mpolys(struct Mesh *mesh);
123 void mesh_calc_tessface_normals(struct MVert *mverts, int numVerts,struct  MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
124
125 /*used for unit testing; compares two meshes, checking only
126   differences we care about.  should be usable with leaf's
127   testing framework I get RNA work done, will use hackish
128   testing code for now.*/
129 const char *mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh);
130
131 struct BoundBox *mesh_get_bb(struct Object *ob);
132 void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
133
134 /* if old, it converts mface->edcode to edge drawflags */
135 void make_edges(struct Mesh *me, int old);
136
137 void mesh_strip_loose_faces(struct Mesh *me);
138 void mesh_strip_loose_edges(struct Mesh *me);
139
140         /* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
141          * and vertex normals are stored in actual mverts.
142          */
143 void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MLoop *mloop, 
144         struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
145         struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]);
146         /* extended version of 'mesh_calc_normals' with option not to calc vertex normals */
147 void mesh_calc_normals_ex(struct MVert *mverts, int numVerts, struct MLoop *mloop,
148         struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
149         struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3],
150         const short only_face_normals);
151
152         /* Return a newly MEM_malloc'd array of all the mesh vertex locations
153          * (_numVerts_r_ may be NULL) */
154 float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
155
156 /* map from uv vertex to face (for select linked, stitch, uv suburf) */
157
158 /* UvVertMap */
159
160 #define STD_UV_CONNECT_LIMIT    0.0001f
161
162 typedef struct UvVertMap {
163         struct UvMapVert **vert;
164         struct UvMapVert *buf;
165 } UvVertMap;
166
167 typedef struct UvMapVert {
168         struct UvMapVert *next;
169         unsigned int f;
170         unsigned char tfindex, separate, flag;
171 } UvMapVert;
172
173 UvVertMap *make_uv_vert_map(struct MPoly *mpoly, struct MLoop *mloop, struct MLoopUV *mloopuv, unsigned int totpoly, unsigned int totvert, int selected, float *limit);
174 UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
175 void free_uv_vert_map(UvVertMap *vmap);
176
177 /* Connectivity data */
178 typedef struct IndexNode {
179         struct IndexNode *next, *prev;
180         int index;
181 } IndexNode;
182 void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
183                           const int totvert, const int totface);
184 void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
185                           const int totvert, const int totedge);
186
187 /* functions for making menu's from customdata layers */
188 int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
189 void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
190 int mesh_layers_menu(struct CustomData *data, int type);
191
192 /* vertex level transformations & checks (no derived mesh) */
193
194 int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
195 int mesh_center_median(struct Mesh *me, float cent[3]);
196 int mesh_center_bounds(struct Mesh *me, float cent[3]);
197 void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
198
199 /* mesh_validate.c */
200 int BKE_mesh_validate_arrays(
201                 struct Mesh *me,
202         struct MVert *mverts, unsigned int totvert,
203         struct MEdge *medges, unsigned int totedge,
204         struct MFace *mfaces, unsigned int totface,
205         struct MDeformVert *dverts, /* assume totvert length */
206         const short do_verbose, const short do_fixes);
207 int BKE_mesh_validate(struct Mesh *me, int do_verbose);
208 int BKE_mesh_validate_dm(struct DerivedMesh *dm);
209
210 void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
211
212 void BKE_mesh_ensure_navmesh(struct Mesh *me);
213
214 /*convert a triangle of loop facedata to mface facedata*/
215 void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
216                            struct CustomData *pdata, int lindex[4], int findex,
217                            const int polyindex, const int mf_len);
218
219 #ifdef __cplusplus
220 }
221 #endif
222
223 #endif /* BKE_MESH_H */