ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenkernel / intern / editmesh_cache.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
17 /** \file
18  * \ingroup bke
19  *
20  * Manage edit mesh cache: #EditMeshData
21  */
22
23 #include "MEM_guardedalloc.h"
24
25 #include "DNA_mesh_types.h"
26
27 #include "BKE_editmesh.h"
28 #include "BKE_editmesh_cache.h" /* own include */
29
30 void BKE_editmesh_cache_ensure_poly_normals(BMEditMesh *em, EditMeshData *emd)
31 {
32   if (!(emd->vertexCos && (emd->polyNos == NULL))) {
33     return;
34   }
35
36   BMesh *bm = em->bm;
37   const float(*vertexCos)[3];
38   float(*polyNos)[3];
39
40   BMFace *efa;
41   BMIter fiter;
42   int i;
43
44   BM_mesh_elem_index_ensure(bm, BM_VERT);
45
46   polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
47
48   vertexCos = emd->vertexCos;
49
50   BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
51     BM_elem_index_set(efa, i); /* set_inline */
52     BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos);
53   }
54   bm->elem_index_dirty &= ~BM_FACE;
55
56   emd->polyNos = (const float(*)[3])polyNos;
57 }
58
59 void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh *em, EditMeshData *emd)
60 {
61   if (!(emd->vertexCos && (emd->vertexNos == NULL))) {
62     return;
63   }
64
65   BMesh *bm = em->bm;
66   const float(*vertexCos)[3], (*polyNos)[3];
67   float(*vertexNos)[3];
68
69   /* calculate vertex normals from poly normals */
70   BKE_editmesh_cache_ensure_poly_normals(em, emd);
71
72   BM_mesh_elem_index_ensure(bm, BM_FACE);
73
74   polyNos = emd->polyNos;
75   vertexCos = emd->vertexCos;
76   vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
77
78   BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
79
80   emd->vertexNos = (const float(*)[3])vertexNos;
81 }
82
83 void BKE_editmesh_cache_ensure_poly_centers(BMEditMesh *em, EditMeshData *emd)
84 {
85   if (emd->polyCos != NULL) {
86     return;
87   }
88   BMesh *bm = em->bm;
89   float(*polyCos)[3];
90
91   BMFace *efa;
92   BMIter fiter;
93   int i;
94
95   polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
96
97   if (emd->vertexCos) {
98     const float(*vertexCos)[3];
99     vertexCos = emd->vertexCos;
100
101     BM_mesh_elem_index_ensure(bm, BM_VERT);
102
103     BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
104       BM_face_calc_center_median_vcos(bm, efa, polyCos[i], vertexCos);
105     }
106   }
107   else {
108     BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
109       BM_face_calc_center_median(efa, polyCos[i]);
110     }
111   }
112
113   emd->polyCos = (const float(*)[3])polyCos;
114 }