33#define BM_FACE_TESSELLATE_THREADED_LIMIT 1024
45 const bool face_normal)
58 BMLoop **l_ptr = looptris[0].data();
60 l_ptr[1] =
l =
l->next;
70 BMLoop **l_ptr_a = looptris[0].data();
71 BMLoop **l_ptr_b = looptris[1].data();
73 (l_ptr_a[1] =
l =
l->next);
74 (l_ptr_a[2] = l_ptr_b[1] =
l =
l->next);
75 (l_ptr_b[2] =
l->next);
79 efa->
no, l_ptr_a[0]->
v->
co, l_ptr_a[1]->
v->
co, l_ptr_a[2]->
v->
co, l_ptr_b[2]->
v->
co);
83 l_ptr_a[0]->
v->co, l_ptr_a[1]->
v->
co, l_ptr_a[2]->
v->
co, l_ptr_b[2]->
v->
co)))
86 l_ptr_a[2] = l_ptr_b[2];
87 l_ptr_b[0] = l_ptr_a[1];
100 float (*projverts)[2];
103 const int tris_len = efa->
len - 2;
106 if (
UNLIKELY(pf_arena ==
nullptr)) {
112 projverts =
static_cast<float (*)[2]
>(
123 }
while ((l_iter = l_iter->
next) != l_first);
127 for (
i = 0;
i < tris_len;
i++) {
128 BMLoop **l_ptr = looptris[
i].data();
131 l_ptr[0] = l_arr[tri[0]];
132 l_ptr[1] = l_arr[tri[1]];
133 l_ptr[2] = l_arr[tri[2]];
208 std::array<BMLoop *, 3> *looptris =
static_cast<std::array<BMLoop *, 3> *
>(userdata);
220 std::array<BMLoop *, 3> *looptris =
static_cast<std::array<BMLoop *, 3> *
>(userdata);
228 void *__restrict tls_v)
270 params.face_normals =
false;
294 tls->userdata_chunk);
303 void *__restrict userdata,
const int index,
const TaskParallelTLS *__restrict tls)
306 tls->userdata_chunk);
312 data->looptris.data() + offset, f, &tls_data->
pf_arena);
316 void *__restrict tls_v)
329 const int faces_len = bmpinfo->
faces.
size();
334 data.looptris = looptris;
358 const int faces_len = bmpinfo->
faces.
size();
363 if (
params->face_normals) {
364 for (
int index = 0; index < faces_len; index++) {
372 for (
int index = 0; index < faces_len; index++) {
429 BMLoop **l_ptr = looptris[0].data();
431 l_ptr[1] =
l =
l->next;
448 l_v1->
v, l_v2->
v, l_v3->
v, l_v4->
v, 0, 0) < 0.0f);
450 float axis_mat[3][3], v_quad[4][2];
458 v_quad[0], v_quad[1], v_quad[2], v_quad[3]) < 0.0f;
461 BMLoop **l_ptr_a = looptris[0].data();
462 BMLoop **l_ptr_b = looptris[1].data();
485 Heap *pf_heap = *pf_heap_p;
486 if (
UNLIKELY(pf_arena ==
nullptr)) {
494 float axis_mat[3][3];
495 float (*projverts)[2];
498 const int tris_len = efa->
len - 2;
502 projverts =
static_cast<float (*)[2]
>(
513 }
while ((l_iter = l_iter->
next) != l_first);
519 for (
i = 0;
i < tris_len;
i++) {
520 BMLoop **l_ptr = looptris[
i].data();
523 l_ptr[0] = l_arr[tri[0]];
524 l_ptr[1] = l_arr[tri[1]];
525 l_ptr[2] = l_arr[tri[2]];
548 Heap *pf_heap =
nullptr;
A min-heap / priority queue ADT.
void BLI_heap_free(Heap *heap, HeapFreeFP ptrfreefp) ATTR_NONNULL(1)
Heap * BLI_heap_new_ex(unsigned int reserve_num) ATTR_WARN_UNUSED_RESULT
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
bool is_quad_flip_v3_first_third_fast(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void axis_dominant_v3_to_m3_negate(float r_mat[3][3], const float normal[3])
void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3])
Normal to x,y matrix.
MINLINE int poly_to_tri_count(int poly_count, int corner_count)
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3])
#define BLI_MEMARENA_STD_BUFSIZE
MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
void BLI_memarena_free(MemArena *ma) ATTR_NONNULL(1)
void * BLI_memarena_alloc(MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1)
void BLI_polyfill_calc_arena(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3], struct MemArena *arena)
#define BLI_POLYFILL_ALLOC_NGON_RESERVE
#define BLI_polyfill_beautify_quad_rotate_calc(v1, v2, v3, v4)
void BLI_polyfill_beautify(const float(*coords)[2], unsigned int coords_num, unsigned int(*tris)[3], struct MemArena *arena, struct Heap *eheap)
struct MempoolIterData MempoolIterData
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_mempool_settings_defaults(TaskParallelSettings *settings)
float BM_verts_calc_rotate_beauty(const BMVert *v1, const BMVert *v2, const BMVert *v3, const BMVert *v4, const short flag, const short method)
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_ITER_MESH(ele, iter, bm, itype)
BMesh const char void * data
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
static void bm_mesh_calc_tessellation__multi_threaded(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris, const char face_normals)
void BM_mesh_calc_tessellation_with_partial_ex(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris, const BMPartialUpdate *bmpinfo, const BMeshCalcTessellation_Params *params)
static void bmesh_calc_tessellation_for_face_with_normal(std::array< BMLoop *, 3 > *looptris, BMFace *efa, MemArena **pf_arena_p)
static void bmesh_calc_tessellation_for_face_partial_with_normals_fn(void *__restrict userdata, const int index, const TaskParallelTLS *__restrict tls)
void BM_mesh_calc_tessellation(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris)
static int bmesh_calc_tessellation_for_face_beauty(std::array< BMLoop *, 3 > *looptris, BMFace *efa, MemArena **pf_arena_p, Heap **pf_heap_p)
static void bm_mesh_calc_tessellation_with_partial__single_threaded(MutableSpan< std::array< BMLoop *, 3 > > looptris, const BMPartialUpdate *bmpinfo, const BMeshCalcTessellation_Params *params)
static void bm_mesh_calc_tessellation_with_partial__multi_threaded(MutableSpan< std::array< BMLoop *, 3 > > looptris, const BMPartialUpdate *bmpinfo, const BMeshCalcTessellation_Params *params)
static void bmesh_calc_tessellation_for_face_free_fn(const void *__restrict, void *__restrict tls_v)
#define BM_FACE_TESSELLATE_THREADED_LIMIT
static void bm_mesh_calc_tessellation__single_threaded(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris, const char face_normals)
BM_mesh_calc_tessellation get the looptris and its number from a certain bmesh.
void BM_mesh_calc_tessellation_ex(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris, const BMeshCalcTessellation_Params *params)
static void bmesh_calc_tessellation_for_face_with_normals_fn(void *__restrict userdata, MempoolIterData *mp_f, const TaskParallelTLS *__restrict tls)
void BM_mesh_calc_tessellation_beauty(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris)
static void bmesh_calc_tessellation_for_face(std::array< BMLoop *, 3 > *looptris, BMFace *efa, MemArena **pf_arena_p)
static void bmesh_calc_tessellation_for_face_partial_free_fn(const void *__restrict, void *__restrict tls_v)
void BM_mesh_calc_tessellation_with_partial(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris, const BMPartialUpdate *bmpinfo)
static void bmesh_calc_tessellation_for_face_fn(void *__restrict userdata, MempoolIterData *mp_f, const TaskParallelTLS *__restrict tls)
static void bmesh_calc_tessellation_for_face_partial_fn(void *__restrict userdata, const int index, const TaskParallelTLS *__restrict tls)
BLI_INLINE void bmesh_calc_tessellation_for_face_impl(std::array< BMLoop *, 3 > *looptris, BMFace *efa, MemArena **pf_arena_p, const bool face_normal)
float BM_face_calc_normal(const BMFace *f, float r_no[3])
BMESH UPDATE FACE NORMAL.
bool BM_face_is_normal_valid(const BMFace *f)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
blender::Vector< BMFace * > faces
BMPartialUpdate_Params params
MutableSpan< std::array< BMLoop *, 3 > > looptris
TaskParallelFreeFunc func_free
size_t userdata_chunk_size