Style Cleanup
[blender.git] / source / blender / blenkernel / intern / modifiers_bmesh.c
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17  *
18  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Joseph Eagar
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  *
25  * Modifier stack implementation.
26  *
27  * BKE_modifier.h contains the function prototypes for this file.
28  *
29  */
30
31 #include "string.h"
32 #include "stdarg.h"
33 #include "math.h"
34 #include "float.h"
35 #include "ctype.h"
36
37 #include "BLI_utildefines.h"
38 #include "BLI_math.h"
39 #include "BLI_blenlib.h"
40 #include "BLI_kdopbvh.h"
41 #include "BLI_kdtree.h"
42 #include "BLI_linklist.h"
43 #include "BLI_rand.h"
44 #include "BLI_edgehash.h"
45 #include "BLI_ghash.h"
46 #include "BLI_memarena.h"
47
48 #include "MEM_guardedalloc.h"
49
50 #include "DNA_action_types.h"
51 #include "DNA_armature_types.h"
52 #include "DNA_camera_types.h"
53 #include "DNA_cloth_types.h"
54 #include "DNA_curve_types.h"
55 #include "DNA_effect_types.h"
56 #include "DNA_material_types.h"
57 #include "DNA_mesh_types.h"
58 #include "DNA_meshdata_types.h"
59 #include "DNA_modifier_types.h"
60 #include "DNA_object_types.h"
61 #include "DNA_object_force.h"
62 #include "DNA_particle_types.h"
63 #include "DNA_scene_types.h"
64 #include "DNA_texture_types.h"
65
66 #include "BLI_editVert.h"
67 #include "BLI_array.h"
68
69 #include "BKE_main.h"
70 #include "BKE_anim.h"
71 #include "BKE_bmesh.h"
72 // XXX #include "BKE_booleanops.h"
73 #include "BKE_cloth.h"
74 #include "BKE_collision.h"
75 #include "BKE_cdderivedmesh.h"
76 #include "BKE_curve.h"
77 #include "BKE_customdata.h"
78 #include "BKE_DerivedMesh.h"
79 #include "BKE_displist.h"
80 #include "BKE_fluidsim.h"
81 #include "BKE_global.h"
82 #include "BKE_multires.h"
83 #include "BKE_lattice.h"
84 #include "BKE_library.h"
85 #include "BKE_material.h"
86 #include "BKE_mesh.h"
87 #include "BKE_modifier.h"
88 #include "BKE_object.h"
89 #include "BKE_particle.h"
90 #include "BKE_pointcache.h"
91 #include "BKE_softbody.h"
92 #include "BKE_subsurf.h"
93 #include "BKE_texture.h"
94 #include "BKE_tessmesh.h"
95
96 #include "depsgraph_private.h"
97 #include "BKE_deform.h"
98 #include "BKE_shrinkwrap.h"
99
100 #include "CCGSubSurf.h"
101 #include "RE_shader_ext.h"
102 #include "LOD_decimation.h"
103
104 /* converts a cddm to a BMEditMesh.  if existing is non-NULL, the
105  * new geometry will be put in there.*/
106 BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, int do_tesselate)
107 {
108         int allocsize[4] = {512, 512, 2048, 512};
109         BMesh *bm, bmold; /*bmold is for storing old customdata layout*/
110         BMEditMesh *em = existing;
111         MVert *mv, *mvert;
112         MEdge *me, *medge;
113         MPoly *mpoly, *mp;
114         MLoop *mloop, *ml;
115         BMVert *v, **vtable, **verts = NULL;
116         BMEdge *e, **etable, **edges = NULL;
117         BMFace *f;
118         BMIter liter;
119         BLI_array_declare(verts);
120         BLI_array_declare(edges);
121         int i, j, k, totvert, totedge, totface;
122         
123         if (em) bm = em->bm;
124         else bm = BM_Make_Mesh(ob, allocsize);
125
126         bmold = *bm;
127
128         /*merge custom data layout*/
129         CustomData_bmesh_merge(&dm->vertData, &bm->vdata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_VERT);
130         CustomData_bmesh_merge(&dm->edgeData, &bm->edata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_EDGE);
131         CustomData_bmesh_merge(&dm->loopData, &bm->ldata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_LOOP);
132         CustomData_bmesh_merge(&dm->polyData, &bm->pdata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_FACE);
133
134         totvert = dm->getNumVerts(dm);
135         totedge = dm->getNumEdges(dm);
136         totface = dm->getNumPolys(dm);
137
138         vtable = MEM_callocN(sizeof(void**)*totvert, "vert table in BMDM_Copy");
139         etable = MEM_callocN(sizeof(void**)*totedge, "edge table in BMDM_Copy");
140
141         /*do verts*/
142         mv = mvert = dm->dupVertArray(dm);
143         for (i = 0; i < totvert; i++, mv++) {
144                 v = BM_Make_Vert(bm, mv->co, NULL);
145                 normal_short_to_float_v3(v->no, mv->no);
146                 v->head.hflag = BM_Vert_Flag_From_MEFlag(mv->flag);
147
148                 CustomData_to_bmesh_block(&dm->vertData, &bm->vdata, i, &v->head.data);
149                 vtable[i] = v;
150         }
151         MEM_freeN(mvert);
152
153         /*do edges*/
154         me = medge = dm->dupEdgeArray(dm);
155         for (i = 0; i < totedge; i++, me++) {
156                 e = BM_Make_Edge(bm, vtable[me->v1], vtable[me->v2], NULL, FALSE);
157
158                 e->head.hflag = BM_Edge_Flag_From_MEFlag(me->flag);
159
160                 CustomData_to_bmesh_block(&dm->edgeData, &bm->edata, i, &e->head.data);
161                 etable[i] = e;
162         }
163         MEM_freeN(medge);
164         
165         /*do faces*/
166         mpoly = mp = dm->getPolyArray(dm);
167         mloop = dm->getLoopArray(dm);
168         for (i = 0; i < dm->numPolyData; i++, mp++) {
169                 BMLoop *l;
170
171                 BLI_array_empty(verts);
172                 BLI_array_empty(edges);
173
174                 BLI_array_growitems(verts, mp->totloop);
175                 BLI_array_growitems(edges, mp->totloop);
176
177                 ml = mloop + mp->loopstart;
178                 for (j = 0; j < mp->totloop; j++, ml++) {
179
180                         verts[j] = vtable[ml->v];
181                         edges[j] = etable[ml->e];
182                 }
183
184                 f = BM_Make_Ngon(bm, verts[0], verts[1], edges, mp->totloop, FALSE);
185
186                 if (!f)
187                         continue;
188
189                 f->head.hflag = BM_Face_Flag_From_MEFlag(mp->flag);
190                 f->mat_nr = mp->mat_nr;
191
192                 l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
193                 k = mp->loopstart;
194
195                 for (j = 0; l; l = BMIter_Step(&liter), k++) {
196                         CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, k, &l->head.data);
197                 }
198
199                 CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, i, &f->head.data);
200         }
201
202         MEM_freeN(vtable);
203         MEM_freeN(etable);
204         
205         BLI_array_free(verts);
206         BLI_array_free(edges);
207
208         if (!em) {
209                 em = BMEdit_Create(bm, do_tesselate);
210         }
211         else {
212                 if (do_tesselate) {
213                         BMEdit_RecalcTesselation(em);
214                 }
215         }
216
217         return em;
218 }