42#define EFLAG_SET(eed, val) \
44 CHECK_TYPE(eed, ScanFillEdge *); \
45 (eed)->user_flag = (eed)->user_flag | uint(val); \
49# define EFLAG_CLEAR(eed, val) \
51 CHECK_TYPE(eed, ScanFillEdge *); \
52 (eed)->user_flag = (eed)->user_flag & ~uint(val); \
57#define VFLAG_SET(eve, val) \
59 CHECK_TYPE(eve, ScanFillVert *); \
60 (eve)->user_flag = (eve)->user_flag | uint(val); \
64# define VFLAG_CLEAR(eve, val) \
66 CHECK_TYPE(eve, ScanFillVert *); \
67 (eve)->user_flags = (eve)->user_flag & ~uint(val); \
75 FILE *f = fopen(
"test.obj",
"w");
82 fprintf(f,
"v %f %f %f\n",
UNPACK3(eve->
co));
100 return static_cast<ListBase *
>(*val_p);
109 isect_link->
data = isect;
117 const float *co =
static_cast<const float *
>(thunk);
146 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
152 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
166 GHash *isect_hash =
nullptr;
173 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
nullptr : eed->
next) {
176 for (eed_other = eed->
next; eed_other;
177 eed_other = (eed_other == pi->edge_last) ?
nullptr : eed_other->
next)
179 if (!
ELEM(eed->
v1, eed_other->
v1, eed_other->
v2) &&
180 !
ELEM(eed->
v2, eed_other->
v1, eed_other->
v2) && (eed != eed_other))
191 if (
UNLIKELY(isect_hash ==
nullptr)) {
200 isect->
co[2] = eed->
v1->
co[2];
215 if (isect_hash ==
nullptr) {
223 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
nullptr : eed->
next) {
234 if (pi->edge_last == eed) {
235 pi->edge_last =
nullptr;
251 if (pi->edge_first == eed) {
252 pi->edge_first = eed_tmp;
275 if (pi->edge_last ==
nullptr) {
297 e_init = pi->edge_last;
299 e_next = pi->edge_first;
311 e_curr = pi->edge_last;
312 e_next = pi->edge_first;
314 eed_prev = pi->edge_last;
315 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
nullptr : eed->
next) {
316 if (eed->
v2->
co[0] < min_x) {
317 min_x = eed->
v2->
co[0];
331 BLI_assert(pi->edge_last->poly_nr == poly_nr);
336 v_next = (e_next->
v1 == v_curr) ? e_next->
v2 : e_next->
v1;
352 e_next =
edge_step(poly_info, poly_nr, v_prev, v_curr, e_curr);
354 }
while (e_curr != e_init);
365 bool changed =
false;
386 if ((poly_info[poly_nr].edge_last !=
nullptr) &&
387 (poly_info[poly_nr].edge_last->poly_nr != eed->poly_nr))
392 if (poly_info[poly_nr].edge_first ==
nullptr) {
396 else if (poly_info[poly_nr].edge_last->poly_nr == eed->poly_nr) {
407 for (poly_nr = 0; poly_nr < poly_num; poly_nr++) {
414 if (changed ==
false) {
435 eed->v1->user_flag = 1;
436 eed->v2->user_flag = 1;
441 if (eve->user_flag != 1) {
456 BLI_scanfill_view3d_dump(sf_ctx);
457 BLI_scanfill_obj_dump(sf_ctx);
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2])
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
struct ScanFillVert * BLI_scanfill_vert_add(ScanFillContext *sf_ctx, const float vec[3])
struct ScanFillEdge * BLI_scanfill_edge_add(ScanFillContext *sf_ctx, struct ScanFillVert *v1, struct ScanFillVert *v2)
These structs are the foundation for all linked lists in the library system.
Read Guarded memory(de)allocation.
BMesh const char void * data
void * MEM_mallocN(size_t len, const char *str)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static ListBase * edge_isect_ls_add(GHash *isect_hash, ScanFillEdge *eed, ScanFillIsect *isect)
#define EFLAG_SET(eed, val)
#define VFLAG_SET(eve, val)
static int edge_isect_ls_sort_cb(void *thunk, const void *def_a_ptr, const void *def_b_ptr)
static ScanFillEdge * edge_step(PolyInfo *poly_info, const ushort poly_nr, ScanFillVert *v_prev, ScanFillVert *v_curr, ScanFillEdge *e_curr)
bool BLI_scanfill_calc_self_isect(ScanFillContext *sf_ctx, ListBase *remvertbase, ListBase *remedgebase)
static ListBase * edge_isect_ls_ensure(GHash *isect_hash, ScanFillEdge *eed)
static bool scanfill_preprocess_self_isect(ScanFillContext *sf_ctx, PolyInfo *poly_info, const ushort poly_nr, ListBase *filledgebase)
ScanFillEdge * edge_first
ScanFillVert * vert_outer
struct ScanFillEdge * prev
struct ScanFillEdge * next
struct ScanFillVert * next