42 if (ele_src_1 == ele_dst) {
49 else if (fac >= 1.0f) {
50 if (ele_src_2 == ele_dst) {
103 BMLoop *l_v1 =
nullptr, *l_v =
nullptr, *l_v2 =
nullptr;
115 if (l_iter->
v == v_src_1) {
120 else if (l_iter->
v ==
v) {
126 if (!l_v1 || !l_v2) {
132 src[1] = l_v2->head.data;
141 const bool do_vertex,
142 const void **blocks_l,
143 const void **blocks_v,
145 float axis_mat[3][3])
162 }
while ((l_iter = l_iter->
next) != l_first);
170 const void **blocks_l =
static_cast<const void **
>(
BLI_array_alloca(blocks_l, f_src->
len));
171 const void **blocks_v = do_vertex ?
175 float axis_mat[3][3];
190 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
210 const float l_f_center[3],
251 float projverts[5][3], n2[3];
252 const float origin[2] = {0.0f, 0.0f};
262 normal_quad_v3(n2, projverts[0], projverts[1], projverts[2], projverts[3]);
264 if (
dot_v3v3(n, n2) < -FLT_EPSILON) {
272 for (
i = 0;
i < 4;
i++) {
276 if (!
isect_point_quad_v2(origin, projverts[0], projverts[1], projverts[2], projverts[3])) {
280 resolve_quad_uv_v2(r_uv, origin, projverts[0], projverts[3], projverts[2], projverts[1]);
307 const float l_dst_f_center[3],
314 float v1[3],
v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
315 float eps = FLT_EPSILON * 4000;
355 const float target_axis_x[3],
356 const float target_axis_y[3],
357 const float coord[3],
361 mat[0][0] = target_axis_x[
i];
362 mat[0][1] = target_axis_y[
i];
363 mat[1][0] = target_axis_x[j];
364 mat[1][1] = target_axis_y[j];
372 const float source_axis_y[3],
373 const float target_axis_x[3],
374 const float target_axis_y[3],
377 float vx[3], vy[3], coord[3];
379 float b[2], mat[2][2], d;
392 if (
fabsf(d) < 1e-4f) {
394 if (
fabsf(d) < 1e-4f) {
399 disp[0] = (
b[0] * mat[1][1] - mat[0][1] *
b[1]) / d;
400 disp[1] = (mat[0][0] *
b[1] -
b[0] * mat[1][0]) / d;
427 const int cd_loop_mdisp_offset =
data->cd_loop_mdisp_offset;
430 const float *f_src_center =
data->f_src_center;
432 float *axis_x =
data->axis_x;
433 float *axis_y =
data->axis_y;
435 float *v1 =
data->v1;
436 float *v4 =
data->v4;
437 float *e1 =
data->e1;
438 float *e2 =
data->e2;
440 const int res =
data->res;
441 const float d =
data->d;
445 for (
y = 0.0f, iy = 0; iy < res;
y += d, iy++) {
447 float co1[3], co2[3], co[3];
455 float src_axis_x[3], src_axis_y[3];
460 if (
mdisp_in_mdispquad(l_dst, l_iter, f_src_center, co, res, src_axis_x, src_axis_y, uv)) {
466 }
while ((l_iter = l_iter->
next) != l_first);
473 const float f_dst_center[3],
474 const float f_src_center[3],
475 const int cd_loop_mdisp_offset)
478 float v1[3],
v2[3], v3[3], v4[3] = {0.0f, 0.0f, 0.0f}, e1[3], e2[3];
479 float axis_x[3], axis_y[3];
497 md_dst->
disps =
static_cast<float(*)[3]
>(
511 data.cd_loop_mdisp_offset = cd_loop_mdisp_offset;
512 data.md_dst = md_dst;
513 data.f_src_center = f_src_center;
514 data.axis_x = axis_x;
515 data.axis_y = axis_y;
521 data.d = 1.0f / float(res - 1);
533 if (cd_loop_mdisp_offset != -1) {
534 float f_dst_center[3];
535 float f_src_center[3];
547 const float f_dst_center[3],
548 const float f_src_center[3],
549 const int cd_loop_mdisp_offset)
555 bm, l_iter, f_src, f_dst_center, f_src_center, cd_loop_mdisp_offset);
556 }
while ((l_iter = l_iter->
next) != l_first);
563 if (cd_loop_mdisp_offset != -1) {
564 float f_dst_center[3];
565 float f_src_center[3];
580 if (cd_loop_mdisp_offset == -1) {
608 for (
y = 0;
y < sides;
y++) {
619 float co1[3], co2[3], co[3];
638 if (
l->radial_next ==
l) {
642 if (
l->radial_next->v ==
l->v) {
646 mdl2 =
static_cast<MDisps *
>(
651 for (
y = 0;
y < sides;
y++) {
654 if (
l->v !=
l->radial_next->v) {
655 a1 = sides *
y + sides - 2;
656 a2 = (sides - 2) * sides +
y;
658 o1 = sides *
y + sides - 1;
659 o2 = (sides - 1) * sides +
y;
662 a1 = sides *
y + sides - 2;
663 a2 = sides *
y + sides - 2;
664 o1 = sides *
y + sides - 1;
665 o2 = sides *
y + sides - 1;
684 BMesh *
bm,
BMLoop *l_dst,
const BMFace *f_src,
const bool do_vertex,
const bool do_multires)
688 const void **vblocks = do_vertex ?
694 float axis_mat[3][3];
698 float axis_dominant[3];
700 BLI_assert(BM_face_is_normal_valid(f_src));
701 copy_v3_v3(axis_dominant, f_src->no);
707 BM_face_calc_tangent_auto(f_src, vec);
708 ortho_v3_v3(axis_dominant, vec);
709 normalize_v3(axis_dominant);
722 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
745 float axis_mat[3][3];
757 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
786 else if (
data == &
bm->edata) {
798 else if (
data == &
bm->ldata) {
809 l->head.data = block;
813 else if (
data == &
bm->pdata) {
845 data->pool =
nullptr;
862 data->pool =
nullptr;
882 for (
int l = 0;
l < nr_uv_layers;
l++) {
948 data->pool =
nullptr;
968 data->pool =
nullptr;
994 data->pool =
nullptr;
1012 if (&
bm->vdata ==
data) {
1020 else if (&
bm->edata ==
data) {
1028 else if (&
bm->pdata ==
data) {
1036 else if (&
bm->ldata ==
data) {
1056 const float *f =
static_cast<const float *
>(
1058 return f ? *f : 0.0f;
1063 float *f =
static_cast<float *
>(
1154 for (
i = 0;
i < 2;
i++) {
1155 BMLoop *l_other = ((
i == 0) ? l_walk : l_walk->
prev)->radial_next;
1157 if (l_other->
v != l_walk->
v) {
1158 l_other = l_other->
next;
1182 lwc.
type =
bm->ldata.layers[layer_n].type;
1240 const int type =
bm->ldata.layers[layer_n].type;
1242 const float *data_weights;
1244 data_weights =
lf->data_weights;
1247 &
bm->ldata, (
const void **)
lf->data, data_weights,
nullptr,
lf->data_len, data_tmp, layer_n);
1249 for (
i = 0;
i <
lf->data_len;
i++) {
1255 BMesh *
bm,
void *lf_p,
const int layer_n,
void *data_tmp,
const float *loop_weights)
1258 const int type =
bm->ldata.layers[layer_n].type;
1260 const float *data_weights;
1263 float *temp_weights =
static_cast<float *
>(
BLI_array_alloca(temp_weights,
lf->data_len));
1264 float weight_accum = 0.0f;
1266 for (
i = 0;
i <
lf->data_len;
i++) {
1267 float w = loop_weights[
lf->data_index[
i]] *
lf->data_weights[
i];
1268 temp_weights[
i] =
w;
1272 if (
LIKELY(weight_accum != 0.0f)) {
1273 mul_vn_fl(temp_weights,
lf->data_len, 1.0f / weight_accum);
1274 data_weights = temp_weights;
1277 data_weights =
lf->data_weights;
1281 &
bm->ldata, (
const void **)
lf->data, data_weights,
nullptr,
lf->data_len, data_tmp, layer_n);
1283 for (
i = 0;
i <
lf->data_len;
i++) {
1290 const int type =
bm->ldata.layers[layer_n].type;
1292 void *data_tmp = alloca(
size);
1296 }
while ((groups = groups->
next));
1302 const float *loop_weights)
1304 const int type =
bm->ldata.layers[layer_n].type;
1306 void *data_tmp = alloca(
size);
1310 bm, groups->
link, layer_n, data_tmp, loop_weights);
1311 }
while ((groups = groups->
next));
Generic geometry attributes built on CustomData.
blender::StringRef BKE_uv_map_pin_name_get(blender::StringRef uv_map_name, char *buffer)
blender::StringRef BKE_uv_map_edge_select_name_get(blender::StringRef uv_map_name, char *buffer)
blender::StringRef BKE_uv_map_vert_select_name_get(blender::StringRef uv_map_name, char *buffer)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_sizeof(eCustomDataType type)
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
int CustomData_get_layer_index_n(const CustomData *data, eCustomDataType type, int n)
void CustomData_copy_elements(eCustomDataType type, void *src_data_ofs, void *dst_data_ofs, int count)
void CustomData_bmesh_free_block(CustomData *data, void **block)
void * CustomData_add_layer_named(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem, blender::StringRef name)
BMCustomDataCopyMap CustomData_bmesh_copy_map_calc(const CustomData &src, const CustomData &dst, eCustomDataMask mask_exclude=0)
void CustomData_bmesh_init_pool(CustomData *data, int totelem, char htype)
void * CustomData_bmesh_get_n(const CustomData *data, void *block, eCustomDataType type, int n)
bool CustomData_free_layer(CustomData *data, eCustomDataType type, int index)
int CustomData_get_named_layer_index(const CustomData *data, eCustomDataType type, blender::StringRef name)
const char * CustomData_get_layer_name(const CustomData *data, eCustomDataType type, int n)
void * CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type)
void CustomData_bmesh_interp(CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block)
void CustomData_bmesh_set_n(CustomData *data, void *block, eCustomDataType type, int n, const void *source)
void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
bool CustomData_data_equals(eCustomDataType type, const void *data1, const void *data2)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type)
void CustomData_bmesh_interp_n(CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block_ofs, int n)
void old_mdisps_bilinear(float out[3], float(*disps)[3], int st, float u, float v)
#define BLI_array_alloca(arr, realsize)
void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, struct MemArena *ma) ATTR_NONNULL(1
int isect_point_quad_v2(const float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2])
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void resolve_quad_uv_v2(float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2])
void axis_dominant_v3_to_m3(float r_mat[3][3], const float normal[3])
Normal to x,y matrix.
void interp_weights_poly_v2(float w[], float v[][2], int n, const float co[2])
void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3])
void mid_v3_v3v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
void mul_vn_fl(float *array_tar, int size, float f)
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE bool equals_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void copy_vn_fl(float *array_tar, int size, float val)
void project_v3_v3v3(float out[3], const float p[3], const float v_proj[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])
MINLINE float cross_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
void * BLI_memarena_alloc(MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
#define UNUSED_FUNCTION(x)
#define UNUSED_VARS_NDEBUG(...)
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_disable(ele, hflag)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
void BM_face_interp_multires(BMesh *bm, BMFace *f_dst, const BMFace *f_src)
void BM_uv_map_attr_edge_select_ensure(BMesh *bm, const StringRef uv_map_name)
static int compute_mdisp_quad(const BMLoop *l, const float l_f_center[3], float v1[3], float v2[3], float v3[3], float v4[3], float e1[3], float e2[3])
Multires Interpolation.
bool BM_data_layer_free_named(BMesh *bm, CustomData *data, StringRef name)
static void bm_loop_walk_add(LoopWalkCtx *lwc, BMLoop *l)
void BM_data_layer_free_n(BMesh *bm, CustomData *data, int type, int n)
void BM_data_layer_free(BMesh *bm, CustomData *data, int type)
float BM_elem_float_data_get(CustomData *cd, void *element, int type)
void BM_vert_interp_from_face(BMesh *bm, BMVert *v_dst, const BMFace *f_src)
static void loop_interp_multires_cb(void *__restrict userdata, const int ix, const TaskParallelTLS *__restrict)
void BM_uv_map_attr_select_and_pin_ensure(BMesh *bm)
bool BM_uv_map_attr_pin_exists(const BMesh *bm, const StringRef uv_map_name)
bool BM_uv_map_attr_vert_select_exists(const BMesh *bm, const StringRef uv_map_name)
void BM_face_interp_multires_ex(BMesh *bm, BMFace *f_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int dst_n)
void BM_vert_loop_groups_data_layer_merge(BMesh *bm, LinkNode *groups, const int layer_n)
static void bm_vert_loop_groups_data_layer_merge__single(BMesh *bm, void *lf_p, int layer_n, void *data_tmp)
void BM_vert_loop_groups_data_layer_merge_weights(BMesh *bm, LinkNode *groups, const int layer_n, const float *loop_weights)
void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const StringRef name)
void BM_face_interp_from_face_ex(BMesh *bm, BMFace *f_dst, const BMFace *f_src, const bool do_vertex, const void **blocks_l, const void **blocks_v, float(*cos_2d)[2], float axis_mat[3][3])
Data Interpolate From Face.
static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
static bool mdisp_in_mdispquad(BMLoop *l_src, BMLoop *l_dst, const float l_dst_f_center[3], const float p[3], int res, float r_axis_x[3], float r_axis_y[3], float r_uv[2])
void BM_loop_interp_multires(BMesh *bm, BMLoop *l_dst, const BMFace *f_src)
void BM_data_layer_add(BMesh *bm, CustomData *data, int type)
void BM_data_interp_from_edges(BMesh *bm, const BMEdge *e_src_1, const BMEdge *e_src_2, BMEdge *e_dst, const float fac)
Data, Interpolate From Edges.
void BM_face_interp_from_face(BMesh *bm, BMFace *f_dst, const BMFace *f_src, const bool do_vertex)
void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
static void bm_loop_walk_data(LoopWalkCtx *lwc, BMLoop *l_walk)
void BM_loop_interp_from_face(BMesh *bm, BMLoop *l_dst, const BMFace *f_src, const bool do_vertex, const bool do_multires)
void BM_data_interp_face_vert_edge(BMesh *bm, const BMVert *v_src_1, const BMVert *, BMVert *v, BMEdge *e, const float fac)
Data Face-Vert Edge Interpolate.
void BM_uv_map_attr_pin_ensure(BMesh *bm, const StringRef uv_map_name)
static bool quad_co(const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float p[3], const float n[3], float r_uv[2])
static void mdisp_axis_from_quad(const float v1[3], const float v2[3], float[3], const float v4[3], float r_axis_x[3], float r_axis_y[3])
LinkNode * BM_vert_loop_groups_data_layer_create(BMesh *bm, BMVert *v, const int layer_n, const float *loop_weights, MemArena *arena)
static void bm_vert_loop_groups_data_layer_merge_weights__single(BMesh *bm, void *lf_p, const int layer_n, void *data_tmp, const float *loop_weights)
static float bm_loop_flip_equotion(float mat[2][2], float b[2], const float target_axis_x[3], const float target_axis_y[3], const float coord[3], int i, int j)
void BM_loop_interp_multires_ex(BMesh *, BMLoop *l_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
static void UNUSED_FUNCTION BM_Data_Vert_Average(BMesh *, BMFace *)
Data Vert Average.
void BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val)
void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, const StringRef name)
static void bm_loop_flip_disp(const float source_axis_x[3], const float source_axis_y[3], const float target_axis_x[3], const float target_axis_y[3], float disp[3])
static void bm_data_interp_from_elem(CustomData *data_layer, const BMElem *ele_src_1, const BMElem *ele_src_2, BMElem *ele_dst, const float fac)
void BM_uv_map_attr_vert_select_ensure(BMesh *bm, const StringRef uv_map_name)
void BM_data_interp_from_verts(BMesh *bm, const BMVert *v_src_1, const BMVert *v_src_2, BMVert *v_dst, const float fac)
Data, Interpolate From Verts.
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const void * element
void poly_rotate_plane(const float normal[3], float(*verts)[3], const uint nverts)
POLY ROTATE PLANE.
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
void BM_vert_normal_update_all(BMVert *v)
bool BM_face_is_normal_valid(const BMFace *f)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define MAX_CUSTOMDATA_LAYER_NAME
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
const float * f_src_center
struct BMLoop * radial_next
struct BLI_mempool * pool
const float * loop_weights