36 if (ele_src_1 == ele_dst) {
45 else if (fac >= 1.0f) {
46 if (ele_src_2 == ele_dst) {
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])
152 if (f_src != f_dst) {
166 }
while ((
void)i++, (l_iter = l_iter->
next) != l_first);
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;
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];
511 .cd_loop_mdisp_offset = cd_loop_mdisp_offset,
513 .f_src_center = f_src_center,
521 .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];
650 for (
y = 0;
y < sides;
y++) {
654 a1 = sides *
y + sides - 2;
655 a2 = (sides - 2) * sides +
y;
657 o1 = sides *
y + sides - 1;
658 o2 = (sides - 1) * sides +
y;
661 a1 = sides *
y + sides - 2;
662 a2 = sides *
y + sides - 2;
663 o1 = sides *
y + sides - 1;
664 o2 = sides *
y + sides - 1;
683 BMesh *
bm,
BMLoop *l_dst,
const BMFace *f_src,
const bool do_vertex,
const bool do_multires)
691 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];
756 }
while ((
void)i++, (l_iter = l_iter->
next) != l_first);
993 return f ? *f : 0.0f;
1087 for (i = 0; i < 2; i++) {
1090 if (l_other->
v != l_walk->
v) {
1091 l_other = l_other->
next;
1180 for (i = 0; i < lf->
data_len; i++) {
1186 BMesh *
bm,
void *lf_p,
const int layer_n,
void *data_tmp,
const float *loop_weights)
1195 float weight_accum = 0.0f;
1197 for (i = 0; i < lf->
data_len; i++) {
1199 temp_weights[i] =
w;
1203 if (
LIKELY(weight_accum != 0.0f)) {
1214 for (i = 0; i < lf->
data_len; i++) {
1223 void *data_tmp = alloca(
size);
1227 }
while ((groups = groups->
next));
1233 const float *loop_weights)
1237 void *data_tmp = alloca(
size);
1241 bm, groups->
link, layer_n, data_tmp, loop_weights);
1242 }
while ((groups = groups->
next));
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_free_layer_named(struct CustomData *data, const char *name, const int totelem)
bool CustomData_free_layer_active(struct CustomData *data, int type, int totelem)
bool CustomData_free_layer(struct CustomData *data, int type, int totelem, int index)
void CustomData_bmesh_interp_n(struct CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block_ofs, int n)
bool CustomData_data_equals(int type, const void *data1, const void *data2)
int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n)
void * CustomData_add_layer_named(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem, const char *name)
void CustomData_bmesh_init_pool(struct CustomData *data, int totelem, char htype)
void CustomData_bmesh_set_n(struct CustomData *data, void *block, int type, int n, const void *source)
void CustomData_bmesh_set_default(struct CustomData *data, void **block)
void CustomData_bmesh_copy_data(const struct CustomData *source, struct CustomData *dest, void *src_block, void **dest_block)
int CustomData_sizeof(int type)
void CustomData_bmesh_free_block_data(struct CustomData *data, void *block)
void * CustomData_bmesh_get(const struct CustomData *data, void *block, int type)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, int count)
int CustomData_get_offset(const struct CustomData *data, int type)
void CustomData_bmesh_interp(struct CustomData *data, const void **src_blocks, const float *weights, const float *sub_weights, int count, void *dst_block)
void CustomData_bmesh_free_block(struct CustomData *data, void **block)
void * CustomData_bmesh_get_n(const struct CustomData *data, void *block, int type, 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 float normalize_v3(float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
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])
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
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 equals_v3v3(const float a[3], const float b[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])
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(...)
_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 y
_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 type
_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)
void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void *ele_dst)
#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)
LinkNode * BM_vert_loop_groups_data_layer_create(BMesh *bm, BMVert *v, const int layer_n, const float *loop_weights, MemArena *arena)
void BM_face_interp_multires(BMesh *bm, BMFace *f_dst, const BMFace *f_src)
static void mdisp_axis_from_quad(const float v1[3], const float v2[3], float UNUSED(v3[3]), const float v4[3], float r_axis_x[3], float r_axis_y[3])
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.
void BM_loop_interp_multires_ex(BMesh *UNUSED(bm), 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)
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)
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)
static void bm_loop_walk_data(struct LoopWalkCtx *lwc, BMLoop *l_walk)
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)
static void UNUSED_FUNCTION() BM_Data_Vert_Average(BMesh *UNUSED(bm), BMFace *UNUSED(f))
Data Vert Average.
bool BM_data_layer_free_named(BMesh *bm, CustomData *data, const char *name)
struct BMLoopInterpMultiresData BMLoopInterpMultiresData
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_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)
void BM_loop_interp_from_face(BMesh *bm, BMLoop *l_dst, const BMFace *f_src, const bool do_vertex, const bool do_multires)
static void bm_loop_walk_add(struct LoopWalkCtx *lwc, BMLoop *l)
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])
void BM_data_interp_face_vert_edge(BMesh *bm, const BMVert *v_src_1, const BMVert *UNUSED(v_src_2), BMVert *v, BMEdge *e, const float fac)
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_elem_float_data_set(CustomData *cd, void *element, int type, const float val)
static void loop_interp_multires_cb(void *__restrict userdata, const int ix, const TaskParallelTLS *__restrict UNUSED(tls))
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
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_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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SyclQueue void void * src
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
const float * f_src_center
struct BMLoop * radial_next
struct BLI_mempool * pool
const float * loop_weights