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 {
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;
195 final_edges =
static_cast<HullFinalEdges *
>(
196 MEM_callocN(
sizeof(HullFinalEdges),
"HullFinalEdges"));
209 for (i = 0; i < 3; i++) {
225 if (!final_edges_find_link(adj,
v2)) {
236static void hull_final_edges_free(HullFinalEdges *final_edges)
246static void hull_remove_overlapping(
BMesh *
bm,
248 HullFinalEdges *final_edges)
255 BMIter bm_iter1, bm_iter2;
266 if (!hull_final_edges_lookup(final_edges,
e->v1,
e->v2)) {
283static void hull_mark_interior_elements(
BMesh *
bm,
BMOperator *op, HullFinalEdges *final_edges)
291 if (!hull_final_edges_lookup(final_edges,
e->v1,
e->v2)) {
387 bool any_faces =
false;
397 if (hole && any_faces) {
403static int hull_input_vert_count(
BMOperator *op)
416static BMVert **hull_input_verts_copy(
BMOperator *op,
const int num_input_verts)
421 MEM_callocN(
sizeof(*input_verts) * num_input_verts, AT));
425 input_verts[i++] =
v;
431static float (*hull_verts_for_bullet(
BMVert **input_verts,
const int num_input_verts))[3]
433 float(*coords)[3] =
static_cast<float(*)[3]
>(
434 MEM_callocN(
sizeof(*coords) * num_input_verts, __func__));
437 for (i = 0; i < num_input_verts; i++) {
446 const int num_input_verts)
452 for (i = 0; i < num_verts; i++) {
457 if (original_index >= 0 && original_index < num_input_verts) {
458 hull_verts[i] = input_verts[original_index];
477 const int num_input_verts = hull_input_vert_count(op);
479 input_verts = hull_input_verts_copy(op, num_input_verts);
480 coords = hull_verts_for_bullet(input_verts, num_input_verts);
483 hull_verts = hull_verts_from_bullet(hull, input_verts, num_input_verts);
487 for (i = 0; i <
count; i++) {
495 fvi.reinitialize(
len);
502 fv[0] = hull_verts[fvi[0]];
503 for (j = 2; j <
len; j++) {
504 fv[1] = hull_verts[fvi[j - 1]];
505 fv[2] = hull_verts[fvi[j]];
507 hull_add_triangle(
bm, hull_triangles, fv[0], fv[1], fv[2]);
520static bool hull_num_input_verts_is_ok(
BMOperator *op)
524 int partial_num_verts = 0;
528 if (partial_num_verts >= 3) {
533 return (partial_num_verts >= 3);
538 HullFinalEdges *final_edges;
544 if (!hull_num_input_verts_is_ok(op)) {
566 hull_from_bullet(
bm, op, hull_triangles);
568 final_edges = hull_final_edges(hull_triangles);
570 hull_mark_interior_elements(
bm, op, final_edges);
574 hull_remove_overlapping(
bm, hull_triangles, final_edges);
576 hull_tag_holes(
bm, op);
580 hull_final_edges_free(final_edges);
583 hull_output_triangles(
bm, hull_triangles);
586 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(struct 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.
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
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
draw_view in_light_buf[] float
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
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]