Merge branch 'master' into blender2.8
[blender.git] / source / blender / bmesh / intern / bmesh_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  * Contributor(s): Geoffrey Bantle, Levi Schooley.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __BMESH_MESH_H__
24 #define __BMESH_MESH_H__
25
26 /** \file blender/bmesh/intern/bmesh_mesh.h
27  *  \ingroup bmesh
28  */
29
30 struct BMAllocTemplate;
31 struct MLoopNorSpaceArray;
32 struct BMLoopNorEditDataArray;
33
34 void   BM_mesh_elem_toolflags_ensure(BMesh *bm);
35 void   BM_mesh_elem_toolflags_clear(BMesh *bm);
36
37 struct BMeshCreateParams {
38         uint use_toolflags : 1;
39 };
40
41 BMesh *BM_mesh_create(
42         const struct BMAllocTemplate *allocsize,
43         const struct BMeshCreateParams *params);
44
45 void   BM_mesh_free(BMesh *bm);
46 void   BM_mesh_data_free(BMesh *bm);
47 void   BM_mesh_clear(BMesh *bm);
48
49 void BM_mesh_normals_update(BMesh *bm);
50 void BM_verts_calc_normal_vcos(BMesh *bm, const float (*fnos)[3], const float (*vcos)[3], float (*vnos)[3]);
51 void BM_loops_calc_normal_vcos(
52         BMesh *bm, const float(*vcos)[3], const float(*vnos)[3], const float(*pnos)[3],
53         const bool use_split_normals, const float split_angle, float(*r_lnos)[3],
54         struct MLoopNorSpaceArray *r_lnors_spacearr, short(*clnors_data)[2],
55         const int cd_loop_clnors_offset, const bool do_rebuild);
56
57 bool BM_loop_check_cyclic_smooth_fan(BMLoop *l_curr);
58 void BM_lnorspacearr_store(BMesh *bm, float(*r_lnors)[3]);
59 void BM_lnorspace_invalidate(BMesh *bm, const bool do_invalidate_all);
60 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor);
61 void BM_lnorspace_update(BMesh *bm);
62 void BM_normals_loops_edges_tag(BMesh *bm, const bool do_edges);
63 #ifndef NDEBUG
64 void BM_lnorspace_err(BMesh *bm);
65 #endif
66
67 /* Loop Generics */
68 struct BMLoopNorEditDataArray *BM_loop_normal_editdata_array_init(BMesh *bm);
69 void BM_loop_normal_editdata_array_free(struct BMLoopNorEditDataArray *lnors_ed_arr);
70 int BM_total_loop_select(BMesh *bm);
71
72
73 void BM_edges_sharp_from_angle_set(BMesh *bm, const float split_angle);
74
75 void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
76 void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
77
78 void BM_mesh_elem_index_ensure_ex(BMesh *bm, const char htype, int elem_offset[4]);
79 void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag);
80 void BM_mesh_elem_index_validate(
81         BMesh *bm, const char *location, const char *func,
82         const char *msg_a, const char *msg_b);
83
84 void BM_mesh_toolflags_set(BMesh *bm, bool use_toolflags);
85
86 #ifndef NDEBUG
87 bool BM_mesh_elem_table_check(BMesh *bm);
88 #endif
89
90 void           BM_mesh_elem_table_ensure(BMesh *bm, const char htype);
91 void           BM_mesh_elem_table_init(BMesh *bm, const char htype);
92 void           BM_mesh_elem_table_free(BMesh *bm, const char htype);
93
94 BLI_INLINE BMVert *BM_vert_at_index(BMesh *bm, const int index)
95 {
96         BLI_assert((index >= 0) && (index < bm->totvert));
97         BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
98         return bm->vtable[index];
99 }
100 BLI_INLINE BMEdge *BM_edge_at_index(BMesh *bm, const int index)
101 {
102         BLI_assert((index >= 0) && (index < bm->totedge));
103         BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
104         return bm->etable[index];
105 }
106 BLI_INLINE BMFace *BM_face_at_index(BMesh *bm, const int index)
107 {
108         BLI_assert((index >= 0) && (index < bm->totface));
109         BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
110         return bm->ftable[index];
111 }
112
113 BMVert *BM_vert_at_index_find(BMesh *bm, const int index);
114 BMEdge *BM_edge_at_index_find(BMesh *bm, const int index);
115 BMFace *BM_face_at_index_find(BMesh *bm, const int index);
116
117 BMVert *BM_vert_at_index_find_or_table(BMesh *bm, const int index);
118 BMEdge *BM_edge_at_index_find_or_table(BMesh *bm, const int index);
119 BMFace *BM_face_at_index_find_or_table(BMesh *bm, const int index);
120
121 // XXX
122
123 int  BM_mesh_elem_count(BMesh *bm, const char htype);
124
125 void BM_mesh_remap(
126         BMesh *bm,
127         const uint *vert_idx,
128         const uint *edge_idx,
129         const uint *face_idx);
130
131 void BM_mesh_rebuild(
132         BMesh *bm, const struct BMeshCreateParams *params,
133         struct BLI_mempool *vpool, struct BLI_mempool *epool, struct BLI_mempool *lpool, struct BLI_mempool *fpool);
134
135 typedef struct BMAllocTemplate {
136         int totvert, totedge, totloop, totface;
137 } BMAllocTemplate;
138
139 extern const BMAllocTemplate bm_mesh_allocsize_default;
140 extern const BMAllocTemplate bm_mesh_chunksize_default;
141
142 #define BMALLOC_TEMPLATE_FROM_BM(bm) { (CHECK_TYPE_INLINE(bm, BMesh *), \
143         (bm)->totvert), (bm)->totedge, (bm)->totloop, (bm)->totface}
144
145 #define _VA_BMALLOC_TEMPLATE_FROM_ME_1(me) { \
146         (CHECK_TYPE_INLINE(me, Mesh *), \
147         (me)->totvert), \
148         (me)->totedge,  \
149         (me)->totloop,  \
150         (me)->totpoly,  \
151 }
152 #define _VA_BMALLOC_TEMPLATE_FROM_ME_2(me_a, me_b) { \
153         (CHECK_TYPE_INLINE(me_a, Mesh *), \
154          CHECK_TYPE_INLINE(me_b, Mesh *), \
155         (me_a)->totvert + (me_b)->totvert),     \
156         (me_a)->totedge + (me_b)->totedge,      \
157         (me_a)->totloop + (me_b)->totloop,      \
158         (me_a)->totpoly + (me_b)->totpoly,      \
159 }
160 #define BMALLOC_TEMPLATE_FROM_ME(...) VA_NARGS_CALL_OVERLOAD(_VA_BMALLOC_TEMPLATE_FROM_ME_, __VA_ARGS__)
161
162 #endif /* __BMESH_MESH_H__ */