32 HULL_FLAG_INPUT = (1 << 0),
34 HULL_FLAG_INTERIOR_ELE = (1 << 1),
35 HULL_FLAG_OUTPUT_GEOM = (1 << 2),
37 HULL_FLAG_DEL = (1 << 3),
38 HULL_FLAG_HOLE = (1 << 4),
52static void hull_add_triangle(
64 for (
i = 0;
i < 3;
i++) {
102 BMFace *f, *example =
nullptr;
116 for (
i = 0;
i < 3;
i++) {
118 example = hull_find_example_face(
bm, edges[
i]);
131 for (
i = 0;
i < 3;
i++) {
137 for (
i = 0;
i < 3;
i++) {
138 const int next = (
i == 2 ? 0 :
i + 1);
149 for (
i = 0;
i < 3;
i++) {
157struct HullFinalEdges {
159 BLI_mempool *base_pool, *link_pool;
165 if (link->data ==
v) {
173static int hull_final_edges_lookup(HullFinalEdges *final_edges,
BMVert *v1,
BMVert *
v2)
187 return !!final_edges_find_link(adj,
v2);
191static HullFinalEdges *hull_final_edges(
BLI_mempool *hull_triangles)
193 HullFinalEdges *final_edges;
208 for (
i = 0;
i < 3;
i++) {
224 if (!final_edges_find_link(adj,
v2)) {
235static void hull_final_edges_free(HullFinalEdges *final_edges)
245static void hull_remove_overlapping(
BMesh *
bm,
247 HullFinalEdges *final_edges)
254 BMIter bm_iter1, bm_iter2;
265 if (!hull_final_edges_lookup(final_edges,
e->v1,
e->v2)) {
282static void hull_mark_interior_elements(
BMesh *
bm,
BMOperator *op, HullFinalEdges *final_edges)
290 if (!hull_final_edges_lookup(final_edges,
e->v1,
e->v2)) {
386 bool any_faces =
false;
396 if (hole && any_faces) {
402static int hull_input_vert_count(
BMOperator *op)
415static BMVert **hull_input_verts_copy(
BMOperator *op,
const int num_input_verts)
424 input_verts[
i++] =
v;
430static float (*hull_verts_for_bullet(
BMVert **input_verts,
const int num_input_verts))[3]
432 float (*coords)[3] =
static_cast<float (*)[3]
>(
433 MEM_callocN(
sizeof(*coords) * num_input_verts, __func__));
436 for (
i = 0;
i < num_input_verts;
i++) {
445 const int num_input_verts)
451 for (
i = 0;
i < num_verts;
i++) {
456 if (original_index >= 0 && original_index < num_input_verts) {
457 hull_verts[
i] = input_verts[original_index];
476 const int num_input_verts = hull_input_vert_count(op);
478 input_verts = hull_input_verts_copy(op, num_input_verts);
479 coords = hull_verts_for_bullet(input_verts, num_input_verts);
482 hull_verts = hull_verts_from_bullet(hull, input_verts, num_input_verts);
501 fv[0] = hull_verts[fvi[0]];
502 for (j = 2; j <
len; j++) {
503 fv[1] = hull_verts[fvi[j - 1]];
504 fv[2] = hull_verts[fvi[j]];
506 hull_add_triangle(
bm, hull_triangles, fv[0], fv[1], fv[2]);
519static bool hull_num_input_verts_is_ok(
BMOperator *op)
523 int partial_num_verts = 0;
527 if (partial_num_verts >= 3) {
532 return (partial_num_verts >= 3);
537 HullFinalEdges *final_edges;
543 if (!hull_num_input_verts_is_ok(op)) {
565 hull_from_bullet(
bm, op, hull_triangles);
567 final_edges = hull_final_edges(hull_triangles);
569 hull_mark_interior_elements(
bm, op, final_edges);
573 hull_remove_overlapping(
bm, hull_triangles, final_edges);
575 hull_tag_holes(
bm, op);
579 hull_final_edges_free(final_edges);
582 hull_output_triangles(
bm, hull_triangles);
585 hull_tag_unused(
bm, op);
#define BLI_assert_msg(a, msg)
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_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter) ATTR_NONNULL()
void * BLI_mempool_iterstep(BLI_mempool_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void * BLI_mempool_calloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
Read Guarded memory(de)allocation.
struct plConvexHull__ * plConvexHull
void BM_face_copy_shared(BMesh *bm, BMFace *f, BMLoopFilterFunc filter_fn, void *user_data)
copies face loop data from shared adjacent faces.
BMFace * BM_face_create_verts(BMesh *bm, BMVert **vert_arr, const int len, const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
void BMO_error_raise(BMesh *bm, BMOperator *owner, eBMOpErrorLevel level, const char *msg) ATTR_NONNULL(1
#define BM_ITER_ELEM(ele, iter, data, itype)
void BM_face_select_set(BMesh *bm, BMFace *f, const bool select)
Select Face.
#define BMO_vert_flag_disable(bm, e, oflag)
#define BMO_edge_flag_test(bm, e, oflag)
#define BMO_edge_flag_enable(bm, e, oflag)
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
#define BMO_face_flag_enable(bm, e, oflag)
#define BMO_ITER(ele, iter, slot_args, slot_name, restrict_flag)
#define BMO_vert_flag_test(bm, e, oflag)
#define BMO_face_flag_disable(bm, e, oflag)
#define BMO_face_flag_test(bm, e, oflag)
bool BMO_slot_bool_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
BMFace * BM_face_exists(BMVert *const *varr, int len)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
bool BM_vert_in_face(BMVert *v, BMFace *f)
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
void reinitialize(const int64_t new_size)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
int plConvexHullGetFaceSize(plConvexHull hull, int n)
void plConvexHullGetVertex(plConvexHull hull, int n, float coords[3], int *original_index)
int plConvexHullNumVertices(plConvexHull hull)
plConvexHull plConvexHullCompute(float(*coords)[3], int count)
void plConvexHullDelete(plConvexHull hull)
int plConvexHullNumFaces(plConvexHull hull)
void plConvexHullGetFaceVertices(plConvexHull hull, int n, int *vertices)
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]