41 #define EFLAG_SET(eed, val) \
43 CHECK_TYPE(eed, ScanFillEdge *); \
44 (eed)->user_flag = (eed)->user_flag | (unsigned int)val; \
48 # define EFLAG_CLEAR(eed, val) \
50 CHECK_TYPE(eed, ScanFillEdge *); \
51 (eed)->user_flag = (eed)->user_flag & ~(unsigned int)val; \
56 #define VFLAG_SET(eve, val) \
58 CHECK_TYPE(eve, ScanFillVert *); \
59 (eve)->user_flag = (eve)->user_flag | (unsigned int)val; \
63 # define VFLAG_CLEAR(eve, val) \
65 CHECK_TYPE(eve, ScanFillVert *); \
66 (eve)->user_flags = (eve)->user_flag & ~(unsigned int)val; \
74 FILE *f = fopen(
"test.obj",
"w");
81 fprintf(f,
"v %f %f %f\n",
UNPACK3(eve->
co));
109 isect_link =
MEM_callocN(
sizeof(*isect_link), __func__);
110 isect_link->
data = isect;
118 const float *
co = thunk;
133 const unsigned short poly_nr,
145 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
151 if (
ELEM(v_curr, eed->
v1, eed->
v2) ==
true &&
ELEM(v_prev, eed->
v1, eed->
v2) ==
false) {
161 const unsigned short poly_nr,
175 for (eed_other = eed->
next; eed_other;
177 if (!
ELEM(eed->
v1, eed_other->
v1, eed_other->
v2) &&
178 !
ELEM(eed->
v2, eed_other->
v1, eed_other->
v2) && (eed != eed_other)) {
196 isect->
co[2] = eed->
v1->
co[2];
211 if (isect_hash ==
NULL) {
255 for (isect_link = e_ls->
first; isect_link; isect_link = isect_link->
next) {
307 float min_x = FLT_MAX;
314 if (eed->
v2->
co[0] < min_x) {
315 min_x = eed->
v2->
co[0];
334 v_next = (e_next->
v1 == v_curr) ? e_next->
v2 : e_next->
v1;
350 e_next =
edge_step(poly_info, poly_nr, v_prev, v_curr, e_curr);
352 }
while (e_curr != e_init);
362 const unsigned int poly_num = (
unsigned int)sf_ctx->
poly_nr + 1;
363 unsigned int eed_index = 0;
365 bool changed =
false;
373 poly_info =
MEM_callocN(
sizeof(*poly_info) * poly_num, __func__);
381 unsigned short poly_nr;
391 if ((poly_info[poly_nr].edge_last !=
NULL) &&
392 (poly_info[poly_nr].edge_last->poly_nr != eed->
poly_nr)) {
396 if (poly_info[poly_nr].edge_first ==
NULL) {
397 poly_info[poly_nr].edge_first = eed;
398 poly_info[poly_nr].edge_last = eed;
400 else if (poly_info[poly_nr].edge_last->poly_nr == eed->
poly_nr) {
401 poly_info[poly_nr].edge_last = eed;
404 BLI_assert(poly_info[poly_nr].edge_first->poly_nr == poly_info[poly_nr].edge_last->poly_nr);
410 unsigned short poly_nr;
411 for (poly_nr = 0; poly_nr < poly_num; poly_nr++) {
418 if (changed ==
false) {
427 eed_next = eed->
next;
452 eve_next = eve->
next;
469 BLI_scanfill_view3d_dump(sf_ctx);
470 BLI_scanfill_obj_dump(sf_ctx);
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
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_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 const pxr::TfToken b("b", pxr::TfToken::Immortal)
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