40 if (ele_src_1 == ele_dst) {
47 else if (fac >= 1.0f) {
48 if (ele_src_2 == ele_dst) {
101 BMLoop *l_v1 =
nullptr, *l_v =
nullptr, *l_v2 =
nullptr;
113 if (l_iter->
v == v_src_1) {
118 else if (l_iter->
v ==
v) {
124 if (!l_v1 || !l_v2) {
130 src[1] = l_v2->head.data;
139 const bool do_vertex,
140 const void **blocks_l,
141 const void **blocks_v,
143 float axis_mat[3][3])
160 }
while ((l_iter = l_iter->
next) != l_first);
168 const void **blocks_l =
static_cast<const void **
>(
BLI_array_alloca(blocks_l, f_src->
len));
169 const void **blocks_v = do_vertex ?
173 float axis_mat[3][3];
188 }
while ((
void)i++, (l_iter = l_iter->
next) != l_first);
208 const float l_f_center[3],
249 float projverts[5][3], n2[3];
250 const float origin[2] = {0.0f, 0.0f};
260 normal_quad_v3(n2, projverts[0], projverts[1], projverts[2], projverts[3]);
262 if (
dot_v3v3(n, n2) < -FLT_EPSILON) {
270 for (i = 0; i < 4; i++) {
274 if (!
isect_point_quad_v2(origin, projverts[0], projverts[1], projverts[2], projverts[3])) {
278 resolve_quad_uv_v2(r_uv, origin, projverts[0], projverts[3], projverts[2], projverts[1]);
305 const float l_dst_f_center[3],
312 float v1[3],
v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
313 float eps = FLT_EPSILON * 4000;
353 const float target_axis_x[3],
354 const float target_axis_y[3],
355 const float coord[3],
359 mat[0][0] = target_axis_x[i];
360 mat[0][1] = target_axis_y[i];
361 mat[1][0] = target_axis_x[j];
362 mat[1][1] = target_axis_y[j];
370 const float source_axis_y[3],
371 const float target_axis_x[3],
372 const float target_axis_y[3],
375 float vx[3], vy[3], coord[3];
377 float b[2], mat[2][2], d;
390 if (
fabsf(d) < 1e-4f) {
392 if (
fabsf(d) < 1e-4f) {
397 disp[0] = (
b[0] * mat[1][1] - mat[0][1] *
b[1]) / d;
398 disp[1] = (mat[0][0] *
b[1] -
b[0] * mat[1][0]) / d;
423 BMLoop *l_first = data->l_src_first;
424 BMLoop *l_dst = data->l_dst;
425 const int cd_loop_mdisp_offset = data->cd_loop_mdisp_offset;
427 MDisps *md_dst = data->md_dst;
428 const float *f_src_center = data->f_src_center;
430 float *axis_x = data->axis_x;
431 float *axis_y = data->axis_y;
433 float *v1 = data->v1;
434 float *v4 = data->v4;
435 float *e1 = data->e1;
436 float *e2 = data->e2;
438 const int res = data->res;
439 const float d = data->d;
443 for (y = 0.0f, iy = 0; iy < res; y += d, iy++) {
445 float co1[3], co2[3], co[3];
453 float src_axis_x[3], src_axis_y[3];
458 if (
mdisp_in_mdispquad(l_dst, l_iter, f_src_center, co, res, src_axis_x, src_axis_y, uv)) {
464 }
while ((l_iter = l_iter->
next) != l_first);
471 const float f_dst_center[3],
472 const float f_src_center[3],
473 const int cd_loop_mdisp_offset)
476 float v1[3],
v2[3], v3[3], v4[3] = {0.0f, 0.0f, 0.0f}, e1[3], e2[3];
477 float axis_x[3], axis_y[3];
495 md_dst->
disps =
static_cast<float(*)[3]
>(
509 data.cd_loop_mdisp_offset = cd_loop_mdisp_offset;
510 data.md_dst = md_dst;
511 data.f_src_center = f_src_center;
512 data.axis_x = axis_x;
513 data.axis_y = axis_y;
519 data.d = 1.0f /
float(res - 1);
523 settings.use_threading = (res > 5);
531 if (cd_loop_mdisp_offset != -1) {
532 float f_dst_center[3];
533 float f_src_center[3];
545 const float f_dst_center[3],
546 const float f_src_center[3],
547 const int cd_loop_mdisp_offset)
553 bm, l_iter, f_src, f_dst_center, f_src_center, cd_loop_mdisp_offset);
554 }
while ((l_iter = l_iter->
next) != l_first);
561 if (cd_loop_mdisp_offset != -1) {
562 float f_dst_center[3];
563 float f_src_center[3];
578 if (cd_loop_mdisp_offset == -1) {
606 for (y = 0; y < sides; y++) {
617 float co1[3], co2[3], co[3];
644 mdl2 =
static_cast<MDisps *
>(
649 for (y = 0; y < sides; y++) {
653 a1 = sides * y + sides - 2;
654 a2 = (sides - 2) * sides + y;
656 o1 = sides * y + sides - 1;
657 o2 = (sides - 1) * sides + y;
660 a1 = sides * y + sides - 2;
661 a2 = sides * y + sides - 2;
662 o1 = sides * y + sides - 1;
663 o2 = sides * y + sides - 1;
682 BMesh *
bm,
BMLoop *l_dst,
const BMFace *f_src,
const bool do_vertex,
const bool do_multires)
686 const void **vblocks = do_vertex ?
692 float axis_mat[3][3];
696 float axis_dominant[3];
720 }
while ((
void)i++, (l_iter = l_iter->
next) != l_first);
743 float axis_mat[3][3];
755 }
while ((
void)i++, (l_iter = l_iter->
next) != l_first);
843 data->pool =
nullptr;
860 data->pool =
nullptr;
880 for (
int l = 0;
l < nr_uv_layers;
l++) {
932 data->pool =
nullptr;
952 data->pool =
nullptr;
961 data->pool = olddata.
pool;
978 data->pool =
nullptr;
1007 else if (&
bm->
edata == data) {
1015 else if (&
bm->
pdata == data) {
1023 else if (&
bm->
ldata == data) {
1043 const float *f =
static_cast<const float *
>(
1045 return f ? *f : 0.0f;
1050 float *f =
static_cast<float *
>(
1141 for (i = 0; i < 2; i++) {
1142 BMLoop *l_other = ((i == 0) ? l_walk : l_walk->
prev)->radial_next;
1144 if (l_other->
v != l_walk->
v) {
1145 l_other = l_other->
next;
1229 const float *data_weights;
1234 &
bm->
ldata, (
const void **)lf->
data, data_weights,
nullptr, lf->
data_len, data_tmp, layer_n);
1236 for (i = 0; i < lf->
data_len; i++) {
1242 BMesh *
bm,
void *lf_p,
const int layer_n,
void *data_tmp,
const float *loop_weights)
1247 const float *data_weights;
1251 float weight_accum = 0.0f;
1253 for (i = 0; i < lf->
data_len; i++) {
1255 temp_weights[i] =
w;
1259 if (
LIKELY(weight_accum != 0.0f)) {
1261 data_weights = temp_weights;
1268 &
bm->
ldata, (
const void **)lf->
data, data_weights,
nullptr, lf->
data_len, data_tmp, layer_n);
1270 for (i = 0; i < lf->
data_len; i++) {
1279 void *data_tmp = alloca(size);
1283 }
while ((groups = groups->next));
1289 const float *loop_weights)
1293 void *data_tmp = alloca(size);
1297 bm, groups->link, layer_n, data_tmp, loop_weights);
1298 }
while ((groups = groups->next));
const char * BKE_uv_map_pin_name_get(const char *uv_map_name, char *buffer)
const char * BKE_uv_map_vert_select_name_get(const char *uv_map_name, char *buffer)
const char * BKE_uv_map_edge_select_name_get(const char *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)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name, const int totelem)
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_active(CustomData *data, eCustomDataType type, int totelem)
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)
bool CustomData_free_layer(CustomData *data, eCustomDataType type, int totelem, int index)
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)
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])
void ortho_v3_v3(float out[3], const float v[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(struct 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.
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_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)
bool BM_data_layer_free_named(BMesh *bm, CustomData *data, const char *name)
void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, const char *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_layer_add_named(BMesh *bm, CustomData *data, int type, const char *name)
void BM_uv_map_ensure_pin_attr(BMesh *bm, const char *uv_map_name)
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.
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_uv_map_ensure_vert_select_attr(BMesh *bm, const char *uv_map_name)
void BM_uv_map_ensure_edge_select_attr(BMesh *bm, const char *uv_map_name)
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)
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_ensure_select_and_pin_attrs(BMesh *bm)
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
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_face_calc_tangent_auto(const BMFace *f, float r_tangent[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
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
const float * f_src_center
struct BMLoop * radial_next
struct BLI_mempool * pool
const float * loop_weights