Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / BKE_cdderivedmesh.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) 2006 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Ben Batt <benbatt@gmail.com>
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file BKE_cdderivedmesh.h
29  *  \ingroup bke
30  *  \section aboutcdderivedmesh CDDerivedMesh interface
31  *   CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores
32  *   mesh elements (vertices, edges and faces) as layers of custom element data.
33  */
34
35 #ifndef __BKE_CDDERIVEDMESH_H__
36 #define __BKE_CDDERIVEDMESH_H__
37
38 #include "BKE_DerivedMesh.h"
39
40 struct DerivedMesh;
41 struct BMEditMesh;
42 struct Mesh;
43 struct MLoopNorSpaceArray;
44 struct Object;
45
46 /* creates a new CDDerivedMesh */
47 struct DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces,
48                              int numLoops, int numPolys);
49
50 /* creates a CDDerivedMesh from the given Mesh, this will reference the
51  * original data in Mesh, but it is safe to apply vertex coordinates or
52  * calculate normals as those functions will automatically create new
53  * data to not overwrite the original */
54 struct DerivedMesh *CDDM_from_mesh(struct Mesh *mesh);
55
56 /* creates a CDDerivedMesh from the given Mesh with custom allocation type. */
57 struct DerivedMesh *CDDM_from_mesh_ex(struct Mesh *mesh, int alloctype);
58
59
60 struct DerivedMesh *CDDM_from_bmesh(struct BMesh *bm, const bool use_mdisps);
61
62 /* creates a CDDerivedMesh from the given BMEditMesh */
63 DerivedMesh *CDDM_from_editbmesh(struct BMEditMesh *em, const bool use_mdisps, const bool use_tessface);
64
65 /* merge verts  */
66 /* Enum for merge_mode of CDDM_merge_verts.
67  * Refer to cdderivedmesh.c for details. */
68 enum {
69         CDDM_MERGE_VERTS_DUMP_IF_MAPPED,
70         CDDM_MERGE_VERTS_DUMP_IF_EQUAL,
71 };
72 DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap, const int tot_vtargetmap, const int merge_mode);
73
74 /* creates a CDDerivedMesh from the given curve object */
75 struct DerivedMesh *CDDM_from_curve(struct Object *ob);
76
77 /* creates a CDDerivedMesh from the given curve object and specified dispbase */
78 /* useful for OrcoDM creation for curves with constructive modifiers */
79 DerivedMesh *CDDM_from_curve_displist(struct Object *ob, struct ListBase *dispbase);
80
81 /* Copies the given DerivedMesh with verts, faces & edges stored as
82  * custom element data.
83  */
84 struct DerivedMesh *CDDM_copy(struct DerivedMesh *dm);
85 struct DerivedMesh *CDDM_copy_from_tessface(struct DerivedMesh *dm);
86 struct DerivedMesh *CDDM_copy_with_tessface(struct DerivedMesh *dm);
87
88 /* creates a CDDerivedMesh with the same layer stack configuration as the
89  * given DerivedMesh and containing the requested numbers of elements.
90  * elements are initialized to all zeros
91  */
92 struct DerivedMesh *CDDM_from_template_ex(
93         struct DerivedMesh *source,
94         int numVerts, int numEdges, int numFaces,
95         int numLoops, int numPolys,
96         CustomDataMask mask);
97 struct DerivedMesh *CDDM_from_template(
98         struct DerivedMesh *source,
99         int numVerts, int numEdges, int numFaces,
100         int numLoops, int numPolys);
101
102 /* converts mfaces to mpolys.  note things may break if there are not valid
103  * medges surrounding each mface.
104  */
105 void CDDM_tessfaces_to_faces(struct DerivedMesh *dm);
106
107 /* applies vertex coordinates or normals to a CDDerivedMesh. if the MVert
108  * layer is a referenced layer, it will be duplicate to not overwrite the
109  * original
110  */
111 void CDDM_apply_vert_coords(struct DerivedMesh *cddm, float (*vertCoords)[3]);
112 void CDDM_apply_vert_normals(struct DerivedMesh *cddm, short (*vertNormals)[3]);
113
114 /* recalculates vertex and face normals for a CDDerivedMesh
115  */
116 void CDDM_calc_normals_mapping_ex(struct DerivedMesh *dm, const bool only_face_normals);
117 void CDDM_calc_normals_mapping(struct DerivedMesh *dm);
118 void CDDM_calc_normals(struct DerivedMesh *dm);
119 void CDDM_calc_normals_tessface(struct DerivedMesh *dm);
120
121 void CDDM_calc_loop_normals(struct DerivedMesh *dm, const bool use_split_normals, const float split_angle);
122 void CDDM_calc_loop_normals_spacearr(struct DerivedMesh *dm, const bool use_split_normals, const float split_angle,
123                                      struct MLoopNorSpaceArray *r_lnors_spacearr);
124
125 /* calculates edges for a CDDerivedMesh (from face data)
126  * this completely replaces the current edge data in the DerivedMesh
127  * builds edges from the tessellated face data.
128  */
129 void CDDM_calc_edges_tessface(struct DerivedMesh *dm);
130
131 /* same as CDDM_calc_edges_tessface only makes edges from ngon faces instead of tessellation
132  * faces*/
133 void CDDM_calc_edges(struct DerivedMesh *dm);
134
135 /* reconstitute face triangulation */
136 void CDDM_recalc_tessellation(struct DerivedMesh *dm);
137 void CDDM_recalc_tessellation_ex(struct DerivedMesh *dm, const bool do_face_nor_cpy);
138
139 void CDDM_recalc_looptri(struct DerivedMesh *dm);
140
141 /* lowers the number of vertices/edges/faces in a CDDerivedMesh
142  * the layer data stays the same size
143  */
144 void CDDM_lower_num_verts(struct DerivedMesh *dm, int numVerts);
145 void CDDM_lower_num_edges(struct DerivedMesh *dm, int numEdges);
146 void CDDM_lower_num_loops(struct DerivedMesh *dm, int numLoops);
147 void CDDM_lower_num_polys(struct DerivedMesh *dm, int numPolys);
148 void CDDM_lower_num_tessfaces(DerivedMesh *dm, int numTessFaces);
149
150 /* vertex/edge/face access functions
151  * should always succeed if index is within bounds
152  * note these return pointers - any change modifies the internals of the mesh
153  */
154 struct MVert *CDDM_get_vert(struct DerivedMesh *dm, int index);
155 struct MEdge *CDDM_get_edge(struct DerivedMesh *dm, int index);
156 struct MFace *CDDM_get_tessface(struct DerivedMesh *dm, int index);
157 struct MLoop *CDDM_get_loop(struct DerivedMesh *dm, int index);
158 struct MPoly *CDDM_get_poly(struct DerivedMesh *dm, int index);
159
160 /* vertex/edge/face array access functions - return the array holding the
161  * desired data
162  * should always succeed
163  * note these return pointers - any change modifies the internals of the mesh
164  */
165 struct MVert *CDDM_get_verts(struct DerivedMesh *dm);
166 struct MEdge *CDDM_get_edges(struct DerivedMesh *dm);
167 struct MFace *CDDM_get_tessfaces(struct DerivedMesh *dm);
168 struct MLoop *CDDM_get_loops(struct DerivedMesh *dm);
169 struct MPoly *CDDM_get_polys(struct DerivedMesh *dm);
170
171 /* Assigns news m*** layers to the cddm.  Note that you must handle
172  * freeing the old ones yourself.  Also you must ensure dm->num****Data
173  * is correct.*/
174 void CDDM_set_mvert(struct DerivedMesh *dm, struct MVert *mvert);
175 void CDDM_set_medge(struct DerivedMesh *dm, struct MEdge *medge);
176 void CDDM_set_mface(struct DerivedMesh *dm, struct MFace *mface);
177 void CDDM_set_mloop(struct DerivedMesh *dm, struct MLoop *mloop);
178 void CDDM_set_mpoly(struct DerivedMesh *dm, struct MPoly *mpoly);
179
180 #endif
181