40 #define CONNECT_EPS 0.0001f
42 #define VERT_EXCLUDE 2
45 #define FACE_EXCLUDE 2
50 #define FACE_WALK_TEST(f) \
51 (CHECK_TYPE_INLINE(f, BMFace *), BMO_face_flag_test(pc->bm_bmoflag, f, FACE_EXCLUDE) == 0)
52 #define VERT_WALK_TEST(v) \
53 (CHECK_TYPE_INLINE(v, BMVert *), BMO_vert_flag_test(pc->bm_bmoflag, v, VERT_EXCLUDE) == 0)
56 # define ELE_TOUCH_TEST(e) \
57 (CHECK_TYPE_ANY(e, BMVert *, BMEdge *, BMElem *, BMElemF *), \
58 BMO_elem_flag_test(pc->bm_bmoflag, (BMElemF *)e, ELE_TOUCHED))
60 #define ELE_TOUCH_MARK(e) \
62 CHECK_TYPE_ANY(e, BMVert *, BMEdge *, BMElem *, BMElemF *); \
63 BMO_elem_flag_enable(pc->bm_bmoflag, (BMElemF *)e, ELE_TOUCHED); \
67 #define ELE_TOUCH_TEST_VERT(v) BMO_vert_flag_test(pc->bm_bmoflag, v, ELE_TOUCHED)
70 #define ELE_TOUCH_TEST_EDGE(e) BMO_edge_flag_test(pc->bm_bmoflag, e, ELE_TOUCHED)
130 #define MIN_DIST_DIR_INIT \
140 if (mddir->
dist_min[0] == FLT_MAX) {
144 if (dist_sq < mddir->dist_min[0]) {
149 if (dist_sq < mddir->dist_min[1]) {
171 const int test_a = (
fabsf(diff_a) <
CONNECT_EPS) ? 0 : (diff_a < 0.0f) ? -1 : 1;
172 const int test_b = (
fabsf(diff_b) <
CONNECT_EPS) ? 0 : (diff_b < 0.0f) ? -1 : 1;
174 if ((test_a && test_b) && (test_a != test_b)) {
190 float diff_a, diff_b, diff_tot;
194 diff_tot = (diff_a + diff_b);
195 return (diff_tot > FLT_EPSILON) ? (diff_a / diff_tot) : 0.5f;
218 if (link->
ele == ele) {
221 }
while ((link = link->
next));
237 printf(
"%s: adding to state %p, %.4f - ", __func__,
state,
state->dist);
248 if (ele_from ==
NULL) {
249 printf(
"from NULL\n");
285 state->link_last = step_new;
291 *
state = *state_orig;
347 l_iter_best[index] = l_iter;
351 }
while ((l_iter = l_iter->
next) != l_last);
353 for (i = 0; i < 2; i++) {
354 if ((l_iter = l_iter_best[i])) {
378 const float *co_isect = l_iter->
v->
co;
392 l_iter_best[index] = l_iter;
396 }
while ((l_iter = l_iter->
next) != l_last);
398 for (i = 0; i < 2; i++) {
399 if ((l_iter = l_iter_best[i])) {
413 const void *ele_from =
state->link_last->ele_from;
427 pc,
state, &state_orig, l_start->
next->
next, l_start, &mddir);
444 pc,
state, &state_orig, l_start->
next, l_start->
prev, &mddir);
445 if (l_start->
f->
len > 3) {
483 const float eps = 1e-8f;
489 sub_v3_v3v3(basis_dir, v_pair[0]->co, v_pair[1]->co);
493 add_v3_v3v3(basis_nor, v_pair[0]->no, v_pair[1]->no);
499 float basis_nor_a[3];
500 float basis_nor_b[3];
511 if (
dot_v3v3(basis_nor_a, basis_nor_b) < 0.0f) {
533 for (i = 0; i < 2; i++) {
538 axis_pair[i].angle_cos = -FLT_MAX;
541 float basis_dir_proj[3];
542 float angle_cos_test;
548 angle_cos_test =
dot_v3v3(basis_dir_proj, basis_dir);
550 if (angle_cos_test > axis_pair[i].angle_cos) {
551 axis_pair[i].angle_cos = angle_cos_test;
561 copy_v3_v3(basis_nor, axis_pair[axis_pair[0].angle_cos < axis_pair[1].angle_cos].
nor);
590 if (op_verts_slot->
len != 2) {
600 if (!(pc.
v_a && pc.
v_b)) {
643 bool continue_search;
648 printf(
"%s: state %p loop found %.4f\n", __func__,
state,
state->dist);
654 continue_search =
false;
657 continue_search =
true;
664 printf(
"%s: state %p removed\n", __func__,
state);
666 continue_search =
false;
669 if (continue_search) {
698 }
while ((link = link->
next));
714 "connect_verts verts=%fv faces_exclude=%s check_degenerate=%b",
A min-heap / priority queue ADT.
void BLI_heapsimple_clear(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp) ATTR_NONNULL(1)
void BLI_heapsimple_free(HeapSimple *heap, HeapSimpleFreeFP ptrfreefp) ATTR_NONNULL(1)
HeapSimple * BLI_heapsimple_new(void) ATTR_WARN_UNUSED_RESULT
void * BLI_heapsimple_pop_min(HeapSimple *heap) ATTR_NONNULL(1)
bool BLI_heapsimple_is_empty(const HeapSimple *heap) ATTR_NONNULL(1)
uint BLI_heapsimple_len(const HeapSimple *heap) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_heapsimple_insert(HeapSimple *heap, float value, void *ptr) ATTR_NONNULL(1)
void unit_m3(float m[3][3])
bool invert_m3(float R[3][3])
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float dot_m3_v3_row_x(const float M[3][3], const float a[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
void project_plane_normalized_v3_v3v3(float out[3], const float p[3], const float v_plane[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
void ortho_v3_v3(float out[3], const float v[3])
MINLINE void negate_v3(float r[3])
MINLINE void zero_v2(float r[2])
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_alloc(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)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define BM_elem_index_get(ele)
#define BM_ITER_ELEM(ele, iter, data, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMVert * BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float fac)
Edge Split.
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
BMO_FLAG_BUFFER.
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
#define BMO_slot_copy(op_src, slots_src, slot_name_src, op_dst, slots_dst, slot_name_dst)
bool BMO_op_initf(BMesh *bm, BMOperator *op, int flag, const char *fmt,...)
void BMO_op_finish(BMesh *bm, BMOperator *op)
BMESH OPSTACK FINISH OP.
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define ELE_TOUCH_TEST_VERT(v)
static int state_isect_co_exact(const PathContext *pc, const float co[3])
struct MinDistDir MinDistDir
static PathLinkState * state_dupe_add(PathLinkState *state, const PathLinkState *state_orig)
struct PathContext PathContext
#define FACE_WALK_TEST(f)
static int min_dist_dir_test(MinDistDir *mddir, const float dist_dir[3], const float dist_sq)
static PathLinkState * state_link_add_test(PathContext *pc, PathLinkState *state, const PathLinkState *state_orig, BMElem *ele, BMElem *ele_from)
#define VERT_WALK_TEST(v)
static bool state_step(PathContext *pc, PathLinkState *state)
static PathLinkState * state_step__face_edges(PathContext *pc, PathLinkState *state, const PathLinkState *state_orig, BMLoop *l_iter, BMLoop *l_last, MinDistDir *mddir)
void bmo_connect_vert_pair_exec(BMesh *bm, BMOperator *op)
struct PathLinkState PathLinkState
static PathLinkState * state_step__face_verts(PathContext *pc, PathLinkState *state, const PathLinkState *state_orig, BMLoop *l_iter, BMLoop *l_last, MinDistDir *mddir)
static float state_calc_co_pair_fac(const PathContext *pc, const float co_a[3], const float co_b[3])
static void min_dist_dir_update(MinDistDir *dist, const float dist_dir[3])
static bool state_link_find(const PathLinkState *state, BMElem *ele)
#define ELE_TOUCH_MARK(e)
#define ELE_TOUCH_TEST_EDGE(e)
static int state_isect_co_pair(const PathContext *pc, const float co_a[3], const float co_b[3])
static void state_link_add(PathContext *pc, PathLinkState *state, BMElem *ele, BMElem *ele_from)
static void bm_vert_pair_to_matrix(BMVert *v_pair[2], float r_unit_mat[3][3])
#define MIN_DIST_DIR_INIT
static void state_calc_co_pair(const PathContext *pc, const float co_a[3], const float co_b[3], float r_co[3])
static double op_sub(double a, double b)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt=1)
union BMOpSlot::@145 data
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]
struct PathLink * link_last