Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / intern / mesh.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup bke
22  */
23
24 #include "MEM_guardedalloc.h"
25
26 #include "DNA_object_types.h"
27 #include "DNA_key_types.h"
28 #include "DNA_mesh_types.h"
29 #include "DNA_meshdata_types.h"
30
31 #include "BLI_utildefines.h"
32 #include "BLI_bitmap.h"
33 #include "BLI_math.h"
34 #include "BLI_linklist.h"
35 #include "BLI_memarena.h"
36 #include "BLI_edgehash.h"
37 #include "BLI_string.h"
38
39 #include "BKE_animsys.h"
40 #include "BKE_idcode.h"
41 #include "BKE_main.h"
42 #include "BKE_global.h"
43 #include "BKE_mesh.h"
44 #include "BKE_mesh_runtime.h"
45 #include "BKE_library.h"
46 #include "BKE_material.h"
47 #include "BKE_modifier.h"
48 #include "BKE_multires.h"
49 #include "BKE_object.h"
50 #include "BKE_editmesh.h"
51
52 #include "DEG_depsgraph.h"
53
54 enum {
55   MESHCMP_DVERT_WEIGHTMISMATCH = 1,
56   MESHCMP_DVERT_GROUPMISMATCH,
57   MESHCMP_DVERT_TOTGROUPMISMATCH,
58   MESHCMP_LOOPCOLMISMATCH,
59   MESHCMP_LOOPUVMISMATCH,
60   MESHCMP_LOOPMISMATCH,
61   MESHCMP_POLYVERTMISMATCH,
62   MESHCMP_POLYMISMATCH,
63   MESHCMP_EDGEUNKNOWN,
64   MESHCMP_VERTCOMISMATCH,
65   MESHCMP_CDLAYERS_MISMATCH,
66 };
67
68 static const char *cmpcode_to_str(int code)
69 {
70   switch (code) {
71     case MESHCMP_DVERT_WEIGHTMISMATCH:
72       return "Vertex Weight Mismatch";
73     case MESHCMP_DVERT_GROUPMISMATCH:
74       return "Vertex Group Mismatch";
75     case MESHCMP_DVERT_TOTGROUPMISMATCH:
76       return "Vertex Doesn't Belong To Same Number Of Groups";
77     case MESHCMP_LOOPCOLMISMATCH:
78       return "Vertex Color Mismatch";
79     case MESHCMP_LOOPUVMISMATCH:
80       return "UV Mismatch";
81     case MESHCMP_LOOPMISMATCH:
82       return "Loop Mismatch";
83     case MESHCMP_POLYVERTMISMATCH:
84       return "Loop Vert Mismatch In Poly Test";
85     case MESHCMP_POLYMISMATCH:
86       return "Loop Vert Mismatch";
87     case MESHCMP_EDGEUNKNOWN:
88       return "Edge Mismatch";
89     case MESHCMP_VERTCOMISMATCH:
90       return "Vertex Coordinate Mismatch";
91     case MESHCMP_CDLAYERS_MISMATCH:
92       return "CustomData Layer Count Mismatch";
93     default:
94       return "Mesh Comparison Code Unknown";
95   }
96 }
97
98 /* thresh is threshold for comparing vertices, uvs, vertex colors,
99  * weights, etc.*/
100 static int customdata_compare(
101     CustomData *c1, CustomData *c2, Mesh *m1, Mesh *m2, const float thresh)
102 {
103   const float thresh_sq = thresh * thresh;
104   CustomDataLayer *l1, *l2;
105   int i, i1 = 0, i2 = 0, tot, j;
106
107   for (i = 0; i < c1->totlayer; i++) {
108     if (ELEM(c1->layers[i].type,
109              CD_MVERT,
110              CD_MEDGE,
111              CD_MPOLY,
112              CD_MLOOPUV,
113              CD_MLOOPCOL,
114              CD_MDEFORMVERT)) {
115       i1++;
116     }
117   }
118
119   for (i = 0; i < c2->totlayer; i++) {
120     if (ELEM(c2->layers[i].type,
121              CD_MVERT,
122              CD_MEDGE,
123              CD_MPOLY,
124              CD_MLOOPUV,
125              CD_MLOOPCOL,
126              CD_MDEFORMVERT)) {
127       i2++;
128     }
129   }
130
131   if (i1 != i2) {
132     return MESHCMP_CDLAYERS_MISMATCH;
133   }
134
135   l1 = c1->layers;
136   l2 = c2->layers;
137   tot = i1;
138   i1 = 0;
139   i2 = 0;
140   for (i = 0; i < tot; i++) {
141     while (
142         i1 < c1->totlayer &&
143         !ELEM(l1->type, CD_MVERT, CD_MEDGE, CD_MPOLY, CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT)) {
144       i1++;
145       l1++;
146     }
147
148     while (
149         i2 < c2->totlayer &&
150         !ELEM(l2->type, CD_MVERT, CD_MEDGE, CD_MPOLY, CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT)) {
151       i2++;
152       l2++;
153     }
154
155     if (l1->type == CD_MVERT) {
156       MVert *v1 = l1->data;
157       MVert *v2 = l2->data;
158       int vtot = m1->totvert;
159
160       for (j = 0; j < vtot; j++, v1++, v2++) {
161         if (len_squared_v3v3(v1->co, v2->co) > thresh_sq) {
162           return MESHCMP_VERTCOMISMATCH;
163         }
164         /* I don't care about normals, let's just do coordinates */
165       }
166     }
167
168     /*we're order-agnostic for edges here*/
169     if (l1->type == CD_MEDGE) {
170       MEdge *e1 = l1->data;
171       MEdge *e2 = l2->data;
172       int etot = m1->totedge;
173       EdgeHash *eh = BLI_edgehash_new_ex(__func__, etot);
174
175       for (j = 0; j < etot; j++, e1++) {
176         BLI_edgehash_insert(eh, e1->v1, e1->v2, e1);
177       }
178
179       for (j = 0; j < etot; j++, e2++) {
180         if (!BLI_edgehash_lookup(eh, e2->v1, e2->v2)) {
181           return MESHCMP_EDGEUNKNOWN;
182         }
183       }
184       BLI_edgehash_free(eh, NULL);
185     }
186
187     if (l1->type == CD_MPOLY) {
188       MPoly *p1 = l1->data;
189       MPoly *p2 = l2->data;
190       int ptot = m1->totpoly;
191
192       for (j = 0; j < ptot; j++, p1++, p2++) {
193         MLoop *lp1, *lp2;
194         int k;
195
196         if (p1->totloop != p2->totloop) {
197           return MESHCMP_POLYMISMATCH;
198         }
199
200         lp1 = m1->mloop + p1->loopstart;
201         lp2 = m2->mloop + p2->loopstart;
202
203         for (k = 0; k < p1->totloop; k++, lp1++, lp2++) {
204           if (lp1->v != lp2->v) {
205             return MESHCMP_POLYVERTMISMATCH;
206           }
207         }
208       }
209     }
210     if (l1->type == CD_MLOOP) {
211       MLoop *lp1 = l1->data;
212       MLoop *lp2 = l2->data;
213       int ltot = m1->totloop;
214
215       for (j = 0; j < ltot; j++, lp1++, lp2++) {
216         if (lp1->v != lp2->v) {
217           return MESHCMP_LOOPMISMATCH;
218         }
219       }
220     }
221     if (l1->type == CD_MLOOPUV) {
222       MLoopUV *lp1 = l1->data;
223       MLoopUV *lp2 = l2->data;
224       int ltot = m1->totloop;
225
226       for (j = 0; j < ltot; j++, lp1++, lp2++) {
227         if (len_squared_v2v2(lp1->uv, lp2->uv) > thresh_sq) {
228           return MESHCMP_LOOPUVMISMATCH;
229         }
230       }
231     }
232
233     if (l1->type == CD_MLOOPCOL) {
234       MLoopCol *lp1 = l1->data;
235       MLoopCol *lp2 = l2->data;
236       int ltot = m1->totloop;
237
238       for (j = 0; j < ltot; j++, lp1++, lp2++) {
239         if (ABS(lp1->r - lp2->r) > thresh || ABS(lp1->g - lp2->g) > thresh ||
240             ABS(lp1->b - lp2->b) > thresh || ABS(lp1->a - lp2->a) > thresh) {
241           return MESHCMP_LOOPCOLMISMATCH;
242         }
243       }
244     }
245
246     if (l1->type == CD_MDEFORMVERT) {
247       MDeformVert *dv1 = l1->data;
248       MDeformVert *dv2 = l2->data;
249       int dvtot = m1->totvert;
250
251       for (j = 0; j < dvtot; j++, dv1++, dv2++) {
252         int k;
253         MDeformWeight *dw1 = dv1->dw, *dw2 = dv2->dw;
254
255         if (dv1->totweight != dv2->totweight) {
256           return MESHCMP_DVERT_TOTGROUPMISMATCH;
257         }
258
259         for (k = 0; k < dv1->totweight; k++, dw1++, dw2++) {
260           if (dw1->def_nr != dw2->def_nr) {
261             return MESHCMP_DVERT_GROUPMISMATCH;
262           }
263           if (fabsf(dw1->weight - dw2->weight) > thresh) {
264             return MESHCMP_DVERT_WEIGHTMISMATCH;
265           }
266         }
267       }
268     }
269   }
270
271   return 0;
272 }
273
274 /**
275  * Used for unit testing; compares two meshes, checking only
276  * differences we care about.  should be usable with leaf's
277  * testing framework I get RNA work done, will use hackish
278  * testing code for now.
279  */
280 const char *BKE_mesh_cmp(Mesh *me1, Mesh *me2, float thresh)
281 {
282   int c;
283
284   if (!me1 || !me2) {
285     return "Requires two input meshes";
286   }
287
288   if (me1->totvert != me2->totvert) {
289     return "Number of verts don't match";
290   }
291
292   if (me1->totedge != me2->totedge) {
293     return "Number of edges don't match";
294   }
295
296   if (me1->totpoly != me2->totpoly) {
297     return "Number of faces don't match";
298   }
299
300   if (me1->totloop != me2->totloop) {
301     return "Number of loops don't match";
302   }
303
304   if ((c = customdata_compare(&me1->vdata, &me2->vdata, me1, me2, thresh))) {
305     return cmpcode_to_str(c);
306   }
307
308   if ((c = customdata_compare(&me1->edata, &me2->edata, me1, me2, thresh))) {
309     return cmpcode_to_str(c);
310   }
311
312   if ((c = customdata_compare(&me1->ldata, &me2->ldata, me1, me2, thresh))) {
313     return cmpcode_to_str(c);
314   }
315
316   if ((c = customdata_compare(&me1->pdata, &me2->pdata, me1, me2, thresh))) {
317     return cmpcode_to_str(c);
318   }
319
320   return NULL;
321 }
322
323 static void mesh_ensure_tessellation_customdata(Mesh *me)
324 {
325   if (UNLIKELY((me->totface != 0) && (me->totpoly == 0))) {
326     /* Pass, otherwise this function  clears 'mface' before
327      * versioning 'mface -> mpoly' code kicks in [#30583]
328      *
329      * Callers could also check but safer to do here - campbell */
330   }
331   else {
332     const int tottex_original = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
333     const int totcol_original = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
334
335     const int tottex_tessface = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
336     const int totcol_tessface = CustomData_number_of_layers(&me->fdata, CD_MCOL);
337
338     if (tottex_tessface != tottex_original || totcol_tessface != totcol_original) {
339       BKE_mesh_tessface_clear(me);
340
341       CustomData_from_bmeshpoly(&me->fdata, &me->ldata, me->totface);
342
343       /* TODO - add some --debug-mesh option */
344       if (G.debug & G_DEBUG) {
345         /* note: this warning may be un-called for if we are initializing the mesh for the
346          * first time from bmesh, rather then giving a warning about this we could be smarter
347          * and check if there was any data to begin with, for now just print the warning with
348          * some info to help troubleshoot what's going on - campbell */
349         printf(
350             "%s: warning! Tessellation uvs or vcol data got out of sync, "
351             "had to reset!\n    CD_MTFACE: %d != CD_MLOOPUV: %d || CD_MCOL: %d != CD_MLOOPCOL: "
352             "%d\n",
353             __func__,
354             tottex_tessface,
355             tottex_original,
356             totcol_tessface,
357             totcol_original);
358       }
359     }
360   }
361 }
362
363 void BKE_mesh_ensure_skin_customdata(Mesh *me)
364 {
365   BMesh *bm = me->edit_mesh ? me->edit_mesh->bm : NULL;
366   MVertSkin *vs;
367
368   if (bm) {
369     if (!CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
370       BMVert *v;
371       BMIter iter;
372
373       BM_data_layer_add(bm, &bm->vdata, CD_MVERT_SKIN);
374
375       /* Mark an arbitrary vertex as root */
376       BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
377         vs = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_MVERT_SKIN);
378         vs->flag |= MVERT_SKIN_ROOT;
379         break;
380       }
381     }
382   }
383   else {
384     if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) {
385       vs = CustomData_add_layer(&me->vdata, CD_MVERT_SKIN, CD_DEFAULT, NULL, me->totvert);
386
387       /* Mark an arbitrary vertex as root */
388       if (vs) {
389         vs->flag |= MVERT_SKIN_ROOT;
390       }
391     }
392   }
393 }
394
395 bool BKE_mesh_ensure_facemap_customdata(struct Mesh *me)
396 {
397   BMesh *bm = me->edit_mesh ? me->edit_mesh->bm : NULL;
398   bool changed = false;
399   if (bm) {
400     if (!CustomData_has_layer(&bm->pdata, CD_FACEMAP)) {
401       BM_data_layer_add(bm, &bm->pdata, CD_FACEMAP);
402       changed = true;
403     }
404   }
405   else {
406     if (!CustomData_has_layer(&me->pdata, CD_FACEMAP)) {
407       CustomData_add_layer(&me->pdata, CD_FACEMAP, CD_DEFAULT, NULL, me->totpoly);
408       changed = true;
409     }
410   }
411   return changed;
412 }
413
414 bool BKE_mesh_clear_facemap_customdata(struct Mesh *me)
415 {
416   BMesh *bm = me->edit_mesh ? me->edit_mesh->bm : NULL;
417   bool changed = false;
418   if (bm) {
419     if (CustomData_has_layer(&bm->pdata, CD_FACEMAP)) {
420       BM_data_layer_free(bm, &bm->pdata, CD_FACEMAP);
421       changed = true;
422     }
423   }
424   else {
425     if (CustomData_has_layer(&me->pdata, CD_FACEMAP)) {
426       CustomData_free_layers(&me->pdata, CD_FACEMAP, me->totpoly);
427       changed = true;
428     }
429   }
430   return changed;
431 }
432
433 /* this ensures grouped customdata (e.g. mtexpoly and mloopuv and mtface, or
434  * mloopcol and mcol) have the same relative active/render/clone/mask indices.
435  *
436  * note that for undo mesh data we want to skip 'ensure_tess_cd' call since
437  * we don't want to store memory for tessface when its only used for older
438  * versions of the mesh. - campbell*/
439 static void mesh_update_linked_customdata(Mesh *me, const bool do_ensure_tess_cd)
440 {
441   if (do_ensure_tess_cd) {
442     mesh_ensure_tessellation_customdata(me);
443   }
444
445   CustomData_bmesh_update_active_layers(&me->fdata, &me->ldata);
446 }
447
448 void BKE_mesh_update_customdata_pointers(Mesh *me, const bool do_ensure_tess_cd)
449 {
450   mesh_update_linked_customdata(me, do_ensure_tess_cd);
451
452   me->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
453   me->dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
454
455   me->medge = CustomData_get_layer(&me->edata, CD_MEDGE);
456
457   me->mface = CustomData_get_layer(&me->fdata, CD_MFACE);
458   me->mcol = CustomData_get_layer(&me->fdata, CD_MCOL);
459   me->mtface = CustomData_get_layer(&me->fdata, CD_MTFACE);
460
461   me->mpoly = CustomData_get_layer(&me->pdata, CD_MPOLY);
462   me->mloop = CustomData_get_layer(&me->ldata, CD_MLOOP);
463
464   me->mloopcol = CustomData_get_layer(&me->ldata, CD_MLOOPCOL);
465   me->mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV);
466 }
467
468 bool BKE_mesh_has_custom_loop_normals(Mesh *me)
469 {
470   if (me->edit_mesh) {
471     return CustomData_has_layer(&me->edit_mesh->bm->ldata, CD_CUSTOMLOOPNORMAL);
472   }
473   else {
474     return CustomData_has_layer(&me->ldata, CD_CUSTOMLOOPNORMAL);
475   }
476 }
477
478 /** Free (or release) any data used by this mesh (does not free the mesh itself). */
479 void BKE_mesh_free(Mesh *me)
480 {
481   BKE_animdata_free(&me->id, false);
482
483   BKE_mesh_runtime_clear_cache(me);
484
485   CustomData_free(&me->vdata, me->totvert);
486   CustomData_free(&me->edata, me->totedge);
487   CustomData_free(&me->fdata, me->totface);
488   CustomData_free(&me->ldata, me->totloop);
489   CustomData_free(&me->pdata, me->totpoly);
490
491   MEM_SAFE_FREE(me->mat);
492   MEM_SAFE_FREE(me->bb);
493   MEM_SAFE_FREE(me->mselect);
494   MEM_SAFE_FREE(me->edit_mesh);
495 }
496
497 static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata)
498 {
499   if (free_customdata) {
500     CustomData_free(&mesh->fdata, mesh->totface);
501   }
502   else {
503     CustomData_reset(&mesh->fdata);
504   }
505
506   mesh->mface = NULL;
507   mesh->mtface = NULL;
508   mesh->mcol = NULL;
509   mesh->totface = 0;
510 }
511
512 void BKE_mesh_init(Mesh *me)
513 {
514   BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(me, id));
515
516   me->size[0] = me->size[1] = me->size[2] = 1.0;
517   me->smoothresh = DEG2RADF(30);
518   me->texflag = ME_AUTOSPACE;
519
520   CustomData_reset(&me->vdata);
521   CustomData_reset(&me->edata);
522   CustomData_reset(&me->fdata);
523   CustomData_reset(&me->pdata);
524   CustomData_reset(&me->ldata);
525 }
526
527 Mesh *BKE_mesh_add(Main *bmain, const char *name)
528 {
529   Mesh *me;
530
531   me = BKE_libblock_alloc(bmain, ID_ME, name, 0);
532
533   BKE_mesh_init(me);
534
535   return me;
536 }
537
538 /**
539  * Only copy internal data of Mesh ID from source to already allocated/initialized destination.
540  * You probably never want to use that directly, use BKE_id_copy or BKE_id_copy_ex for typical needs.
541  *
542  * WARNING! This function will not handle ID user count!
543  *
544  * \param flag: Copying options (see BKE_library.h's LIB_ID_COPY_... flags for more).
545  */
546 void BKE_mesh_copy_data(Main *bmain, Mesh *me_dst, const Mesh *me_src, const int flag)
547 {
548   BKE_mesh_runtime_reset_on_copy(me_dst, flag);
549   if ((me_src->id.tag & LIB_TAG_NO_MAIN) == 0) {
550     /* This is a direct copy of a main mesh, so for now it has the same topology. */
551     me_dst->runtime.deformed_only = true;
552   }
553   /* XXX WHAT? Why? Comment, please! And pretty sure this is not valid for regular Mesh copying? */
554   me_dst->runtime.is_original = false;
555
556   const bool do_tessface = ((me_src->totface != 0) &&
557                             (me_src->totpoly == 0)); /* only do tessface if we have no polys */
558   CustomData_MeshMasks mask = CD_MASK_MESH;
559
560   if (me_src->id.tag & LIB_TAG_NO_MAIN) {
561     /* For copies in depsgraph, keep data like origindex and orco. */
562     CustomData_MeshMasks_update(&mask, &CD_MASK_DERIVEDMESH);
563   }
564
565   me_dst->mat = MEM_dupallocN(me_src->mat);
566
567   const eCDAllocType alloc_type = (flag & LIB_ID_COPY_CD_REFERENCE) ? CD_REFERENCE : CD_DUPLICATE;
568   CustomData_copy(&me_src->vdata, &me_dst->vdata, mask.vmask, alloc_type, me_dst->totvert);
569   CustomData_copy(&me_src->edata, &me_dst->edata, mask.emask, alloc_type, me_dst->totedge);
570   CustomData_copy(&me_src->ldata, &me_dst->ldata, mask.lmask, alloc_type, me_dst->totloop);
571   CustomData_copy(&me_src->pdata, &me_dst->pdata, mask.pmask, alloc_type, me_dst->totpoly);
572   if (do_tessface) {
573     CustomData_copy(&me_src->fdata, &me_dst->fdata, mask.fmask, alloc_type, me_dst->totface);
574   }
575   else {
576     mesh_tessface_clear_intern(me_dst, false);
577   }
578
579   BKE_mesh_update_customdata_pointers(me_dst, do_tessface);
580
581   me_dst->edit_mesh = NULL;
582
583   me_dst->mselect = MEM_dupallocN(me_dst->mselect);
584   me_dst->bb = MEM_dupallocN(me_dst->bb);
585
586   /* TODO Do we want to add flag to prevent this? */
587   if (me_src->key && (flag & LIB_ID_COPY_SHAPEKEY)) {
588     BKE_id_copy_ex(bmain, &me_src->key->id, (ID **)&me_dst->key, flag);
589   }
590 }
591
592 /* Custom data layer functions; those assume that totXXX are set correctly. */
593 static void mesh_ensure_cdlayers_primary(Mesh *mesh, bool do_tessface)
594 {
595   if (!CustomData_get_layer(&mesh->vdata, CD_MVERT)) {
596     CustomData_add_layer(&mesh->vdata, CD_MVERT, CD_CALLOC, NULL, mesh->totvert);
597   }
598   if (!CustomData_get_layer(&mesh->edata, CD_MEDGE)) {
599     CustomData_add_layer(&mesh->edata, CD_MEDGE, CD_CALLOC, NULL, mesh->totedge);
600   }
601   if (!CustomData_get_layer(&mesh->ldata, CD_MLOOP)) {
602     CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_CALLOC, NULL, mesh->totloop);
603   }
604   if (!CustomData_get_layer(&mesh->pdata, CD_MPOLY)) {
605     CustomData_add_layer(&mesh->pdata, CD_MPOLY, CD_CALLOC, NULL, mesh->totpoly);
606   }
607
608   if (do_tessface && !CustomData_get_layer(&mesh->fdata, CD_MFACE)) {
609     CustomData_add_layer(&mesh->fdata, CD_MFACE, CD_CALLOC, NULL, mesh->totface);
610   }
611 }
612
613 Mesh *BKE_mesh_new_nomain(
614     int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
615 {
616   Mesh *mesh = BKE_libblock_alloc(NULL, ID_ME, BKE_idcode_to_name(ID_ME), LIB_ID_COPY_LOCALIZE);
617   BKE_libblock_init_empty(&mesh->id);
618
619   /* don't use CustomData_reset(...); because we dont want to touch customdata */
620   copy_vn_i(mesh->vdata.typemap, CD_NUMTYPES, -1);
621   copy_vn_i(mesh->edata.typemap, CD_NUMTYPES, -1);
622   copy_vn_i(mesh->fdata.typemap, CD_NUMTYPES, -1);
623   copy_vn_i(mesh->ldata.typemap, CD_NUMTYPES, -1);
624   copy_vn_i(mesh->pdata.typemap, CD_NUMTYPES, -1);
625
626   mesh->totvert = verts_len;
627   mesh->totedge = edges_len;
628   mesh->totface = tessface_len;
629   mesh->totloop = loops_len;
630   mesh->totpoly = polys_len;
631
632   mesh_ensure_cdlayers_primary(mesh, true);
633   BKE_mesh_update_customdata_pointers(mesh, false);
634
635   return mesh;
636 }
637
638 static Mesh *mesh_new_nomain_from_template_ex(const Mesh *me_src,
639                                               int verts_len,
640                                               int edges_len,
641                                               int tessface_len,
642                                               int loops_len,
643                                               int polys_len,
644                                               CustomData_MeshMasks mask)
645 {
646   /* Only do tessface if we are creating tessfaces or copying from mesh with only tessfaces. */
647   const bool do_tessface = (tessface_len || ((me_src->totface != 0) && (me_src->totpoly == 0)));
648
649   Mesh *me_dst = BKE_id_new_nomain(ID_ME, NULL);
650
651   me_dst->mat = MEM_dupallocN(me_src->mat);
652   me_dst->mselect = MEM_dupallocN(me_dst->mselect);
653
654   me_dst->totvert = verts_len;
655   me_dst->totedge = edges_len;
656   me_dst->totface = tessface_len;
657   me_dst->totloop = loops_len;
658   me_dst->totpoly = polys_len;
659
660   me_dst->cd_flag = me_src->cd_flag;
661   me_dst->editflag = me_src->editflag;
662
663   CustomData_copy(&me_src->vdata, &me_dst->vdata, mask.vmask, CD_CALLOC, verts_len);
664   CustomData_copy(&me_src->edata, &me_dst->edata, mask.emask, CD_CALLOC, edges_len);
665   CustomData_copy(&me_src->ldata, &me_dst->ldata, mask.lmask, CD_CALLOC, loops_len);
666   CustomData_copy(&me_src->pdata, &me_dst->pdata, mask.pmask, CD_CALLOC, polys_len);
667   if (do_tessface) {
668     CustomData_copy(&me_src->fdata, &me_dst->fdata, mask.fmask, CD_CALLOC, tessface_len);
669   }
670   else {
671     mesh_tessface_clear_intern(me_dst, false);
672   }
673
674   /* The destination mesh should at least have valid primary CD layers,
675    * even in cases where the source mesh does not. */
676   mesh_ensure_cdlayers_primary(me_dst, do_tessface);
677   BKE_mesh_update_customdata_pointers(me_dst, false);
678
679   return me_dst;
680 }
681
682 Mesh *BKE_mesh_new_nomain_from_template(const Mesh *me_src,
683                                         int verts_len,
684                                         int edges_len,
685                                         int tessface_len,
686                                         int loops_len,
687                                         int polys_len)
688 {
689   return mesh_new_nomain_from_template_ex(
690       me_src, verts_len, edges_len, tessface_len, loops_len, polys_len, CD_MASK_EVERYTHING);
691 }
692
693 Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference)
694 {
695   int flags = LIB_ID_COPY_LOCALIZE;
696
697   if (reference) {
698     flags |= LIB_ID_COPY_CD_REFERENCE;
699   }
700
701   Mesh *result;
702   BKE_id_copy_ex(NULL, &source->id, (ID **)&result, flags);
703   return result;
704 }
705
706 Mesh *BKE_mesh_copy(Main *bmain, const Mesh *me)
707 {
708   Mesh *me_copy;
709   BKE_id_copy(bmain, &me->id, (ID **)&me_copy);
710   return me_copy;
711 }
712
713 BMesh *BKE_mesh_to_bmesh_ex(const Mesh *me,
714                             const struct BMeshCreateParams *create_params,
715                             const struct BMeshFromMeshParams *convert_params)
716 {
717   BMesh *bm;
718   const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(me);
719
720   bm = BM_mesh_create(&allocsize, create_params);
721   BM_mesh_bm_from_me(bm, me, convert_params);
722
723   return bm;
724 }
725
726 BMesh *BKE_mesh_to_bmesh(Mesh *me,
727                          Object *ob,
728                          const bool add_key_index,
729                          const struct BMeshCreateParams *params)
730 {
731   return BKE_mesh_to_bmesh_ex(me,
732                               params,
733                               &(struct BMeshFromMeshParams){
734                                   .calc_face_normal = false,
735                                   .add_key_index = add_key_index,
736                                   .use_shapekey = true,
737                                   .active_shapekey = ob->shapenr,
738                               });
739 }
740
741 Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params)
742 {
743   BLI_assert(params->calc_object_remap == false);
744   Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
745   BM_mesh_bm_to_me(NULL, bm, mesh, params);
746   return mesh;
747 }
748
749 Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra)
750 {
751   Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
752   BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra);
753   return mesh;
754 }
755
756 /**
757  * TODO(campbell): support mesh with only an edit-mesh which is lazy initialized.
758  */
759 Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(BMEditMesh *em,
760                                                    const CustomData_MeshMasks *data_mask,
761                                                    float (*vertexCos)[3])
762 {
763   Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask);
764   /* Use editmesh directly where possible. */
765   me->runtime.is_original = true;
766   if (vertexCos) {
767     /* We will own this array in the future. */
768     BKE_mesh_apply_vert_coords(me, vertexCos);
769     MEM_freeN(vertexCos);
770     me->runtime.is_original = false;
771   }
772   return me;
773 }
774
775 void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local)
776 {
777   BKE_id_make_local_generic(bmain, &me->id, true, lib_local);
778 }
779
780 bool BKE_mesh_uv_cdlayer_rename_index(Mesh *me,
781                                       const int loop_index,
782                                       const int face_index,
783                                       const char *new_name,
784                                       const bool do_tessface)
785 {
786   CustomData *ldata, *fdata;
787   CustomDataLayer *cdlu, *cdlf;
788
789   if (me->edit_mesh) {
790     ldata = &me->edit_mesh->bm->ldata;
791     fdata = NULL; /* No tessellated data in BMesh! */
792   }
793   else {
794     ldata = &me->ldata;
795     fdata = &me->fdata;
796   }
797
798   cdlu = &ldata->layers[loop_index];
799   cdlf = (face_index != -1) && fdata && do_tessface ? &fdata->layers[face_index] : NULL;
800
801   if (cdlu->name != new_name) {
802     /* Mesh validate passes a name from the CD layer as the new name,
803      * Avoid memcpy from self to self in this case.
804      */
805     BLI_strncpy(cdlu->name, new_name, sizeof(cdlu->name));
806     CustomData_set_layer_unique_name(ldata, loop_index);
807   }
808
809   if (cdlf == NULL) {
810     return false;
811   }
812
813   BLI_strncpy(cdlf->name, cdlu->name, sizeof(cdlf->name));
814   CustomData_set_layer_unique_name(fdata, face_index);
815
816   return true;
817 }
818
819 bool BKE_mesh_uv_cdlayer_rename(Mesh *me,
820                                 const char *old_name,
821                                 const char *new_name,
822                                 bool do_tessface)
823 {
824   CustomData *ldata, *fdata;
825   if (me->edit_mesh) {
826     ldata = &me->edit_mesh->bm->ldata;
827     /* No tessellated data in BMesh! */
828     fdata = NULL;
829     do_tessface = false;
830   }
831   else {
832     ldata = &me->ldata;
833     fdata = &me->fdata;
834     do_tessface = (do_tessface && fdata->totlayer);
835   }
836
837   {
838     const int lidx_start = CustomData_get_layer_index(ldata, CD_MLOOPUV);
839     const int fidx_start = do_tessface ? CustomData_get_layer_index(fdata, CD_MTFACE) : -1;
840     int lidx = CustomData_get_named_layer(ldata, CD_MLOOPUV, old_name);
841     int fidx = do_tessface ? CustomData_get_named_layer(fdata, CD_MTFACE, old_name) : -1;
842
843     /* None of those cases should happen, in theory!
844      * Note this assume we have the same number of mtexpoly, mloopuv and mtface layers!
845      */
846     if (lidx == -1) {
847       if (fidx == -1) {
848         /* No layer found with this name! */
849         return false;
850       }
851       else {
852         lidx = fidx;
853       }
854     }
855
856     /* Go back to absolute indices! */
857     lidx += lidx_start;
858     if (fidx != -1) {
859       fidx += fidx_start;
860     }
861
862     return BKE_mesh_uv_cdlayer_rename_index(me, lidx, fidx, new_name, do_tessface);
863   }
864 }
865
866 void BKE_mesh_boundbox_calc(Mesh *me, float r_loc[3], float r_size[3])
867 {
868   BoundBox *bb;
869   float min[3], max[3];
870   float mloc[3], msize[3];
871
872   if (me->bb == NULL) {
873     me->bb = MEM_callocN(sizeof(BoundBox), "boundbox");
874   }
875   bb = me->bb;
876
877   if (!r_loc) {
878     r_loc = mloc;
879   }
880   if (!r_size) {
881     r_size = msize;
882   }
883
884   INIT_MINMAX(min, max);
885   if (!BKE_mesh_minmax(me, min, max)) {
886     min[0] = min[1] = min[2] = -1.0f;
887     max[0] = max[1] = max[2] = 1.0f;
888   }
889
890   mid_v3_v3v3(r_loc, min, max);
891
892   r_size[0] = (max[0] - min[0]) / 2.0f;
893   r_size[1] = (max[1] - min[1]) / 2.0f;
894   r_size[2] = (max[2] - min[2]) / 2.0f;
895
896   BKE_boundbox_init_from_minmax(bb, min, max);
897
898   bb->flag &= ~BOUNDBOX_DIRTY;
899 }
900
901 void BKE_mesh_texspace_calc(Mesh *me)
902 {
903   float loc[3], size[3];
904   int a;
905
906   BKE_mesh_boundbox_calc(me, loc, size);
907
908   if (me->texflag & ME_AUTOSPACE) {
909     for (a = 0; a < 3; a++) {
910       if (size[a] == 0.0f) {
911         size[a] = 1.0f;
912       }
913       else if (size[a] > 0.0f && size[a] < 0.00001f) {
914         size[a] = 0.00001f;
915       }
916       else if (size[a] < 0.0f && size[a] > -0.00001f) {
917         size[a] = -0.00001f;
918       }
919     }
920
921     copy_v3_v3(me->loc, loc);
922     copy_v3_v3(me->size, size);
923     zero_v3(me->rot);
924   }
925 }
926
927 BoundBox *BKE_mesh_boundbox_get(Object *ob)
928 {
929   /* This is Object-level data access, DO NOT touch to Mesh's bb, would be totally thread-unsafe. */
930   if (ob->runtime.bb == NULL || ob->runtime.bb->flag & BOUNDBOX_DIRTY) {
931     Mesh *me = ob->data;
932     float min[3], max[3];
933
934     INIT_MINMAX(min, max);
935     if (!BKE_mesh_minmax(me, min, max)) {
936       min[0] = min[1] = min[2] = -1.0f;
937       max[0] = max[1] = max[2] = 1.0f;
938     }
939
940     if (ob->runtime.bb == NULL) {
941       ob->runtime.bb = MEM_mallocN(sizeof(*ob->runtime.bb), __func__);
942     }
943     BKE_boundbox_init_from_minmax(ob->runtime.bb, min, max);
944     ob->runtime.bb->flag &= ~BOUNDBOX_DIRTY;
945   }
946
947   return ob->runtime.bb;
948 }
949
950 BoundBox *BKE_mesh_texspace_get(Mesh *me, float r_loc[3], float r_rot[3], float r_size[3])
951 {
952   if (me->bb == NULL || (me->bb->flag & BOUNDBOX_DIRTY)) {
953     BKE_mesh_texspace_calc(me);
954   }
955
956   if (r_loc) {
957     copy_v3_v3(r_loc, me->loc);
958   }
959   if (r_rot) {
960     copy_v3_v3(r_rot, me->rot);
961   }
962   if (r_size) {
963     copy_v3_v3(r_size, me->size);
964   }
965
966   return me->bb;
967 }
968
969 void BKE_mesh_texspace_get_reference(
970     Mesh *me, short **r_texflag, float **r_loc, float **r_rot, float **r_size)
971 {
972   if (me->bb == NULL || (me->bb->flag & BOUNDBOX_DIRTY)) {
973     BKE_mesh_texspace_calc(me);
974   }
975
976   if (r_texflag != NULL) {
977     *r_texflag = &me->texflag;
978   }
979   if (r_loc != NULL) {
980     *r_loc = me->loc;
981   }
982   if (r_rot != NULL) {
983     *r_rot = me->rot;
984   }
985   if (r_size != NULL) {
986     *r_size = me->size;
987   }
988 }
989
990 void BKE_mesh_texspace_copy_from_object(Mesh *me, Object *ob)
991 {
992   float *texloc, *texrot, *texsize;
993   short *texflag;
994
995   if (BKE_object_obdata_texspace_get(ob, &texflag, &texloc, &texsize, &texrot)) {
996     me->texflag = *texflag;
997     copy_v3_v3(me->loc, texloc);
998     copy_v3_v3(me->size, texsize);
999     copy_v3_v3(me->rot, texrot);
1000   }
1001 }
1002
1003 float (*BKE_mesh_orco_verts_get(Object *ob))[3]
1004 {
1005   Mesh *me = ob->data;
1006   MVert *mvert = NULL;
1007   Mesh *tme = me->texcomesh ? me->texcomesh : me;
1008   int a, totvert;
1009   float(*vcos)[3] = NULL;
1010
1011   /* Get appropriate vertex coordinates */
1012   vcos = MEM_calloc_arrayN(me->totvert, sizeof(*vcos), "orco mesh");
1013   mvert = tme->mvert;
1014   totvert = min_ii(tme->totvert, me->totvert);
1015
1016   for (a = 0; a < totvert; a++, mvert++) {
1017     copy_v3_v3(vcos[a], mvert->co);
1018   }
1019
1020   return vcos;
1021 }
1022
1023 void BKE_mesh_orco_verts_transform(Mesh *me, float (*orco)[3], int totvert, int invert)
1024 {
1025   float loc[3], size[3];
1026   int a;
1027
1028   BKE_mesh_texspace_get(me->texcomesh ? me->texcomesh : me, loc, NULL, size);
1029
1030   if (invert) {
1031     for (a = 0; a < totvert; a++) {
1032       float *co = orco[a];
1033       madd_v3_v3v3v3(co, loc, co, size);
1034     }
1035   }
1036   else {
1037     for (a = 0; a < totvert; a++) {
1038       float *co = orco[a];
1039       co[0] = (co[0] - loc[0]) / size[0];
1040       co[1] = (co[1] - loc[1]) / size[1];
1041       co[2] = (co[2] - loc[2]) / size[2];
1042     }
1043   }
1044 }
1045
1046 /* rotates the vertices of a face in case v[2] or v[3] (vertex index) is = 0.
1047  * this is necessary to make the if (mface->v4) check for quads work */
1048 int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
1049 {
1050   /* first test if the face is legal */
1051   if ((mface->v3 || nr == 4) && mface->v3 == mface->v4) {
1052     mface->v4 = 0;
1053     nr--;
1054   }
1055   if ((mface->v2 || mface->v4) && mface->v2 == mface->v3) {
1056     mface->v3 = mface->v4;
1057     mface->v4 = 0;
1058     nr--;
1059   }
1060   if (mface->v1 == mface->v2) {
1061     mface->v2 = mface->v3;
1062     mface->v3 = mface->v4;
1063     mface->v4 = 0;
1064     nr--;
1065   }
1066
1067   /* check corrupt cases, bow-tie geometry, cant handle these because edge data wont exist so just return 0 */
1068   if (nr == 3) {
1069     if (
1070         /* real edges */
1071         mface->v1 == mface->v2 || mface->v2 == mface->v3 || mface->v3 == mface->v1) {
1072       return 0;
1073     }
1074   }
1075   else if (nr == 4) {
1076     if (
1077         /* real edges */
1078         mface->v1 == mface->v2 || mface->v2 == mface->v3 || mface->v3 == mface->v4 ||
1079         mface->v4 == mface->v1 ||
1080         /* across the face */
1081         mface->v1 == mface->v3 || mface->v2 == mface->v4) {
1082       return 0;
1083     }
1084   }
1085
1086   /* prevent a zero at wrong index location */
1087   if (nr == 3) {
1088     if (mface->v3 == 0) {
1089       static int corner_indices[4] = {1, 2, 0, 3};
1090
1091       SWAP(unsigned int, mface->v1, mface->v2);
1092       SWAP(unsigned int, mface->v2, mface->v3);
1093
1094       if (fdata) {
1095         CustomData_swap_corners(fdata, mfindex, corner_indices);
1096       }
1097     }
1098   }
1099   else if (nr == 4) {
1100     if (mface->v3 == 0 || mface->v4 == 0) {
1101       static int corner_indices[4] = {2, 3, 0, 1};
1102
1103       SWAP(unsigned int, mface->v1, mface->v3);
1104       SWAP(unsigned int, mface->v2, mface->v4);
1105
1106       if (fdata) {
1107         CustomData_swap_corners(fdata, mfindex, corner_indices);
1108       }
1109     }
1110   }
1111
1112   return nr;
1113 }
1114
1115 Mesh *BKE_mesh_from_object(Object *ob)
1116 {
1117
1118   if (ob == NULL) {
1119     return NULL;
1120   }
1121   if (ob->type == OB_MESH) {
1122     return ob->data;
1123   }
1124   else {
1125     return NULL;
1126   }
1127 }
1128
1129 void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *me)
1130 {
1131   Mesh *old = NULL;
1132
1133   multires_force_update(ob);
1134
1135   if (ob == NULL) {
1136     return;
1137   }
1138
1139   if (ob->type == OB_MESH) {
1140     old = ob->data;
1141     if (old) {
1142       id_us_min(&old->id);
1143     }
1144     ob->data = me;
1145     id_us_plus((ID *)me);
1146   }
1147
1148   test_object_materials(bmain, ob, (ID *)me);
1149
1150   test_object_modifiers(ob);
1151 }
1152
1153 void BKE_mesh_material_index_remove(Mesh *me, short index)
1154 {
1155   MPoly *mp;
1156   MFace *mf;
1157   int i;
1158
1159   for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) {
1160     if (mp->mat_nr && mp->mat_nr >= index) {
1161       mp->mat_nr--;
1162     }
1163   }
1164
1165   for (mf = me->mface, i = 0; i < me->totface; i++, mf++) {
1166     if (mf->mat_nr && mf->mat_nr >= index) {
1167       mf->mat_nr--;
1168     }
1169   }
1170 }
1171
1172 void BKE_mesh_material_index_clear(Mesh *me)
1173 {
1174   MPoly *mp;
1175   MFace *mf;
1176   int i;
1177
1178   for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) {
1179     mp->mat_nr = 0;
1180   }
1181
1182   for (mf = me->mface, i = 0; i < me->totface; i++, mf++) {
1183     mf->mat_nr = 0;
1184   }
1185 }
1186
1187 void BKE_mesh_material_remap(Mesh *me, const unsigned int *remap, unsigned int remap_len)
1188 {
1189   const short remap_len_short = (short)remap_len;
1190
1191 #define MAT_NR_REMAP(n) \
1192   if (n < remap_len_short) { \
1193     BLI_assert(n >= 0 && remap[n] < remap_len_short); \
1194     n = remap[n]; \
1195   } \
1196   ((void)0)
1197
1198   if (me->edit_mesh) {
1199     BMEditMesh *em = me->edit_mesh;
1200     BMIter iter;
1201     BMFace *efa;
1202
1203     BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
1204       MAT_NR_REMAP(efa->mat_nr);
1205     }
1206   }
1207   else {
1208     int i;
1209     for (i = 0; i < me->totpoly; i++) {
1210       MAT_NR_REMAP(me->mpoly[i].mat_nr);
1211     }
1212   }
1213
1214 #undef MAT_NR_REMAP
1215 }
1216
1217 void BKE_mesh_smooth_flag_set(Object *meshOb, int enableSmooth)
1218 {
1219   Mesh *me = meshOb->data;
1220   int i;
1221
1222   for (i = 0; i < me->totpoly; i++) {
1223     MPoly *mp = &me->mpoly[i];
1224
1225     if (enableSmooth) {
1226       mp->flag |= ME_SMOOTH;
1227     }
1228     else {
1229       mp->flag &= ~ME_SMOOTH;
1230     }
1231   }
1232
1233   for (i = 0; i < me->totface; i++) {
1234     MFace *mf = &me->mface[i];
1235
1236     if (enableSmooth) {
1237       mf->flag |= ME_SMOOTH;
1238     }
1239     else {
1240       mf->flag &= ~ME_SMOOTH;
1241     }
1242   }
1243 }
1244
1245 /**
1246  * Return a newly MEM_malloc'd array of all the mesh vertex locations
1247  * \note \a r_verts_len may be NULL
1248  */
1249 float (*BKE_mesh_vertexCos_get(const Mesh *me, int *r_verts_len))[3]
1250 {
1251   int i, verts_len = me->totvert;
1252   float(*cos)[3] = MEM_malloc_arrayN(verts_len, sizeof(*cos), "vertexcos1");
1253
1254   if (r_verts_len) {
1255     *r_verts_len = verts_len;
1256   }
1257   for (i = 0; i < verts_len; i++) {
1258     copy_v3_v3(cos[i], me->mvert[i].co);
1259   }
1260
1261   return cos;
1262 }
1263
1264 /**
1265  * Find the index of the loop in 'poly' which references vertex,
1266  * returns -1 if not found
1267  */
1268 int poly_find_loop_from_vert(const MPoly *poly, const MLoop *loopstart, unsigned vert)
1269 {
1270   int j;
1271   for (j = 0; j < poly->totloop; j++, loopstart++) {
1272     if (loopstart->v == vert) {
1273       return j;
1274     }
1275   }
1276
1277   return -1;
1278 }
1279
1280 /**
1281  * Fill \a r_adj with the loop indices in \a poly adjacent to the
1282  * vertex. Returns the index of the loop matching vertex, or -1 if the
1283  * vertex is not in \a poly
1284  */
1285 int poly_get_adj_loops_from_vert(const MPoly *poly,
1286                                  const MLoop *mloop,
1287                                  unsigned int vert,
1288                                  unsigned int r_adj[2])
1289 {
1290   int corner = poly_find_loop_from_vert(poly, &mloop[poly->loopstart], vert);
1291
1292   if (corner != -1) {
1293     /* vertex was found */
1294     r_adj[0] = ME_POLY_LOOP_PREV(mloop, poly, corner)->v;
1295     r_adj[1] = ME_POLY_LOOP_NEXT(mloop, poly, corner)->v;
1296   }
1297
1298   return corner;
1299 }
1300
1301 /**
1302  * Return the index of the edge vert that is not equal to \a v. If
1303  * neither edge vertex is equal to \a v, returns -1.
1304  */
1305 int BKE_mesh_edge_other_vert(const MEdge *e, int v)
1306 {
1307   if (e->v1 == v) {
1308     return e->v2;
1309   }
1310   else if (e->v2 == v) {
1311     return e->v1;
1312   }
1313   else {
1314     return -1;
1315   }
1316 }
1317
1318 /**
1319  * Sets each output array element to the edge index if it is a real edge, or -1.
1320  */
1321 void BKE_mesh_looptri_get_real_edges(const Mesh *mesh, const MLoopTri *looptri, int r_edges[3])
1322 {
1323   for (int i = 2, i_next = 0; i_next < 3; i = i_next++) {
1324     const MLoop *l1 = &mesh->mloop[looptri->tri[i]], *l2 = &mesh->mloop[looptri->tri[i_next]];
1325     const MEdge *e = &mesh->medge[l1->e];
1326
1327     bool is_real = (l1->v == e->v1 && l2->v == e->v2) || (l1->v == e->v2 && l2->v == e->v1);
1328
1329     r_edges[i] = is_real ? l1->e : -1;
1330   }
1331 }
1332
1333 /* basic vertex data functions */
1334 bool BKE_mesh_minmax(const Mesh *me, float r_min[3], float r_max[3])
1335 {
1336   int i = me->totvert;
1337   MVert *mvert;
1338   for (mvert = me->mvert; i--; mvert++) {
1339     minmax_v3v3_v3(r_min, r_max, mvert->co);
1340   }
1341
1342   return (me->totvert != 0);
1343 }
1344
1345 void BKE_mesh_transform(Mesh *me, float mat[4][4], bool do_keys)
1346 {
1347   int i;
1348   MVert *mvert = me->mvert;
1349   float(*lnors)[3] = CustomData_get_layer(&me->ldata, CD_NORMAL);
1350
1351   for (i = 0; i < me->totvert; i++, mvert++) {
1352     mul_m4_v3(mat, mvert->co);
1353   }
1354
1355   if (do_keys && me->key) {
1356     KeyBlock *kb;
1357     for (kb = me->key->block.first; kb; kb = kb->next) {
1358       float *fp = kb->data;
1359       for (i = kb->totelem; i--; fp += 3) {
1360         mul_m4_v3(mat, fp);
1361       }
1362     }
1363   }
1364
1365   /* don't update normals, caller can do this explicitly.
1366    * We do update loop normals though, those may not be auto-generated (see e.g. STL import script)! */
1367   if (lnors) {
1368     float m3[3][3];
1369
1370     copy_m3_m4(m3, mat);
1371     normalize_m3(m3);
1372     for (i = 0; i < me->totloop; i++, lnors++) {
1373       mul_m3_v3(m3, *lnors);
1374     }
1375   }
1376 }
1377
1378 void BKE_mesh_translate(Mesh *me, const float offset[3], const bool do_keys)
1379 {
1380   int i = me->totvert;
1381   MVert *mvert;
1382   for (mvert = me->mvert; i--; mvert++) {
1383     add_v3_v3(mvert->co, offset);
1384   }
1385
1386   if (do_keys && me->key) {
1387     KeyBlock *kb;
1388     for (kb = me->key->block.first; kb; kb = kb->next) {
1389       float *fp = kb->data;
1390       for (i = kb->totelem; i--; fp += 3) {
1391         add_v3_v3(fp, offset);
1392       }
1393     }
1394   }
1395 }
1396
1397 void BKE_mesh_ensure_navmesh(Mesh *me)
1398 {
1399   if (!CustomData_has_layer(&me->pdata, CD_RECAST)) {
1400     int i;
1401     int polys_len = me->totpoly;
1402     int *recastData;
1403     recastData = (int *)MEM_malloc_arrayN(polys_len, sizeof(int), __func__);
1404     for (i = 0; i < polys_len; i++) {
1405       recastData[i] = i + 1;
1406     }
1407     CustomData_add_layer_named(
1408         &me->pdata, CD_RECAST, CD_ASSIGN, recastData, polys_len, "recastData");
1409   }
1410 }
1411
1412 void BKE_mesh_tessface_calc(Mesh *mesh)
1413 {
1414   mesh->totface = BKE_mesh_recalc_tessellation(
1415       &mesh->fdata,
1416       &mesh->ldata,
1417       &mesh->pdata,
1418       mesh->mvert,
1419       mesh->totface,
1420       mesh->totloop,
1421       mesh->totpoly,
1422       /* calc normals right after, don't copy from polys here */
1423       false);
1424
1425   BKE_mesh_update_customdata_pointers(mesh, true);
1426 }
1427
1428 void BKE_mesh_tessface_ensure(Mesh *mesh)
1429 {
1430   if (mesh->totpoly && mesh->totface == 0) {
1431     BKE_mesh_tessface_calc(mesh);
1432   }
1433 }
1434
1435 void BKE_mesh_tessface_clear(Mesh *mesh)
1436 {
1437   mesh_tessface_clear_intern(mesh, true);
1438 }
1439
1440 void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh)
1441 {
1442   if (UNLIKELY(mesh->cd_flag)) {
1443     return;
1444   }
1445   else {
1446     MVert *mv;
1447     MEdge *med;
1448     int i;
1449
1450     for (mv = mesh->mvert, i = 0; i < mesh->totvert; mv++, i++) {
1451       if (mv->bweight != 0) {
1452         mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
1453         break;
1454       }
1455     }
1456
1457     for (med = mesh->medge, i = 0; i < mesh->totedge; med++, i++) {
1458       if (med->bweight != 0) {
1459         mesh->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
1460         if (mesh->cd_flag & ME_CDFLAG_EDGE_CREASE) {
1461           break;
1462         }
1463       }
1464       if (med->crease != 0) {
1465         mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE;
1466         if (mesh->cd_flag & ME_CDFLAG_EDGE_BWEIGHT) {
1467           break;
1468         }
1469       }
1470     }
1471   }
1472 }
1473
1474 /* -------------------------------------------------------------------- */
1475 /* MSelect functions (currently used in weight paint mode) */
1476
1477 void BKE_mesh_mselect_clear(Mesh *me)
1478 {
1479   if (me->mselect) {
1480     MEM_freeN(me->mselect);
1481     me->mselect = NULL;
1482   }
1483   me->totselect = 0;
1484 }
1485
1486 void BKE_mesh_mselect_validate(Mesh *me)
1487 {
1488   MSelect *mselect_src, *mselect_dst;
1489   int i_src, i_dst;
1490
1491   if (me->totselect == 0) {
1492     return;
1493   }
1494
1495   mselect_src = me->mselect;
1496   mselect_dst = MEM_malloc_arrayN((me->totselect), sizeof(MSelect), "Mesh selection history");
1497
1498   for (i_src = 0, i_dst = 0; i_src < me->totselect; i_src++) {
1499     int index = mselect_src[i_src].index;
1500     switch (mselect_src[i_src].type) {
1501       case ME_VSEL: {
1502         if (me->mvert[index].flag & SELECT) {
1503           mselect_dst[i_dst] = mselect_src[i_src];
1504           i_dst++;
1505         }
1506         break;
1507       }
1508       case ME_ESEL: {
1509         if (me->medge[index].flag & SELECT) {
1510           mselect_dst[i_dst] = mselect_src[i_src];
1511           i_dst++;
1512         }
1513         break;
1514       }
1515       case ME_FSEL: {
1516         if (me->mpoly[index].flag & SELECT) {
1517           mselect_dst[i_dst] = mselect_src[i_src];
1518           i_dst++;
1519         }
1520         break;
1521       }
1522       default: {
1523         BLI_assert(0);
1524         break;
1525       }
1526     }
1527   }
1528
1529   MEM_freeN(mselect_src);
1530
1531   if (i_dst == 0) {
1532     MEM_freeN(mselect_dst);
1533     mselect_dst = NULL;
1534   }
1535   else if (i_dst != me->totselect) {
1536     mselect_dst = MEM_reallocN(mselect_dst, sizeof(MSelect) * i_dst);
1537   }
1538
1539   me->totselect = i_dst;
1540   me->mselect = mselect_dst;
1541 }
1542
1543 /**
1544  * Return the index within me->mselect, or -1
1545  */
1546 int BKE_mesh_mselect_find(Mesh *me, int index, int type)
1547 {
1548   int i;
1549
1550   BLI_assert(ELEM(type, ME_VSEL, ME_ESEL, ME_FSEL));
1551
1552   for (i = 0; i < me->totselect; i++) {
1553     if ((me->mselect[i].index == index) && (me->mselect[i].type == type)) {
1554       return i;
1555     }
1556   }
1557
1558   return -1;
1559 }
1560
1561 /**
1562  * Return The index of the active element.
1563  */
1564 int BKE_mesh_mselect_active_get(Mesh *me, int type)
1565 {
1566   BLI_assert(ELEM(type, ME_VSEL, ME_ESEL, ME_FSEL));
1567
1568   if (me->totselect) {
1569     if (me->mselect[me->totselect - 1].type == type) {
1570       return me->mselect[me->totselect - 1].index;
1571     }
1572   }
1573   return -1;
1574 }
1575
1576 void BKE_mesh_mselect_active_set(Mesh *me, int index, int type)
1577 {
1578   const int msel_index = BKE_mesh_mselect_find(me, index, type);
1579
1580   if (msel_index == -1) {
1581     /* add to the end */
1582     me->mselect = MEM_reallocN(me->mselect, sizeof(MSelect) * (me->totselect + 1));
1583     me->mselect[me->totselect].index = index;
1584     me->mselect[me->totselect].type = type;
1585     me->totselect++;
1586   }
1587   else if (msel_index != me->totselect - 1) {
1588     /* move to the end */
1589     SWAP(MSelect, me->mselect[msel_index], me->mselect[me->totselect - 1]);
1590   }
1591
1592   BLI_assert((me->mselect[me->totselect - 1].index == index) &&
1593              (me->mselect[me->totselect - 1].type == type));
1594 }
1595
1596 void BKE_mesh_count_selected_items(const Mesh *mesh, int r_count[3])
1597 {
1598   r_count[0] = r_count[1] = r_count[2] = 0;
1599   if (mesh->edit_mesh) {
1600     BMesh *bm = mesh->edit_mesh->bm;
1601     r_count[0] = bm->totvertsel;
1602     r_count[1] = bm->totedgesel;
1603     r_count[2] = bm->totfacesel;
1604   }
1605   /* We could support faces in paint modes. */
1606 }
1607
1608 void BKE_mesh_apply_vert_coords(Mesh *mesh, float (*vertCoords)[3])
1609 {
1610   MVert *vert;
1611   int i;
1612
1613   /* this will just return the pointer if it wasn't a referenced layer */
1614   vert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert);
1615   mesh->mvert = vert;
1616
1617   for (i = 0; i < mesh->totvert; ++i, ++vert) {
1618     copy_v3_v3(vert->co, vertCoords[i]);
1619   }
1620
1621   mesh->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
1622 }
1623
1624 void BKE_mesh_apply_vert_normals(Mesh *mesh, short (*vertNormals)[3])
1625 {
1626   MVert *vert;
1627   int i;
1628
1629   /* this will just return the pointer if it wasn't a referenced layer */
1630   vert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MVERT, mesh->totvert);
1631   mesh->mvert = vert;
1632
1633   for (i = 0; i < mesh->totvert; ++i, ++vert) {
1634     copy_v3_v3_short(vert->no, vertNormals[i]);
1635   }
1636
1637   mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
1638 }
1639
1640 /**
1641  * Compute 'split' (aka loop, or per face corner's) normals.
1642  *
1643  * \param r_lnors_spacearr: Allows to get computed loop normal space array. That data, among other things,
1644  *                         contains 'smooth fan' info, useful e.g. to split geometry along sharp edges...
1645  */
1646 void BKE_mesh_calc_normals_split_ex(Mesh *mesh, MLoopNorSpaceArray *r_lnors_spacearr)
1647 {
1648   float(*r_loopnors)[3];
1649   float(*polynors)[3];
1650   short(*clnors)[2] = NULL;
1651   bool free_polynors = false;
1652
1653   /* Note that we enforce computing clnors when the clnor space array is requested by caller here.
1654    * However, we obviously only use the autosmooth angle threshold only in case autosmooth is enabled. */
1655   const bool use_split_normals = (r_lnors_spacearr != NULL) || ((mesh->flag & ME_AUTOSMOOTH) != 0);
1656   const float split_angle = (mesh->flag & ME_AUTOSMOOTH) != 0 ? mesh->smoothresh : (float)M_PI;
1657
1658   if (CustomData_has_layer(&mesh->ldata, CD_NORMAL)) {
1659     r_loopnors = CustomData_get_layer(&mesh->ldata, CD_NORMAL);
1660     memset(r_loopnors, 0, sizeof(float[3]) * mesh->totloop);
1661   }
1662   else {
1663     r_loopnors = CustomData_add_layer(&mesh->ldata, CD_NORMAL, CD_CALLOC, NULL, mesh->totloop);
1664     CustomData_set_layer_flag(&mesh->ldata, CD_NORMAL, CD_FLAG_TEMPORARY);
1665   }
1666
1667   /* may be NULL */
1668   clnors = CustomData_get_layer(&mesh->ldata, CD_CUSTOMLOOPNORMAL);
1669
1670   if (CustomData_has_layer(&mesh->pdata, CD_NORMAL)) {
1671     /* This assume that layer is always up to date, not sure this is the case (esp. in Edit mode?)... */
1672     polynors = CustomData_get_layer(&mesh->pdata, CD_NORMAL);
1673     free_polynors = false;
1674   }
1675   else {
1676     polynors = MEM_malloc_arrayN(mesh->totpoly, sizeof(float[3]), __func__);
1677     BKE_mesh_calc_normals_poly(mesh->mvert,
1678                                NULL,
1679                                mesh->totvert,
1680                                mesh->mloop,
1681                                mesh->mpoly,
1682                                mesh->totloop,
1683                                mesh->totpoly,
1684                                polynors,
1685                                false);
1686     free_polynors = true;
1687   }
1688
1689   BKE_mesh_normals_loop_split(mesh->mvert,
1690                               mesh->totvert,
1691                               mesh->medge,
1692                               mesh->totedge,
1693                               mesh->mloop,
1694                               r_loopnors,
1695                               mesh->totloop,
1696                               mesh->mpoly,
1697                               (const float(*)[3])polynors,
1698                               mesh->totpoly,
1699                               use_split_normals,
1700                               split_angle,
1701                               r_lnors_spacearr,
1702                               clnors,
1703                               NULL);
1704
1705   if (free_polynors) {
1706     MEM_freeN(polynors);
1707   }
1708
1709   mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
1710 }
1711
1712 void BKE_mesh_calc_normals_split(Mesh *mesh)
1713 {
1714   BKE_mesh_calc_normals_split_ex(mesh, NULL);
1715 }
1716
1717 /* Split faces helper functions. */
1718
1719 typedef struct SplitFaceNewVert {
1720   struct SplitFaceNewVert *next;
1721   int new_index;
1722   int orig_index;
1723   float *vnor;
1724 } SplitFaceNewVert;
1725
1726 typedef struct SplitFaceNewEdge {
1727   struct SplitFaceNewEdge *next;
1728   int new_index;
1729   int orig_index;
1730   int v1;
1731   int v2;
1732 } SplitFaceNewEdge;
1733
1734 /* Detect needed new vertices, and update accordingly loops' vertex indices.
1735  * WARNING! Leaves mesh in invalid state. */
1736 static int split_faces_prepare_new_verts(const Mesh *mesh,
1737                                          MLoopNorSpaceArray *lnors_spacearr,
1738                                          SplitFaceNewVert **new_verts,
1739                                          MemArena *memarena)
1740 {
1741   /* This is now mandatory, trying to do the job in simple way without that data is doomed to fail, even when only
1742    * dealing with smooth/flat faces one can find cases that no simple algorithm can handle properly. */
1743   BLI_assert(lnors_spacearr != NULL);
1744
1745   const int loops_len = mesh->totloop;
1746   int verts_len = mesh->totvert;
1747   MVert *mvert = mesh->mvert;
1748   MLoop *mloop = mesh->mloop;
1749
1750   BLI_bitmap *verts_used = BLI_BITMAP_NEW(verts_len, __func__);
1751   BLI_bitmap *done_loops = BLI_BITMAP_NEW(loops_len, __func__);
1752
1753   MLoop *ml = mloop;
1754   MLoopNorSpace **lnor_space = lnors_spacearr->lspacearr;
1755
1756   BLI_assert(lnors_spacearr->data_type == MLNOR_SPACEARR_LOOP_INDEX);
1757
1758   for (int loop_idx = 0; loop_idx < loops_len; loop_idx++, ml++, lnor_space++) {
1759     if (!BLI_BITMAP_TEST(done_loops, loop_idx)) {
1760       const int vert_idx = ml->v;
1761       const bool vert_used = BLI_BITMAP_TEST_BOOL(verts_used, vert_idx);
1762       /* If vert is already used by another smooth fan, we need a new vert for this one. */
1763       const int new_vert_idx = vert_used ? verts_len++ : vert_idx;
1764
1765       BLI_assert(*lnor_space);
1766
1767       if ((*lnor_space)->flags & MLNOR_SPACE_IS_SINGLE) {
1768         /* Single loop in this fan... */
1769         BLI_assert(POINTER_AS_INT((*lnor_space)->loops) == loop_idx);
1770         BLI_BITMAP_ENABLE(done_loops, loop_idx);
1771         if (vert_used) {
1772           ml->v = new_vert_idx;
1773         }
1774       }
1775       else {
1776         for (LinkNode *lnode = (*lnor_space)->loops; lnode; lnode = lnode->next) {
1777           const int ml_fan_idx = POINTER_AS_INT(lnode->link);
1778           BLI_BITMAP_ENABLE(done_loops, ml_fan_idx);
1779           if (vert_used) {
1780             mloop[ml_fan_idx].v = new_vert_idx;
1781           }
1782         }
1783       }
1784
1785       if (!vert_used) {
1786         BLI_BITMAP_ENABLE(verts_used, vert_idx);
1787         /* We need to update that vertex's normal here, we won't go over it again. */
1788         /* This is important! *DO NOT* set vnor to final computed lnor, vnor should always be defined to
1789          * 'automatic normal' value computed from its polys, not some custom normal.
1790          * Fortunately, that's the loop normal space's 'lnor' reference vector. ;) */
1791         normal_float_to_short_v3(mvert[vert_idx].no, (*lnor_space)->vec_lnor);
1792       }
1793       else {
1794         /* Add new vert to list. */
1795         SplitFaceNewVert *new_vert = BLI_memarena_alloc(memarena, sizeof(*new_vert));
1796         new_vert->orig_index = vert_idx;
1797         new_vert->new_index = new_vert_idx;
1798         new_vert->vnor = (*lnor_space)->vec_lnor; /* See note above. */
1799         new_vert->next = *new_verts;
1800         *new_verts = new_vert;
1801       }
1802     }
1803   }
1804
1805   MEM_freeN(done_loops);
1806   MEM_freeN(verts_used);
1807
1808   return verts_len - mesh->totvert;
1809 }
1810
1811 /* Detect needed new edges, and update accordingly loops' edge indices.
1812  * WARNING! Leaves mesh in invalid state. */
1813 static int split_faces_prepare_new_edges(const Mesh *mesh,
1814                                          SplitFaceNewEdge **new_edges,
1815                                          MemArena *memarena)
1816 {
1817   const int num_polys = mesh->totpoly;
1818   int num_edges = mesh->totedge;
1819   MEdge *medge = mesh->medge;
1820   MLoop *mloop = mesh->mloop;
1821   const MPoly *mpoly = mesh->mpoly;
1822
1823   BLI_bitmap *edges_used = BLI_BITMAP_NEW(num_edges, __func__);
1824   EdgeHash *edges_hash = BLI_edgehash_new_ex(__func__, num_edges);
1825
1826   const MPoly *mp = mpoly;
1827   for (int poly_idx = 0; poly_idx < num_polys; poly_idx++, mp++) {
1828     MLoop *ml_prev = &mloop[mp->loopstart + mp->totloop - 1];
1829     MLoop *ml = &mloop[mp->loopstart];
1830     for (int loop_idx = 0; loop_idx < mp->totloop; loop_idx++, ml++) {
1831       void **eval;
1832       if (!BLI_edgehash_ensure_p(edges_hash, ml_prev->v, ml->v, &eval)) {
1833         const int edge_idx = ml_prev->e;
1834
1835         /* That edge has not been encountered yet, define it. */
1836         if (BLI_BITMAP_TEST(edges_used, edge_idx)) {
1837           /* Original edge has already been used, we need to define a new one. */
1838           const int new_edge_idx = num_edges++;
1839           *eval = POINTER_FROM_INT(new_edge_idx);
1840           ml_prev->e = new_edge_idx;
1841
1842           SplitFaceNewEdge *new_edge = BLI_memarena_alloc(memarena, sizeof(*new_edge));
1843           new_edge->orig_index = edge_idx;
1844           new_edge->new_index = new_edge_idx;
1845           new_edge->v1 = ml_prev->v;
1846           new_edge->v2 = ml->v;
1847           new_edge->next = *new_edges;
1848           *new_edges = new_edge;
1849         }
1850         else {
1851           /* We can re-use original edge. */
1852           medge[edge_idx].v1 = ml_prev->v;
1853           medge[edge_idx].v2 = ml->v;
1854           *eval = POINTER_FROM_INT(edge_idx);
1855           BLI_BITMAP_ENABLE(edges_used, edge_idx);
1856         }
1857       }
1858       else {
1859         /* Edge already known, just update loop's edge index. */
1860         ml_prev->e = POINTER_AS_INT(*eval);
1861       }
1862
1863       ml_prev = ml;
1864     }
1865   }
1866
1867   MEM_freeN(edges_used);
1868   BLI_edgehash_free(edges_hash, NULL);
1869
1870   return num_edges - mesh->totedge;
1871 }
1872
1873 /* Perform actual split of vertices. */
1874 static void split_faces_split_new_verts(Mesh *mesh,
1875                                         SplitFaceNewVert *new_verts,
1876                                         const int num_new_verts)
1877 {
1878   const int verts_len = mesh->totvert - num_new_verts;
1879   MVert *mvert = mesh->mvert;
1880
1881   /* Remember new_verts is a single linklist, so its items are in reversed order... */
1882   MVert *new_mv = &mvert[mesh->totvert - 1];
1883   for (int i = mesh->totvert - 1; i >= verts_len; i--, new_mv--, new_verts = new_verts->next) {
1884     BLI_assert(new_verts->new_index == i);
1885     BLI_assert(new_verts->new_index != new_verts->orig_index);
1886     CustomData_copy_data(&mesh->vdata, &mesh->vdata, new_verts->orig_index, i, 1);
1887     if (new_verts->vnor) {
1888       normal_float_to_short_v3(new_mv->no, new_verts->vnor);
1889     }
1890   }
1891 }
1892
1893 /* Perform actual split of edges. */
1894 static void split_faces_split_new_edges(Mesh *mesh,
1895                                         SplitFaceNewEdge *new_edges,
1896                                         const int num_new_edges)
1897 {
1898   const int num_edges = mesh->totedge - num_new_edges;
1899   MEdge *medge = mesh->medge;
1900
1901   /* Remember new_edges is a single linklist, so its items are in reversed order... */
1902   MEdge *new_med = &medge[mesh->totedge - 1];
1903   for (int i = mesh->totedge - 1; i >= num_edges; i--, new_med--, new_edges = new_edges->next) {
1904     BLI_assert(new_edges->new_index == i);
1905     BLI_assert(new_edges->new_index != new_edges->orig_index);
1906     CustomData_copy_data(&mesh->edata, &mesh->edata, new_edges->orig_index, i, 1);
1907     new_med->v1 = new_edges->v1;
1908     new_med->v2 = new_edges->v2;
1909   }
1910 }
1911
1912 /* Split faces based on the edge angle and loop normals.
1913  * Matches behavior of face splitting in render engines.
1914  *
1915  * NOTE: Will leave CD_NORMAL loop data layer which is
1916  * used by render engines to set shading up.
1917  */
1918 void BKE_mesh_split_faces(Mesh *mesh, bool free_loop_normals)
1919 {
1920   const int num_polys = mesh->totpoly;
1921
1922   if (num_polys == 0) {
1923     return;
1924   }
1925   BKE_mesh_tessface_clear(mesh);
1926
1927   MLoopNorSpaceArray lnors_spacearr = {NULL};
1928   /* Compute loop normals and loop normal spaces (a.k.a. smooth fans of faces around vertices). */
1929   BKE_mesh_calc_normals_split_ex(mesh, &lnors_spacearr);
1930   /* Stealing memarena from loop normals space array. */
1931   MemArena *memarena = lnors_spacearr.mem;
1932
1933   SplitFaceNewVert *new_verts = NULL;
1934   SplitFaceNewEdge *new_edges = NULL;
1935
1936   /* Detect loop normal spaces (a.k.a. smooth fans) that will need a new vert. */
1937   const int num_new_verts = split_faces_prepare_new_verts(
1938       mesh, &lnors_spacearr, &new_verts, memarena);
1939
1940   if (num_new_verts > 0) {
1941     /* Reminder: beyond this point, there is no way out, mesh is in invalid state (due to early-reassignment of
1942      * loops' vertex and edge indices to new, to-be-created split ones). */
1943
1944     const int num_new_edges = split_faces_prepare_new_edges(mesh, &new_edges, memarena);
1945     /* We can have to split a vertex without having to add a single new edge... */
1946     const bool do_edges = (num_new_edges > 0);
1947
1948     /* Reallocate all vert and edge related data. */
1949     mesh->totvert += num_new_verts;
1950     CustomData_realloc(&mesh->vdata, mesh->totvert);
1951     if (do_edges) {
1952       mesh->totedge += num_new_edges;
1953       CustomData_realloc(&mesh->edata, mesh->totedge);
1954     }
1955     /* Update pointers to a newly allocated memory. */
1956     BKE_mesh_update_customdata_pointers(mesh, false);
1957
1958     /* Perform actual split of vertices and edges. */
1959     split_faces_split_new_verts(mesh, new_verts, num_new_verts);
1960     if (do_edges) {
1961       split_faces_split_new_edges(mesh, new_edges, num_new_edges);
1962     }
1963   }
1964
1965   /* Note: after this point mesh is expected to be valid again. */
1966
1967   /* CD_NORMAL is expected to be temporary only. */
1968   if (free_loop_normals) {
1969     CustomData_free_layers(&mesh->ldata, CD_NORMAL, mesh->totloop);
1970   }
1971
1972   /* Also frees new_verts/edges temp data, since we used its memarena to allocate them. */
1973   BKE_lnor_spacearr_free(&lnors_spacearr);
1974
1975 #ifdef VALIDATE_MESH
1976   BKE_mesh_validate(mesh, true, true);
1977 #endif
1978 }
1979
1980 /* **** Depsgraph evaluation **** */
1981
1982 void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh)
1983 {
1984   DEG_debug_print_eval(depsgraph, __func__, mesh->id.name, mesh);
1985   if (mesh->bb == NULL || (mesh->bb->flag & BOUNDBOX_DIRTY)) {
1986     BKE_mesh_texspace_calc(mesh);
1987   }
1988   /* Clear autospace flag in evaluated mesh, so that texspace does not get recomputed when bbox is
1989    * (e.g. after modifiers, etc.) */
1990   mesh->texflag &= ~ME_AUTOSPACE;
1991 }