35#define BM_FACE_TESSELLATE_THREADED_LIMIT 1024
47 const bool face_normal)
60 BMLoop **l_ptr = looptris[0].data();
72 BMLoop **l_ptr_a = looptris[0].data();
73 BMLoop **l_ptr_b = looptris[1].data();
75 (l_ptr_a[1] =
l =
l->
next);
76 (l_ptr_a[2] = l_ptr_b[1] =
l =
l->
next);
77 (l_ptr_b[2] =
l->
next);
81 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);
85 l_ptr_a[0]->
v->
co, l_ptr_a[1]->
v->
co, l_ptr_a[2]->
v->
co, l_ptr_b[2]->
v->
co)))
88 l_ptr_a[2] = l_ptr_b[2];
89 l_ptr_b[0] = l_ptr_a[1];
101 float axis_mat[3][3];
102 float(*projverts)[2];
105 const int tris_len = efa->
len - 2;
108 if (
UNLIKELY(pf_arena ==
nullptr)) {
114 projverts =
static_cast<float(*)[2]
>(
125 }
while ((l_iter = l_iter->
next) != l_first);
129 for (i = 0; i < tris_len; i++) {
130 BMLoop **l_ptr = looptris[i].data();
133 l_ptr[0] = l_arr[tri[0]];
134 l_ptr[1] = l_arr[tri[1]];
135 l_ptr[2] = l_arr[tri[2]];
210 std::array<BMLoop *, 3> *looptris =
static_cast<std::array<BMLoop *, 3> *
>(userdata);
222 std::array<BMLoop *, 3> *looptris =
static_cast<std::array<BMLoop *, 3> *
>(userdata);
230 void *__restrict tls_v)
246 settings.userdata_chunk = &tls_dummy;
247 settings.userdata_chunk_size =
sizeof(tls_dummy);
272 params.face_normals =
false;
296 tls->userdata_chunk);
298 BMFace *f = data->faces[index];
305 void *__restrict userdata,
const int index,
const TaskParallelTLS *__restrict tls)
308 tls->userdata_chunk);
310 BMFace *f = data->faces[index];
314 data->looptris.data() + offset, f, &tls_data->
pf_arena);
318 void *__restrict tls_v)
331 const int faces_len = bmpinfo->
faces_len;
336 data.looptris = looptris;
341 settings.use_threading =
true;
342 settings.userdata_chunk = &tls_dummy;
343 settings.userdata_chunk_size =
sizeof(tls_dummy);
360 const int faces_len = bmpinfo->
faces_len;
365 if (
params->face_normals) {
366 for (
int index = 0; index < faces_len; index++) {
374 for (
int index = 0; index < faces_len; index++) {
431 BMLoop **l_ptr = looptris[0].data();
450 l_v1->
v, l_v2->
v, l_v3->
v, l_v4->
v, 0, 0) < 0.0f);
452 float axis_mat[3][3], v_quad[4][2];
460 v_quad[0], v_quad[1], v_quad[2], v_quad[3]) < 0.0f;
463 BMLoop **l_ptr_a = looptris[0].data();
464 BMLoop **l_ptr_b = looptris[1].data();
487 Heap *pf_heap = *pf_heap_p;
488 if (
UNLIKELY(pf_arena ==
nullptr)) {
496 float axis_mat[3][3];
497 float(*projverts)[2];
500 const int tris_len = efa->
len - 2;
504 projverts =
static_cast<float(*)[2]
>(
515 }
while ((l_iter = l_iter->
next) != l_first);
521 for (i = 0; i < tris_len; i++) {
522 BMLoop **l_ptr = looptris[i].data();
525 l_ptr[0] = l_arr[tri[0]];
526 l_ptr[1] = l_arr[tri[1]];
527 l_ptr[2] = l_arr[tri[2]];
550 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])
void * BLI_memarena_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1)
struct MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
#define BLI_MEMARENA_STD_BUFSIZE
void 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)
Read Guarded memory(de)allocation.
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
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
draw_view in_light_buf[] float
BMPartialUpdate_Params params
MutableSpan< std::array< BMLoop *, 3 > > looptris