22 #define COST_INIT_MAX FLT_MAX
34 const float v1[2],
const float v2[2],
const float v3[2],
bool skip_12,
bool skip_23)
43 const float cost = ((skip_12 ? 0.0f : cost_12) + (skip_23 ? 0.0f : cost_23));
68 const uint cd_loop_uv_offset =
params->cd_loop_uv_offset;
71 const float uv_a[2] = {luv_a->
uv[0], luv_a->
uv[1] /
params->aspect_y};
86 const float uv_b[2] = {luv_b->
uv[0], luv_b->
uv[1] /
params->aspect_y};
89 const float cost_cut =
params->use_topology_distance ? 1.0f :
len_v2v2(uv_a, uv_b);
90 const float cost_new = cost[l_a_index] + cost_cut;
92 if (cost[l_b_index] > cost_new) {
93 cost[l_b_index] = cost_new;
94 loops_prev[l_b_index] = l_a;
99 if (
params->use_step_face ==
false) {
114 bool (*filter_fn)(
BMLoop *,
void *),
136 }
while ((l_iter = l_iter->
next) != l_first);
142 loops_prev =
MEM_callocN(
sizeof(*loops_prev) * totloop, __func__);
143 cost =
MEM_mallocN(
sizeof(*cost) * totloop, __func__);
187 BMLoop *l_e_a,
BMLoop *l_e_b,
BMLoop *l_v,
const float aspect_y,
const int cd_loop_uv_offset)
189 BMLoop *l_v1 = (l_v->
v == l_e_a->
v) ? l_e_a->
next : l_e_a;
190 BMLoop *l_v2 = (l_v->
v == l_e_b->
v) ? l_e_b->
next : l_e_b;
196 float uv_v1[2] = {luv_v1->
uv[0], luv_v1->
uv[1] / aspect_y};
197 float uv_v2[2] = {luv_v2->
uv[0], luv_v2->
uv[1] / aspect_y};
198 float uv_v[2] = {luv_v->
uv[0], luv_v->
uv[1] / aspect_y};
204 BMLoop *l_e_a,
BMLoop *l_e_b,
BMFace *f,
const float aspect_v2[2],
const int cd_loop_uv_offset)
206 float l_e_a_cent[2], l_e_b_cent[2], f_cent[2];
228 const uint cd_loop_uv_offset =
params->cd_loop_uv_offset;
232 if (
params->use_step_face ==
false) {
233 for (
int i = 0; i <
ARRAY_SIZE(l_a_verts); i++) {
236 if (loops_prev[l_a_index]) {
237 BMLoop *l_prev = loops_prev[l_a_index];
238 if (l_a_verts[i]->
v != l_prev->
v) {
239 l_prev = (l_a_verts[i]->
v == l_prev->
next->
v) ? l_prev->
next :
NULL;
250 l_first =
l_b = e_b->
l;
257 const float cost_cut =
params->use_topology_distance ?
264 const float cost_new = cost[l_a_index] + cost_cut;
266 if (cost[l_b_index] > cost_new) {
267 cost[l_b_index] = cost_new;
268 loops_prev[l_b_index] = l_a;
278 const float aspect_v2[2] = {1.0f, 1.0f /
params->aspect_y};
280 l_iter = l_first = l_a;
287 BMLoop *l_cycle_iter, *l_cycle_end;
288 l_cycle_iter = l_iter->
next;
289 l_cycle_end = l_iter;
295 const float cost_cut =
params->use_topology_distance ?
301 params->cd_loop_uv_offset);
302 const float cost_new = cost[l_a_index] + cost_cut;
304 if (cost[l_b_index] > cost_new) {
305 cost[l_b_index] = cost_new;
306 loops_prev[l_b_index] = l_a;
310 }
while ((l_cycle_iter = l_cycle_iter->
next) != l_cycle_end);
311 }
while ((l_iter = l_iter->
radial_next) != l_first);
319 bool (*filter_fn)(
BMLoop *,
void *),
338 }
while ((l_iter = l_iter->
next) != l_first);
343 loops_prev =
MEM_callocN(
sizeof(*loops_prev) * totloop, __func__);
344 cost =
MEM_mallocN(
sizeof(*cost) * totloop, __func__);
389 const void *
const f_endpoints[2],
390 const float aspect_v2[2],
391 const int cd_loop_uv_offset)
415 else if (factor > 1.0f) {
430 f_a_cent, e_cent, f_b_cent, (f_a == f_endpoints[0]), (f_b == f_endpoints[1]));
436 const void *
const f_endpoints[2],
437 const float aspect_v2[2],
438 const int cd_loop_uv_offset)
454 f_a_cent, v_cent, f_b_cent, (f_a == f_endpoints[0]), (f_b == f_endpoints[1]));
461 const void *
const f_endpoints[2],
462 const float aspect_v2[2],
465 const uint cd_loop_uv_offset =
params->cd_loop_uv_offset;
485 const float cost_cut =
486 params->use_topology_distance ?
489 f_a, f_b, l_iter, f_endpoints, aspect_v2, cd_loop_uv_offset);
490 const float cost_new = cost[f_a_index] + cost_cut;
492 if (cost[f_b_index] > cost_new) {
493 cost[f_b_index] = cost_new;
494 faces_prev[f_b_index] = f_a;
499 }
while ((l_iter = l_iter->
radial_next) != l_first);
504 if (
params->use_step_face) {
518 const float cost_cut =
519 params->use_topology_distance ?
522 f_a, f_b, l_a, f_endpoints, aspect_v2, cd_loop_uv_offset);
523 const float cost_new = cost[f_a_index] + cost_cut;
525 if (cost[f_b_index] > cost_new) {
526 cost[f_b_index] = cost_new;
527 faces_prev[f_b_index] = f_a;
542 bool (*filter_fn)(
BMFace *,
void *),
545 const float aspect_v2[2] = {1.0f, 1.0f /
params->aspect_y};
555 const void *
const f_endpoints[2] = {f_src, f_dst};
572 faces_prev =
MEM_callocN(
sizeof(*faces_prev) * totface, __func__);
573 cost =
MEM_mallocN(
sizeof(*cost) * totface, __func__);
A min-heap / priority queue ADT.
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)
void BLI_heapsimple_insert(HeapSimple *heap, float value, void *ptr) ATTR_NONNULL(1)
void void BLI_linklist_prepend(LinkNode **listp, void *ptr) ATTR_NONNULL(1)
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
int isect_line_line_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float r_vi[2])
MINLINE void mul_v2_v2(float r[2], const float a[2])
MINLINE void copy_v2_v2(float r[2], const float a[2])
void copy_vn_fl(float *array_tar, int size, float val)
MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
void mid_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v2(float r[2])
_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_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_index_get(ele)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
static float edgetag_cut_cost_face_uv(BMLoop *l_e_a, BMLoop *l_e_b, BMFace *f, const float aspect_v2[2], const int cd_loop_uv_offset)
static void edgetag_add_adjacent_uv(HeapSimple *heap, BMLoop *l_a, BMLoop **loops_prev, float *cost, const struct BMCalcPathUVParams *params)
struct LinkNode * BM_mesh_calc_path_uv_vert(BMesh *bm, BMLoop *l_src, BMLoop *l_dst, const struct BMCalcPathUVParams *params, bool(*filter_fn)(BMLoop *, void *), void *user_data)
static float edgetag_cut_cost_vert_uv(BMLoop *l_e_a, BMLoop *l_e_b, BMLoop *l_v, const float aspect_y, const int cd_loop_uv_offset)
static void facetag_add_adjacent_uv(HeapSimple *heap, BMFace *f_a, BMFace **faces_prev, float *cost, const void *const f_endpoints[2], const float aspect_v2[2], const struct BMCalcPathUVParams *params)
static float step_cost_3_v2(const float v1[2], const float v2[2], const float v3[2])
struct LinkNode * BM_mesh_calc_path_uv_face(BMesh *bm, BMFace *f_src, BMFace *f_dst, const struct BMCalcPathUVParams *params, bool(*filter_fn)(BMFace *, void *), void *user_data)
static void verttag_add_adjacent_uv(HeapSimple *heap, BMLoop *l_a, BMLoop **loops_prev, float *cost, const struct BMCalcPathUVParams *params)
struct LinkNode * BM_mesh_calc_path_uv_edge(BMesh *bm, BMLoop *l_src, BMLoop *l_dst, const struct BMCalcPathUVParams *params, bool(*filter_fn)(BMLoop *, void *), void *user_data)
static float step_cost_3_v2_ex(const float v1[2], const float v2[2], const float v3[2], bool skip_12, bool skip_23)
static float facetag_cut_cost_edge_uv(BMFace *f_a, BMFace *f_b, BMLoop *l_edge, const void *const f_endpoints[2], const float aspect_v2[2], const int cd_loop_uv_offset)
static float facetag_cut_cost_vert_uv(BMFace *f_a, BMFace *f_b, BMLoop *l_vert, const void *const f_endpoints[2], const float aspect_v2[2], const int cd_loop_uv_offset)
bool BM_loop_share_edge_check(BMLoop *l_a, BMLoop *l_b)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
ATTR_WARN_UNUSED_RESULT const BMVert * v
bool BM_loop_uv_share_vert_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
bool BM_loop_uv_share_edge_check(BMLoop *l_a, BMLoop *l_b, const int cd_loop_uv_offset)
void BM_face_uv_calc_center_median_weighted(const BMFace *f, const float aspect[2], const int cd_loop_uv_offset, float r_cent[2])
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
struct BMLoop * radial_next