44 if (ele_src_1 == ele_dst) {
51 else if (fac >= 1.0f) {
52 if (ele_src_2 == ele_dst) {
105 BMLoop *l_v1 =
nullptr, *l_v =
nullptr, *l_v2 =
nullptr;
117 if (l_iter->
v == v_src_1) {
122 else if (l_iter->
v ==
v) {
128 if (!l_v1 || !l_v2) {
134 src[1] = l_v2->head.data;
143 const bool do_vertex,
144 const void **blocks_l,
145 const void **blocks_v,
147 float axis_mat[3][3])
164 }
while ((l_iter = l_iter->
next) != l_first);
172 const void **blocks_l =
static_cast<const void **
>(
BLI_array_alloca(blocks_l, f_src->
len));
173 const void **blocks_v = do_vertex ?
177 float axis_mat[3][3];
192 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
212 const float l_f_center[3],
253 float projverts[5][3], n2[3];
254 const float origin[2] = {0.0f, 0.0f};
264 normal_quad_v3(n2, projverts[0], projverts[1], projverts[2], projverts[3]);
266 if (
dot_v3v3(n, n2) < -FLT_EPSILON) {
274 for (
i = 0;
i < 4;
i++) {
278 if (!
isect_point_quad_v2(origin, projverts[0], projverts[1], projverts[2], projverts[3])) {
282 resolve_quad_uv_v2(r_uv, origin, projverts[0], projverts[3], projverts[2], projverts[1]);
309 const float l_dst_f_center[3],
316 float v1[3],
v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
317 float eps = FLT_EPSILON * 4000;
357 const float target_axis_x[3],
358 const float target_axis_y[3],
359 const float coord[3],
363 mat[0][0] = target_axis_x[
i];
364 mat[0][1] = target_axis_y[
i];
365 mat[1][0] = target_axis_x[j];
366 mat[1][1] = target_axis_y[j];
374 const float source_axis_y[3],
375 const float target_axis_x[3],
376 const float target_axis_y[3],
379 float vx[3], vy[3], coord[3];
381 float b[2], mat[2][2], d;
394 if (
fabsf(d) < 1e-4f) {
396 if (
fabsf(d) < 1e-4f) {
401 disp[0] = (
b[0] * mat[1][1] - mat[0][1] *
b[1]) / d;
402 disp[1] = (mat[0][0] *
b[1] -
b[0] * mat[1][0]) / d;
429 const int cd_loop_mdisp_offset =
data->cd_loop_mdisp_offset;
432 const float *f_src_center =
data->f_src_center;
434 float *axis_x =
data->axis_x;
435 float *axis_y =
data->axis_y;
437 float *v1 =
data->v1;
438 float *v4 =
data->v4;
439 float *e1 =
data->e1;
440 float *e2 =
data->e2;
442 const int res =
data->res;
443 const float d =
data->d;
447 for (
y = 0.0f, iy = 0; iy < res;
y += d, iy++) {
449 float co1[3], co2[3], co[3];
457 float src_axis_x[3], src_axis_y[3];
462 if (
mdisp_in_mdispquad(l_dst, l_iter, f_src_center, co, res, src_axis_x, src_axis_y, uv)) {
468 }
while ((l_iter = l_iter->
next) != l_first);
475 const float f_dst_center[3],
476 const float f_src_center[3],
477 const int cd_loop_mdisp_offset)
480 float v1[3],
v2[3], v3[3], v4[3] = {0.0f, 0.0f, 0.0f}, e1[3], e2[3];
481 float axis_x[3], axis_y[3];
499 md_dst->
disps =
static_cast<float (*)[3]
>(
513 data.cd_loop_mdisp_offset = cd_loop_mdisp_offset;
514 data.md_dst = md_dst;
515 data.f_src_center = f_src_center;
516 data.axis_x = axis_x;
517 data.axis_y = axis_y;
535 if (cd_loop_mdisp_offset != -1) {
536 float f_dst_center[3];
537 float f_src_center[3];
549 const float f_dst_center[3],
550 const float f_src_center[3],
551 const int cd_loop_mdisp_offset)
557 bm, l_iter, f_src, f_dst_center, f_src_center, cd_loop_mdisp_offset);
558 }
while ((l_iter = l_iter->
next) != l_first);
565 if (cd_loop_mdisp_offset != -1) {
566 float f_dst_center[3];
567 float f_src_center[3];
582 if (cd_loop_mdisp_offset == -1) {
610 for (
y = 0;
y < sides;
y++) {
621 float co1[3], co2[3], co[3];
640 if (
l->radial_next ==
l) {
644 if (
l->radial_next->v ==
l->v) {
648 mdl2 =
static_cast<MDisps *
>(
653 for (
y = 0;
y < sides;
y++) {
656 if (
l->v !=
l->radial_next->v) {
657 a1 = sides *
y + sides - 2;
658 a2 = (sides - 2) * sides +
y;
660 o1 = sides *
y + sides - 1;
661 o2 = (sides - 1) * sides +
y;
664 a1 = sides *
y + sides - 2;
665 a2 = sides *
y + sides - 2;
666 o1 = sides *
y + sides - 1;
667 o2 = sides *
y + sides - 1;
686 BMesh *
bm,
BMLoop *l_dst,
const BMFace *f_src,
const bool do_vertex,
const bool do_multires)
690 const void **vblocks = do_vertex ?
696 float axis_mat[3][3];
700 float axis_dominant[3];
702 BLI_assert(BM_face_is_normal_valid(f_src));
703 copy_v3_v3(axis_dominant, f_src->no);
709 BM_face_calc_tangent_auto(f_src, vec);
710 ortho_v3_v3(axis_dominant, vec);
711 normalize_v3(axis_dominant);
724 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
747 float axis_mat[3][3];
759 }
while ((
void)
i++, (l_iter = l_iter->
next) != l_first);
788 else if (
data == &
bm->edata) {
800 else if (
data == &
bm->ldata) {
811 l->head.data = block;
815 else if (
data == &
bm->pdata) {
847 data->pool =
nullptr;
864 data->pool =
nullptr;
884 for (
int l = 0;
l < nr_uv_layers;
l++) {
917 data->pool =
nullptr;
937 data->pool =
nullptr;
963 data->pool =
nullptr;
989 else if (&
bm->edata ==
data) {
997 else if (&
bm->pdata ==
data) {
1005 else if (&
bm->ldata ==
data) {
1025 const float *f =
static_cast<const float *
>(
1027 return f ? *f : 0.0f;
1032 float *f =
static_cast<float *
>(
1043 if (layer.name ==
name) {
1044 return {layer.offset,
1050 if (layer.name ==
name) {
1051 return {layer.offset,
1057 if (layer.name ==
name) {
1058 return {layer.offset,
1064 if (layer.name ==
name) {
1065 return {layer.offset,
1157 for (
i = 0;
i < 2;
i++) {
1158 BMLoop *l_other = ((
i == 0) ? l_walk : l_walk->
prev)->radial_next;
1160 if (l_other->
v != l_walk->
v) {
1161 l_other = l_other->
next;
1185 lwc.
type =
bm->ldata.layers[layer_n].type;
1243 const int type =
bm->ldata.layers[layer_n].type;
1245 const float *data_weights;
1247 data_weights =
lf->data_weights;
1250 &
bm->ldata, (
const void **)
lf->data, data_weights,
lf->data_len, data_tmp, layer_n);
1252 for (
i = 0;
i <
lf->data_len;
i++) {
1258 BMesh *
bm,
void *lf_p,
const int layer_n,
void *data_tmp,
const float *loop_weights)
1261 const int type =
bm->ldata.layers[layer_n].type;
1263 const float *data_weights;
1266 float *temp_weights =
static_cast<float *
>(
BLI_array_alloca(temp_weights,
lf->data_len));
1267 float weight_accum = 0.0f;
1269 for (
i = 0;
i <
lf->data_len;
i++) {
1270 float w = loop_weights[
lf->data_index[
i]] *
lf->data_weights[
i];
1271 temp_weights[
i] =
w;
1275 if (
LIKELY(weight_accum != 0.0f)) {
1276 mul_vn_fl(temp_weights,
lf->data_len, 1.0f / weight_accum);
1277 data_weights = temp_weights;
1280 data_weights =
lf->data_weights;
1284 &
bm->ldata, (
const void **)
lf->data, data_weights,
lf->data_len, data_tmp, layer_n);
1286 for (
i = 0;
i <
lf->data_len;
i++) {
1293 const int type =
bm->ldata.layers[layer_n].type;
1295 void *data_tmp = alloca(
size);
1299 }
while ((groups = groups->
next));
1305 const float *loop_weights)
1307 const int type =
bm->ldata.layers[layer_n].type;
1309 void *data_tmp = alloca(
size);
1313 bm, groups->
link, layer_n, data_tmp, loop_weights);
1314 }
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)
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_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_copy_elements(eCustomDataType type, const void *src_data, void *dst_data, int count)
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_bmesh_interp_n(CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_block_ofs, int n)
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(CustomData *data, const void **src_blocks, const float *weights, int count, void *dst_block)
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(...)
#define MAX_CUSTOMDATA_LAYER_NAME
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)
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)
BMDataLayerLookup BM_data_layer_lookup(const BMesh &bm, const blender::StringRef name)
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)
bool BM_uv_map_attr_pin_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_uv_map_attr_pin_ensure_for_all_layers(BMesh *bm)
void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
void BM_uv_map_attr_pin_ensure_named(BMesh *bm, const StringRef uv_map_name)
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.
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_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.
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
std::optional< AttrType > custom_data_type_to_attr_type(eCustomDataType data_type)
const float * f_src_center
struct BMLoop * radial_next
struct BLI_mempool * pool
const float * loop_weights