Welcome to mirror list, hosted at ThFree Co, Russian Federation.

bmesh_mesh.h « intern « bmesh « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b982b14340ff67199de25f930ccdbc47517c57cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * Contributor(s): Geoffrey Bantle, Levi Schooley.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

#ifndef __BMESH_MESH_H__
#define __BMESH_MESH_H__

/** \file blender/bmesh/intern/bmesh_mesh.h
 *  \ingroup bmesh
 */

struct BMAllocTemplate;
struct MLoopNorSpaceArray;

void   BM_mesh_elem_toolflags_ensure(BMesh *bm);
void   BM_mesh_elem_toolflags_clear(BMesh *bm);
BMesh *BM_mesh_create(const struct BMAllocTemplate *allocsize);

void   BM_mesh_free(BMesh *bm);
void   BM_mesh_data_free(BMesh *bm);
void   BM_mesh_clear(BMesh *bm);

void BM_mesh_normals_update(BMesh *bm);
void BM_verts_calc_normal_vcos(BMesh *bm, const float (*fnos)[3], const float (*vcos)[3], float (*vnos)[3]);
void BM_loops_calc_normal_vcos(
        BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*pnos)[3],
        const bool use_split_normals, const float split_angle, float (*r_lnos)[3],
        struct MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2], const int cd_loop_clnors_offset);
void BM_loops_normal_custom_set(
        BMesh *bm, float (*r_lnos)[3], short (*r_clnors_data)[2], const int cd_loop_clnors_offset);
void BM_loops_normal_custom_set_vcos(
		BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*fnos)[3], float (*r_lnos)[3],
		short (*r_clnors_data)[2], const int cd_loop_clnors_offset);
void BM_loops_normal_custom_set_from_vertices(
        BMesh *bm, float (*r_lnos)[3], short (*r_clnors_data)[2], const int cd_loop_clnors_offset);
void BM_loops_normal_custom_set_from_vertices_vcos(
        BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*fnos)[3], float (*r_lnos)[3],
        short (*r_clnors_data)[2], const int cd_loop_clnors_offset);

void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);

void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag);
void BM_mesh_elem_index_validate(
        BMesh *bm, const char *location, const char *func,
        const char *msg_a, const char *msg_b);

#ifndef NDEBUG
bool BM_mesh_elem_table_check(BMesh *bm);
#endif

void           BM_mesh_elem_table_ensure(BMesh *bm, const char htype);
void           BM_mesh_elem_table_init(BMesh *bm, const char htype);
void           BM_mesh_elem_table_free(BMesh *bm, const char htype);

BMVert *BM_vert_at_index(BMesh *bm, const int index);
BMEdge *BM_edge_at_index(BMesh *bm, const int index);
BMFace *BM_face_at_index(BMesh *bm, const int index);

BMVert *BM_vert_at_index_find(BMesh *bm, const int index);
BMEdge *BM_edge_at_index_find(BMesh *bm, const int index);
BMFace *BM_face_at_index_find(BMesh *bm, const int index);

BMVert *BM_vert_at_index_find_or_table(BMesh *bm, const int index);
BMEdge *BM_edge_at_index_find_or_table(BMesh *bm, const int index);
BMFace *BM_face_at_index_find_or_table(BMesh *bm, const int index);

// XXX

int  BM_mesh_elem_count(BMesh *bm, const char htype);

void BM_mesh_remap(
        BMesh *bm,
        const unsigned int *vert_idx,
        const unsigned int *edge_idx,
        const unsigned int *face_idx);

typedef struct BMAllocTemplate {
	int totvert, totedge, totloop, totface;
} BMAllocTemplate;

extern const BMAllocTemplate bm_mesh_allocsize_default;
extern const BMAllocTemplate bm_mesh_chunksize_default;

#define BMALLOC_TEMPLATE_FROM_BM(bm) { (CHECK_TYPE_INLINE(bm, BMesh *), \
	(bm)->totvert), (bm)->totedge, (bm)->totloop, (bm)->totface}
#define BMALLOC_TEMPLATE_FROM_ME(me) { (CHECK_TYPE_INLINE(me, Mesh *), \
	(me)->totvert), (me)->totedge, (me)->totloop, (me)->totpoly}

#define _VA_BMALLOC_TEMPLATE_FROM_DM_1(dm) { \
	(CHECK_TYPE_INLINE(dm, DerivedMesh *), \
	(dm)->getNumVerts(dm)),		\
	(dm)->getNumEdges(dm),		\
	(dm)->getNumLoops(dm),		\
	(dm)->getNumPolys(dm),		\
	}
#define _VA_BMALLOC_TEMPLATE_FROM_DM_2(dm_a, dm_b) { \
	(CHECK_TYPE_INLINE(dm_a, DerivedMesh *), \
	 CHECK_TYPE_INLINE(dm_b, DerivedMesh *), \
	(dm_a)->getNumVerts(dm_a)) + (dm_b)->getNumVerts(dm_b),	\
	(dm_a)->getNumEdges(dm_a)  + (dm_b)->getNumEdges(dm_b),	\
	(dm_a)->getNumLoops(dm_a)  + (dm_b)->getNumLoops(dm_b),	\
	(dm_a)->getNumPolys(dm_a)  + (dm_b)->getNumPolys(dm_b),	\
	}

#define BMALLOC_TEMPLATE_FROM_DM(...) VA_NARGS_CALL_OVERLOAD(_VA_BMALLOC_TEMPLATE_FROM_DM_, __VA_ARGS__)



enum {
	BM_MESH_CREATE_USE_TOOLFLAGS = (1 << 0)
};

#endif /* __BMESH_MESH_H__ */