55 #define EFLAG_SET(eed, val) \
57 CHECK_TYPE(eed, ScanFillEdge *); \
58 (eed)->user_flag = (eed)->user_flag | (unsigned int)val; \
62 # define EFLAG_CLEAR(eed, val) \
64 CHECK_TYPE(eed, ScanFillEdge *); \
65 (eed)->user_flag = (eed)->user_flag & ~(unsigned int)val; \
70 #define VFLAG_SET(eve, val) \
72 CHECK_TYPE(eve, ScanFillVert *); \
73 (eve)->user_flag = (eve)->user_flag | (unsigned int)val; \
77 # define VFLAG_CLEAR(eve, val) \
79 CHECK_TYPE(eve, ScanFillVert *); \
80 (eve)->user_flags = (eve)->user_flag & ~(unsigned int)val; \
88 FILE *f = fopen(
"test.obj",
"w");
95 fprintf(f,
"v %f %f %f\n",
UNPACK3(eve->
co));
123 isect_link =
MEM_callocN(
sizeof(*isect_link), __func__);
124 isect_link->
data = isect;
132 const float *
co = thunk;
147 const unsigned short poly_nr,
159 if ((v_curr == eed->
v1 || v_curr == eed->
v2) ==
true &&
160 (
ELEM(v_prev, eed->
v1, eed->
v2)) ==
false) {
166 if ((v_curr == eed->
v1 || v_curr == eed->
v2) ==
true &&
167 (
ELEM(v_prev, eed->
v1, eed->
v2)) ==
false) {
177 const unsigned short poly_nr,
191 for (eed_other = eed->
next; eed_other;
193 if (!
ELEM(eed->
v1, eed_other->
v1, eed_other->
v2) &&
194 !
ELEM(eed->
v2, eed_other->
v1, eed_other->
v2) && (eed != eed_other)) {
212 isect->
co[2] = eed->
v1->
co[2];
227 if (isect_hash ==
NULL) {
271 for (isect_link = e_ls->
first; isect_link; isect_link = isect_link->
next) {
323 float min_x = FLT_MAX;
330 if (eed->
v2->
co[0] < min_x) {
331 min_x = eed->
v2->
co[0];
350 v_next = (e_next->
v1 == v_curr) ? e_next->
v2 : e_next->
v1;
366 e_next =
edge_step(poly_info, poly_nr, v_prev, v_curr, e_curr);
368 }
while (e_curr != e_init);
383 const unsigned int poly_tot = (
unsigned int)sf_ctx->
poly_nr + 1;
384 unsigned int eed_index = 0;
386 bool changed =
false;
394 poly_info =
MEM_callocN(
sizeof(*poly_info) * poly_tot, __func__);
402 unsigned short poly_nr;
412 if ((poly_info[poly_nr].edge_last !=
NULL) &&
413 (poly_info[poly_nr].edge_last->poly_nr != eed->
poly_nr)) {
417 if (poly_info[poly_nr].edge_first ==
NULL) {
418 poly_info[poly_nr].edge_first = eed;
419 poly_info[poly_nr].edge_last = eed;
421 else if (poly_info[poly_nr].edge_last->poly_nr == eed->
poly_nr) {
422 poly_info[poly_nr].edge_last = eed;
425 BLI_assert(poly_info[poly_nr].edge_first->poly_nr == poly_info[poly_nr].edge_last->poly_nr);
431 unsigned short poly_nr;
432 for (poly_nr = 0; poly_nr < poly_tot; poly_nr++) {
439 if (changed ==
false) {
448 eed_next = eed->
next;
473 eve_next = eve->
next;
490 BLI_scanfill_view3d_dump(sf_ctx);
491 BLI_scanfill_obj_dump(sf_ctx);
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct 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
int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float 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)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
Read Guarded memory(de)allocation.
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static ListBase * edge_isect_ls_add(GHash *isect_hash, ScanFillEdge *eed, ScanFillIsect *isect)
static bool scanfill_preprocess_self_isect(ScanFillContext *sf_ctx, PolyInfo *poly_info, const unsigned short poly_nr, ListBase *filledgebase)
static ScanFillEdge * edge_step(PolyInfo *poly_info, const unsigned short poly_nr, ScanFillVert *v_prev, ScanFillVert *v_curr, ScanFillEdge *e_curr)
#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 ListBase * edge_isect_ls_ensure(GHash *isect_hash, ScanFillEdge *eed)
bool BLI_scanfill_calc_self_isect(ScanFillContext *sf_ctx, ListBase *remvertbase, ListBase *remedgebase)
struct ScanFillIsect ScanFillIsect
ScanFillEdge * edge_first
ScanFillVert * vert_outer
struct ScanFillEdge * prev
struct ScanFillEdge * next
struct ScanFillIsect * next
struct ScanFillIsect * prev
struct ScanFillVert * next