44#define EFLAG_SET(eed, val) \
46 CHECK_TYPE(eed, ScanFillEdge *); \
47 (eed)->user_flag = (eed)->user_flag | (uint)val; \
51# define EFLAG_CLEAR(eed, val) \
53 CHECK_TYPE(eed, ScanFillEdge *); \
54 (eed)->user_flag = (eed)->user_flag & ~(uint)val; \
59#define VFLAG_SET(eve, val) \
61 CHECK_TYPE(eve, ScanFillVert *); \
62 (eve)->user_flag = (eve)->user_flag | (uint)val; \
66# define VFLAG_CLEAR(eve, val) \
68 CHECK_TYPE(eve, ScanFillVert *); \
69 (eve)->user_flags = (eve)->user_flag & ~(uint)val; \
77 FILE *f = fopen(
"test.obj",
"w");
84 fprintf(f,
"v %f %f %f\n",
UNPACK3(eve->
co));
112 isect_link =
MEM_callocN(
sizeof(*isect_link), __func__);
113 isect_link->
data = isect;
121 const float *
co = thunk;
148 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
154 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
175 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
NULL : eed->
next) {
178 for (eed_other = eed->
next; eed_other;
179 eed_other = (eed_other == pi->edge_last) ?
NULL : eed_other->
next)
181 if (!
ELEM(eed->
v1, eed_other->
v1, eed_other->
v2) &&
182 !
ELEM(eed->
v2, eed_other->
v1, eed_other->
v2) && (eed != eed_other))
202 isect->
co[2] = eed->
v1->
co[2];
217 if (isect_hash ==
NULL) {
225 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
NULL : eed->
next) {
238 if (pi->edge_last == eed) {
239 pi->edge_last =
NULL;
255 if (pi->edge_first == eed) {
256 pi->edge_first = eed_tmp;
261 for (isect_link = e_ls->
first; isect_link; isect_link = isect_link->
next) {
279 if (pi->edge_last ==
NULL) {
301 e_init = pi->edge_last;
303 e_next = pi->edge_first;
315 e_curr = pi->edge_last;
316 e_next = pi->edge_first;
318 eed_prev = pi->edge_last;
319 for (eed = pi->edge_first; eed; eed = (eed == pi->edge_last) ?
NULL : eed->
next) {
320 if (eed->
v2->
co[0] < min_x) {
321 min_x = eed->
v2->
co[0];
335 BLI_assert(pi->edge_last->poly_nr == poly_nr);
340 v_next = (e_next->
v1 == v_curr) ? e_next->
v2 : e_next->
v1;
356 e_next =
edge_step(poly_info, poly_nr, v_prev, v_curr, e_curr);
358 }
while (e_curr != e_init);
370 bool changed =
false;
378 poly_info =
MEM_callocN(
sizeof(*poly_info) * poly_num, __func__);
396 if ((poly_info[poly_nr].edge_last !=
NULL) &&
397 (poly_info[poly_nr].edge_last->poly_nr != eed->
poly_nr))
402 if (poly_info[poly_nr].edge_first ==
NULL) {
406 else if (poly_info[poly_nr].edge_last->poly_nr == eed->
poly_nr) {
417 for (poly_nr = 0; poly_nr < poly_num; poly_nr++) {
424 if (changed ==
false) {
433 eed_next = eed->
next;
458 eve_next = eve->
next;
474 BLI_scanfill_view3d_dump(sf_ctx);
475 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
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 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)
Read Guarded memory(de)allocation.
local_group_size(16, 16) .push_constant(Type b
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
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)
struct ScanFillIsect ScanFillIsect
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 ScanFillIsect * next
struct ScanFillIsect * prev
struct ScanFillVert * next