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