forked from blender/blender
WIP: uv-simple-select #1
@ -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).
|
||||||
|
Loading…
Reference in New Issue
Block a user