0
0
Fork 0

me-main #1

Merged
Nate Rupsis merged 123 commits from me-main into main 2023-02-13 18:39:11 +01:00
1 changed files with 54 additions and 47 deletions
Showing only changes of commit 3f40962414 - Show all commits

View File

@ -58,7 +58,7 @@
# include "PIL_time_utildefines.h" # include "PIL_time_utildefines.h"
#endif #endif
typedef signed char eSign; typedef int8_t eSign;
#ifdef USE_KDTREE #ifdef USE_KDTREE
/** /**
@ -84,24 +84,24 @@ typedef bool axis_t;
/* use for sorting */ /* use for sorting */
typedef struct KDTreeNode2D_head { typedef struct KDTreeNode2D_head {
uint neg, pos; uint32_t neg, pos;
uint index; uint32_t index;
} KDTreeNode2D_head; } KDTreeNode2D_head;
typedef struct KDTreeNode2D { typedef struct KDTreeNode2D {
uint neg, pos; uint32_t neg, pos;
uint index; uint32_t index;
axis_t axis; /* range is only (0-1) */ axis_t axis; /* range is only (0-1) */
ushort flag; uint16_t flag;
uint parent; uint32_t parent;
} KDTreeNode2D; } KDTreeNode2D;
struct KDTree2D { struct KDTree2D {
KDTreeNode2D *nodes; KDTreeNode2D *nodes;
const float (*coords)[2]; const float (*coords)[2];
uint root; uint32_t root;
uint node_num; uint32_t node_num;
uint *nodes_map; /* index -> node lookup */ uint32_t *nodes_map; /* index -> node lookup */
}; };
struct KDRange2D { struct KDRange2D {
@ -119,14 +119,14 @@ typedef struct PolyFill {
struct PolyIndex *indices; /* vertex aligned */ struct PolyIndex *indices; /* vertex aligned */
const float (*coords)[2]; const float (*coords)[2];
uint coords_num; uint32_t coords_num;
#ifdef USE_CONVEX_SKIP #ifdef USE_CONVEX_SKIP
uint coords_num_concave; uint32_t coords_num_concave;
#endif #endif
/* A polygon with n vertices has a triangulation of n-2 triangles. */ /* A polygon with n vertices has a triangulation of n-2 triangles. */
uint (*tris)[3]; uint32_t (*tris)[3];
uint tris_num; uint32_t tris_num;
#ifdef USE_KDTREE #ifdef USE_KDTREE
struct KDTree2D kdtree; struct KDTree2D kdtree;
@ -136,7 +136,7 @@ typedef struct PolyFill {
/** Circular double linked-list. */ /** Circular double linked-list. */
typedef struct PolyIndex { typedef struct PolyIndex {
struct PolyIndex *next, *prev; struct PolyIndex *next, *prev;
uint index; uint32_t index;
eSign sign; eSign sign;
} PolyIndex; } PolyIndex;
@ -189,13 +189,13 @@ static eSign span_tri_v2_sign(const float v1[2], const float v2[2], const float
} }
#ifdef USE_KDTREE #ifdef USE_KDTREE
# define KDNODE_UNSET ((uint)-1) # define KDNODE_UNSET ((uint32_t)-1)
enum { enum {
KDNODE_FLAG_REMOVED = (1 << 0), KDNODE_FLAG_REMOVED = (1 << 0),
}; };
static void kdtree2d_new(struct KDTree2D *tree, uint tot, const float (*coords)[2]) static void kdtree2d_new(struct KDTree2D *tree, uint32_t tot, const float (*coords)[2])
{ {
/* set by caller */ /* set by caller */
// tree->nodes = nodes; // tree->nodes = nodes;
@ -207,10 +207,12 @@ static void kdtree2d_new(struct KDTree2D *tree, uint tot, const float (*coords)[
/** /**
* no need for kdtree2d_insert, since we know the coords array. * no need for kdtree2d_insert, since we know the coords array.
*/ */
static void kdtree2d_init(struct KDTree2D *tree, const uint coords_num, const PolyIndex *indices) static void kdtree2d_init(struct KDTree2D *tree,
const uint32_t coords_num,
const PolyIndex *indices)
{ {
KDTreeNode2D *node; KDTreeNode2D *node;
uint i; uint32_t i;
for (i = 0, node = tree->nodes; i < coords_num; i++) { for (i = 0, node = tree->nodes; i < coords_num; i++) {
if (indices[i].sign != CONVEX) { if (indices[i].sign != CONVEX) {
@ -222,14 +224,17 @@ static void kdtree2d_init(struct KDTree2D *tree, const uint coords_num, const Po
} }
} }
BLI_assert(tree->node_num == (uint)(node - tree->nodes)); BLI_assert(tree->node_num == (uint32_t)(node - tree->nodes));
} }
static uint kdtree2d_balance_recursive( static uint32_t kdtree2d_balance_recursive(KDTreeNode2D *nodes,
KDTreeNode2D *nodes, uint node_num, axis_t axis, const float (*coords)[2], const uint ofs) uint32_t node_num,
axis_t axis,
const float (*coords)[2],
const uint32_t ofs)
{ {
KDTreeNode2D *node; KDTreeNode2D *node;
uint neg, pos, median, i, j; uint32_t neg, pos, median, i, j;
if (node_num <= 0) { if (node_num <= 0) {
return KDNODE_UNSET; return KDNODE_UNSET;
@ -287,7 +292,7 @@ static void kdtree2d_balance(struct KDTree2D *tree)
static void kdtree2d_init_mapping(struct KDTree2D *tree) static void kdtree2d_init_mapping(struct KDTree2D *tree)
{ {
uint i; uint32_t i;
KDTreeNode2D *node; KDTreeNode2D *node;
for (i = 0, node = tree->nodes; i < tree->node_num; i++, node++) { for (i = 0, node = tree->nodes; i < tree->node_num; i++, node++) {
@ -306,9 +311,9 @@ static void kdtree2d_init_mapping(struct KDTree2D *tree)
tree->nodes[tree->root].parent = KDNODE_UNSET; tree->nodes[tree->root].parent = KDNODE_UNSET;
} }
static void kdtree2d_node_remove(struct KDTree2D *tree, uint index) static void kdtree2d_node_remove(struct KDTree2D *tree, uint32_t index)
{ {
uint node_index = tree->nodes_map[index]; uint32_t node_index = tree->nodes_map[index];
KDTreeNode2D *node; KDTreeNode2D *node;
if (node_index == KDNODE_UNSET) { if (node_index == KDNODE_UNSET) {
@ -327,7 +332,7 @@ static void kdtree2d_node_remove(struct KDTree2D *tree, uint index)
(node->parent != KDNODE_UNSET)) { (node->parent != KDNODE_UNSET)) {
KDTreeNode2D *node_parent = &tree->nodes[node->parent]; KDTreeNode2D *node_parent = &tree->nodes[node->parent];
BLI_assert((uint)(node - tree->nodes) == node_index); BLI_assert((uint32_t)(node - tree->nodes) == node_index);
if (node_parent->neg == node_index) { if (node_parent->neg == node_index) {
node_parent->neg = KDNODE_UNSET; node_parent->neg = KDNODE_UNSET;
} }
@ -347,7 +352,7 @@ static void kdtree2d_node_remove(struct KDTree2D *tree, uint index)
} }
static bool kdtree2d_isect_tri_recursive(const struct KDTree2D *tree, static bool kdtree2d_isect_tri_recursive(const struct KDTree2D *tree,
const uint tri_index[3], const uint32_t tri_index[3],
const float *tri_coords[3], const float *tri_coords[3],
const float tri_center[2], const float tri_center[2],
const struct KDRange2D bounds[2], const struct KDRange2D bounds[2],
@ -404,10 +409,10 @@ static bool kdtree2d_isect_tri_recursive(const struct KDTree2D *tree,
return false; return false;
} }
static bool kdtree2d_isect_tri(struct KDTree2D *tree, const uint ind[3]) static bool kdtree2d_isect_tri(struct KDTree2D *tree, const uint32_t ind[3])
{ {
const float *vs[3]; const float *vs[3];
uint i; uint32_t i;
struct KDRange2D bounds[2] = { struct KDRange2D bounds[2] = {
{FLT_MAX, -FLT_MAX}, {FLT_MAX, -FLT_MAX},
{FLT_MAX, -FLT_MAX}, {FLT_MAX, -FLT_MAX},
@ -432,7 +437,7 @@ static bool kdtree2d_isect_tri(struct KDTree2D *tree, const uint ind[3])
#endif /* USE_KDTREE */ #endif /* USE_KDTREE */
static uint *pf_tri_add(PolyFill *pf) static uint32_t *pf_tri_add(PolyFill *pf)
{ {
return pf->tris[pf->tris_num++]; return pf->tris[pf->tris_num++];
} }
@ -453,7 +458,7 @@ static void pf_coord_remove(PolyFill *pf, PolyIndex *pi)
pf->indices = pi->next; pf->indices = pi->next;
} }
#ifdef DEBUG #ifdef DEBUG
pi->index = (uint)-1; pi->index = (uint32_t)-1;
pi->next = pi->prev = NULL; pi->next = pi->prev = NULL;
#endif #endif
@ -544,14 +549,16 @@ static void pf_triangulate(PolyFill *pf)
} }
# endif # endif
#else #else
# ifdef USE_CLIP_SWEEP
if ((reverse ? pi_prev->prev : pi_next->next)->sign != CONVEX) { if ((reverse ? pi_prev->prev : pi_next->next)->sign != CONVEX) {
reverse = !reverse; reverse = !reverse;
} }
# endif
#endif #endif
} }
if (pf->coords_num == 3) { if (pf->coords_num == 3) {
uint *tri = pf_tri_add(pf); uint32_t *tri = pf_tri_add(pf);
pi_ear = pf->indices; pi_ear = pf->indices;
tri[0] = pi_ear->index; tri[0] = pi_ear->index;
pi_ear = pi_ear->next; pi_ear = pi_ear->next;
@ -584,10 +591,10 @@ static PolyIndex *pf_ear_tip_find(PolyFill *pf
) )
{ {
/* localize */ /* localize */
const uint coords_num = pf->coords_num; const uint32_t coords_num = pf->coords_num;
PolyIndex *pi_ear; PolyIndex *pi_ear;
uint i; uint32_t i;
/* Use two passes when looking for an ear. /* Use two passes when looking for an ear.
* *
@ -670,7 +677,7 @@ static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign si
#endif #endif
#if defined(USE_CONVEX_SKIP) && !defined(USE_KDTREE) #if defined(USE_CONVEX_SKIP) && !defined(USE_KDTREE)
uint coords_num_concave_checked = 0; uint32_t coords_num_concave_checked = 0;
#endif #endif
#ifdef USE_CONVEX_SKIP #ifdef USE_CONVEX_SKIP
@ -678,7 +685,7 @@ static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign si
# ifdef USE_CONVEX_SKIP_TEST # ifdef USE_CONVEX_SKIP_TEST
/* check if counting is wrong */ /* check if counting is wrong */
{ {
uint coords_num_concave_test = 0; uint32_t coords_num_concave_test = 0;
PolyIndex *pi_iter = pi_ear_tip; PolyIndex *pi_iter = pi_ear_tip;
do { do {
if (pi_iter->sign != CONVEX) { if (pi_iter->sign != CONVEX) {
@ -701,7 +708,7 @@ static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign si
#ifdef USE_KDTREE #ifdef USE_KDTREE
{ {
const uint ind[3] = {pi_ear_tip->index, pi_ear_tip->next->index, pi_ear_tip->prev->index}; const uint32_t ind[3] = {pi_ear_tip->index, pi_ear_tip->next->index, pi_ear_tip->prev->index};
if (kdtree2d_isect_tri(&pf->kdtree, ind)) { if (kdtree2d_isect_tri(&pf->kdtree, ind)) {
return false; return false;
@ -750,7 +757,7 @@ static bool pf_ear_tip_check(PolyFill *pf, PolyIndex *pi_ear_tip, const eSign si
static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip) static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip)
{ {
uint *tri = pf_tri_add(pf); uint32_t *tri = pf_tri_add(pf);
tri[0] = pi_ear_tip->prev->index; tri[0] = pi_ear_tip->prev->index;
tri[1] = pi_ear_tip->index; tri[1] = pi_ear_tip->index;
@ -764,15 +771,15 @@ static void pf_ear_tip_cut(PolyFill *pf, PolyIndex *pi_ear_tip)
*/ */
static void polyfill_prepare(PolyFill *pf, static void polyfill_prepare(PolyFill *pf,
const float (*coords)[2], const float (*coords)[2],
const uint coords_num, const uint32_t coords_num,
int coords_sign, int coords_sign,
uint (*r_tris)[3], uint32_t (*r_tris)[3],
PolyIndex *r_indices) PolyIndex *r_indices)
{ {
/* localize */ /* localize */
PolyIndex *indices = r_indices; PolyIndex *indices = r_indices;
uint i; uint32_t i;
/* assign all polyfill members here */ /* assign all polyfill members here */
pf->indices = r_indices; pf->indices = r_indices;
@ -810,7 +817,7 @@ static void polyfill_prepare(PolyFill *pf,
} }
else { else {
/* reversed */ /* reversed */
uint n = coords_num - 1; uint32_t n = coords_num - 1;
for (i = 0; i < coords_num; i++) { for (i = 0; i < coords_num; i++) {
indices[i].next = &indices[i + 1]; indices[i].next = &indices[i + 1];
indices[i].prev = &indices[i - 1]; indices[i].prev = &indices[i - 1];
@ -849,9 +856,9 @@ static void polyfill_calc(PolyFill *pf)
} }
void BLI_polyfill_calc_arena(const float (*coords)[2], void BLI_polyfill_calc_arena(const float (*coords)[2],
const uint coords_num, const uint32_t coords_num,
const int coords_sign, const int coords_sign,
uint (*r_tris)[3], uint32_t (*r_tris)[3],
struct MemArena *arena) struct MemArena *arena)
{ {
@ -894,9 +901,9 @@ void BLI_polyfill_calc_arena(const float (*coords)[2],
} }
void BLI_polyfill_calc(const float (*coords)[2], void BLI_polyfill_calc(const float (*coords)[2],
const uint coords_num, const uint32_t coords_num,
const int coords_sign, const int coords_sign,
uint (*r_tris)[3]) uint32_t (*r_tris)[3])
{ {
/* Fallback to heap memory for large allocations. /* Fallback to heap memory for large allocations.
* Avoid running out of stack memory on systems with 512kb stack (macOS). * Avoid running out of stack memory on systems with 512kb stack (macOS).