2012-02-28 18:28:30 +00:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __BMESH_MESH_H__
|
|
|
|
|
#define __BMESH_MESH_H__
|
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
|
* \ingroup bmesh
|
2012-02-28 18:28:30 +00:00
|
|
|
*/
|
|
|
|
|
|
2012-03-01 20:09:17 +00:00
|
|
|
struct BMAllocTemplate;
|
2018-05-25 22:24:24 +05:30
|
|
|
struct BMLoopNorEditDataArray;
|
2019-01-28 21:08:24 +11:00
|
|
|
struct MLoopNorSpaceArray;
|
2012-03-01 20:09:17 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void BM_mesh_elem_toolflags_ensure(BMesh *bm);
|
|
|
|
|
void BM_mesh_elem_toolflags_clear(BMesh *bm);
|
2016-07-01 19:07:11 +10:00
|
|
|
|
|
|
|
|
struct BMeshCreateParams {
|
2019-04-17 06:17:24 +02:00
|
|
|
uint use_toolflags : 1;
|
2016-07-01 19:07:11 +10:00
|
|
|
};
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BMesh *BM_mesh_create(const struct BMAllocTemplate *allocsize,
|
|
|
|
|
const struct BMeshCreateParams *params);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void BM_mesh_free(BMesh *bm);
|
|
|
|
|
void BM_mesh_data_free(BMesh *bm);
|
|
|
|
|
void BM_mesh_clear(BMesh *bm);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2013-04-24 12:07:13 +00:00
|
|
|
void BM_mesh_normals_update(BMesh *bm);
|
2019-04-17 06:17:24 +02:00
|
|
|
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,
|
|
|
|
|
const bool do_rebuild);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
Refactor: Merge non-functional-change part of 'edit normals' 2017 GSoC.
This merges changes in internals, runtime-only of existing custom
normals code, which make sense as of themselves, and will make diff of
soc branch easier/lighter to review.
In the details, it mostly changes two things:
* Now, smooth fans (aka MLoopNorSpaceArray) can store either loop
indices, or pointers to BMLoop themselves. This makes sense since in
BMesh, it's relatively easy to get index from a BMElement, but nearly
impracticable to go the other way around.
* First change enforces another, now we cannot rely anymore on `loops`
being NULL in MLoopNorSpace to detect single-loop fans, so we instead
store that info in a new flag.
Again, these are expected to be totally non-functional changes.
2018-03-01 16:54:21 +01:00
|
|
|
bool BM_loop_check_cyclic_smooth_fan(BMLoop *l_curr);
|
2019-04-17 06:17:24 +02:00
|
|
|
void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3]);
|
2018-05-25 22:24:24 +05:30
|
|
|
void BM_lnorspace_invalidate(BMesh *bm, const bool do_invalidate_all);
|
|
|
|
|
void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor);
|
|
|
|
|
void BM_lnorspace_update(BMesh *bm);
|
2018-06-11 11:58:26 +05:30
|
|
|
void BM_normals_loops_edges_tag(BMesh *bm, const bool do_edges);
|
2018-05-25 22:24:24 +05:30
|
|
|
#ifndef NDEBUG
|
|
|
|
|
void BM_lnorspace_err(BMesh *bm);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Loop Generics */
|
2019-06-16 18:04:57 +02:00
|
|
|
struct BMLoopNorEditDataArray *BM_loop_normal_editdata_array_init(BMesh *bm,
|
|
|
|
|
const bool do_all_loops_of_vert);
|
2018-05-25 22:24:24 +05:30
|
|
|
void BM_loop_normal_editdata_array_free(struct BMLoopNorEditDataArray *lnors_ed_arr);
|
|
|
|
|
int BM_total_loop_select(BMesh *bm);
|
Refactor: Merge non-functional-change part of 'edit normals' 2017 GSoC.
This merges changes in internals, runtime-only of existing custom
normals code, which make sense as of themselves, and will make diff of
soc branch easier/lighter to review.
In the details, it mostly changes two things:
* Now, smooth fans (aka MLoopNorSpaceArray) can store either loop
indices, or pointers to BMLoop themselves. This makes sense since in
BMesh, it's relatively easy to get index from a BMElement, but nearly
impracticable to go the other way around.
* First change enforces another, now we cannot rely anymore on `loops`
being NULL in MLoopNorSpace to detect single-loop fans, so we instead
store that info in a new flag.
Again, these are expected to be totally non-functional changes.
2018-03-01 16:54:21 +01:00
|
|
|
|
2018-02-22 15:00:42 +01:00
|
|
|
void BM_edges_sharp_from_angle_set(BMesh *bm, const float split_angle);
|
|
|
|
|
|
2013-04-14 06:22:34 +00:00
|
|
|
void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
|
|
|
|
|
void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2018-04-16 16:27:55 +02:00
|
|
|
void BM_mesh_elem_index_ensure_ex(BMesh *bm, const char htype, int elem_offset[4]);
|
2012-02-28 18:28:30 +00:00
|
|
|
void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag);
|
2015-04-25 20:15:20 +10:00
|
|
|
void BM_mesh_elem_index_validate(
|
2019-04-17 06:17:24 +02:00
|
|
|
BMesh *bm, const char *location, const char *func, const char *msg_a, const char *msg_b);
|
2012-04-23 01:19:50 +00:00
|
|
|
|
2016-07-02 18:07:58 +10:00
|
|
|
void BM_mesh_toolflags_set(BMesh *bm, bool use_toolflags);
|
|
|
|
|
|
2013-10-28 02:05:33 +00:00
|
|
|
#ifndef NDEBUG
|
2014-08-22 16:16:19 +10:00
|
|
|
bool BM_mesh_elem_table_check(BMesh *bm);
|
2013-10-28 02:05:33 +00:00
|
|
|
#endif
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
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);
|
2013-10-28 02:05:33 +00:00
|
|
|
|
2018-10-24 12:54:12 +11:00
|
|
|
BLI_INLINE BMVert *BM_vert_at_index(BMesh *bm, const int index)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_assert((index >= 0) && (index < bm->totvert));
|
|
|
|
|
BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
|
|
|
|
|
return bm->vtable[index];
|
2018-10-24 12:54:12 +11:00
|
|
|
}
|
|
|
|
|
BLI_INLINE BMEdge *BM_edge_at_index(BMesh *bm, const int index)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_assert((index >= 0) && (index < bm->totedge));
|
|
|
|
|
BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
|
|
|
|
|
return bm->etable[index];
|
2018-10-24 12:54:12 +11:00
|
|
|
}
|
|
|
|
|
BLI_INLINE BMFace *BM_face_at_index(BMesh *bm, const int index)
|
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_assert((index >= 0) && (index < bm->totface));
|
|
|
|
|
BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
|
|
|
|
|
return bm->ftable[index];
|
2018-10-24 12:54:12 +11:00
|
|
|
}
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2013-10-27 10:01:35 +00:00
|
|
|
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);
|
2012-02-28 18:28:30 +00:00
|
|
|
|
2015-04-21 01:33:09 +10:00
|
|
|
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);
|
|
|
|
|
|
2013-10-28 02:05:33 +00:00
|
|
|
// XXX
|
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
int BM_mesh_elem_count(BMesh *bm, const char htype);
|
2013-10-28 02:05:33 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void BM_mesh_remap(BMesh *bm, const uint *vert_idx, const uint *edge_idx, const uint *face_idx);
|
2013-10-28 02:05:33 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
void BM_mesh_rebuild(BMesh *bm,
|
|
|
|
|
const struct BMeshCreateParams *params,
|
|
|
|
|
struct BLI_mempool *vpool,
|
|
|
|
|
struct BLI_mempool *epool,
|
|
|
|
|
struct BLI_mempool *lpool,
|
|
|
|
|
struct BLI_mempool *fpool);
|
2016-07-02 18:07:58 +10:00
|
|
|
|
2012-03-01 20:09:17 +00:00
|
|
|
typedef struct BMAllocTemplate {
|
2019-04-17 06:17:24 +02:00
|
|
|
int totvert, totedge, totloop, totface;
|
2012-03-01 20:09:17 +00:00
|
|
|
} BMAllocTemplate;
|
|
|
|
|
|
2012-12-03 05:38:28 +00:00
|
|
|
extern const BMAllocTemplate bm_mesh_allocsize_default;
|
|
|
|
|
extern const BMAllocTemplate bm_mesh_chunksize_default;
|
2012-03-01 20:09:17 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
#define BMALLOC_TEMPLATE_FROM_BM(bm) \
|
|
|
|
|
{ \
|
|
|
|
|
(CHECK_TYPE_INLINE(bm, BMesh *), (bm)->totvert), (bm)->totedge, (bm)->totloop, (bm)->totface \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define _VA_BMALLOC_TEMPLATE_FROM_ME_1(me) \
|
|
|
|
|
{ \
|
|
|
|
|
(CHECK_TYPE_INLINE(me, Mesh *), (me)->totvert), (me)->totedge, (me)->totloop, (me)->totpoly, \
|
|
|
|
|
}
|
|
|
|
|
#define _VA_BMALLOC_TEMPLATE_FROM_ME_2(me_a, me_b) \
|
|
|
|
|
{ \
|
|
|
|
|
(CHECK_TYPE_INLINE(me_a, Mesh *), \
|
|
|
|
|
CHECK_TYPE_INLINE(me_b, Mesh *), \
|
|
|
|
|
(me_a)->totvert + (me_b)->totvert), \
|
|
|
|
|
(me_a)->totedge + (me_b)->totedge, (me_a)->totloop + (me_b)->totloop, \
|
|
|
|
|
(me_a)->totpoly + (me_b)->totpoly, \
|
|
|
|
|
}
|
|
|
|
|
#define BMALLOC_TEMPLATE_FROM_ME(...) \
|
|
|
|
|
VA_NARGS_CALL_OVERLOAD(_VA_BMALLOC_TEMPLATE_FROM_ME_, __VA_ARGS__)
|
2015-12-11 20:24:39 +11:00
|
|
|
|
2019-11-21 21:03:03 +11:00
|
|
|
/* Vertex coords access. */
|
|
|
|
|
void BM_mesh_vert_coords_get(BMesh *bm, float (*orco)[3]);
|
|
|
|
|
float (*BM_mesh_vert_coords_alloc(BMesh *bm, int *r_vert_len))[3];
|
|
|
|
|
void BM_mesh_vert_coords_apply(BMesh *bm, const float (*orco)[3]);
|
|
|
|
|
void BM_mesh_vert_coords_apply_with_mat4(BMesh *bm,
|
|
|
|
|
const float (*vert_coords)[3],
|
|
|
|
|
const float mat[4][4]);
|
|
|
|
|
|
2012-02-28 18:28:30 +00:00
|
|
|
#endif /* __BMESH_MESH_H__ */
|