sync changes from bmesh r42951 + some other minor edits.
[blender-staging.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 EditMesh;
40 struct Mesh;
41 struct MPoly;
42 struct MLoop;
43 struct MFace;
44 struct MEdge;
45 struct MVert;
46 struct MDeformVert;
47 struct MCol;
48 struct Object;
49 struct MTFace;
50 struct VecNor;
51 struct CustomData;
52 struct DerivedMesh;
53 struct Scene;
54 struct MLoopUV;
55
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59
60 struct EditMesh *BKE_mesh_get_editmesh(struct Mesh *me);
61 void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
62
63 /* for forwards compat only quad->tri polys to mface, skip ngons.
64  */
65 int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
66         struct CustomData *pdata, int totface, int totloop, int totpoly);
67
68 void unlink_mesh(struct Mesh *me);
69 void free_mesh(struct Mesh *me);
70 struct Mesh *add_mesh(const char *name);
71 struct Mesh *copy_mesh(struct Mesh *me);
72 void mesh_update_customdata_pointers(struct Mesh *me);
73 void make_local_mesh(struct Mesh *me);
74 void boundbox_mesh(struct Mesh *me, float *loc, float *size);
75 void tex_space_mesh(struct Mesh *me);
76 float *get_mesh_orco_verts(struct Object *ob);
77 void transform_mesh_orco_verts(struct Mesh *me, float (*orco)[3], int totvert, int invert);
78 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
79 struct Mesh *get_mesh(struct Object *ob);
80 void set_mesh(struct Object *ob, struct Mesh *me);
81 void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
82 int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert,
83         struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface);
84 int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase,
85         struct MVert **allvert, int *_totvert, struct MEdge **alledge, int *_totedge,
86         struct MFace **allface, int *_totface);
87 void nurbs_to_mesh(struct Object *ob);
88 void mesh_to_curve(struct Scene *scene, struct Object *ob);
89 void free_dverts(struct MDeformVert *dvert, int totvert);
90 void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
91 void mesh_delete_material_index(struct Mesh *me, short index);
92 void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
93
94 struct BoundBox *mesh_get_bb(struct Object *ob);
95 void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
96
97 /* if old, it converts mface->edcode to edge drawflags */
98 void make_edges(struct Mesh *me, int old);
99
100 void mesh_strip_loose_faces(struct Mesh *me);
101 void mesh_strip_loose_edges(struct Mesh *me);
102
103         /* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
104          * and vertex normals are stored in actual mverts.
105          */
106 void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
107
108         /* Return a newly MEM_malloc'd array of all the mesh vertex locations
109          * (_numVerts_r_ may be NULL) */
110 float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
111
112 /* map from uv vertex to face (for select linked, stitch, uv suburf) */
113
114 /* UvVertMap */
115
116 #define STD_UV_CONNECT_LIMIT    0.0001f
117
118 typedef struct UvVertMap {
119         struct UvMapVert **vert;
120         struct UvMapVert *buf;
121 } UvVertMap;
122
123 typedef struct UvMapVert {
124         struct UvMapVert *next;
125         unsigned int f;
126         unsigned char tfindex, separate, flag;
127 } UvMapVert;
128
129 UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit);
130 UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
131 void free_uv_vert_map(UvVertMap *vmap);
132
133 /* Connectivity data */
134 typedef struct IndexNode {
135         struct IndexNode *next, *prev;
136         int index;
137 } IndexNode;
138 void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
139                           const int totvert, const int totface);
140 void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
141                           const int totvert, const int totedge);
142
143 /* functions for making menu's from customdata layers */
144 int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
145 void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
146 int mesh_layers_menu(struct CustomData *data, int type);
147
148 /* vertex level transformations & checks (no derived mesh) */
149
150 int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
151 int mesh_center_median(struct Mesh *me, float cent[3]);
152 int mesh_center_bounds(struct Mesh *me, float cent[3]);
153 void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
154
155 /* mesh_validate.c */
156 int BKE_mesh_validate_arrays(
157                 struct Mesh *me,
158         struct MVert *mverts, unsigned int totvert,
159         struct MEdge *medges, unsigned int totedge,
160         struct MFace *mfaces, unsigned int totface,
161         struct MDeformVert *dverts, /* assume totvert length */
162         const short do_verbose, const short do_fixes);
163 int BKE_mesh_validate(struct Mesh *me, int do_verbose);
164 int BKE_mesh_validate_dm(struct DerivedMesh *dm);
165
166 void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
167
168 void BKE_mesh_ensure_navmesh(struct Mesh *me);
169
170 /*convert a triangle of loop facedata to mface facedata*/
171 void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
172                                  struct CustomData *pdata, int lindex[4], int findex,
173                                  const int polyindex, const int mf_len,
174                                  const int numTex, const int numCol, const int hasWCol);
175
176 #ifdef __cplusplus
177 }
178 #endif
179
180 #endif /* BKE_MESH_H */