221 for (
int i = 0; i < smd->
numverts; i++) {
246 for (
int i = 0; i < smd->
numverts; i++) {
294 const MLoop *
const mloop,
304 for (
int i = 0; i < numpoly; i++, poly++) {
307 for (
int j = 0; j < poly->
totloop; j++, loop++) {
308 if (edge_polys[loop->
e].
num == 0) {
309 edge_polys[loop->
e].
polys[0] = i;
310 edge_polys[loop->
e].
polys[1] = -1;
311 edge_polys[loop->
e].
num++;
313 else if (edge_polys[loop->
e].
num == 1) {
314 edge_polys[loop->
e].
polys[1] = i;
315 edge_polys[loop->
e].
num++;
324 for (
int i = 0; i < numedges; i++, edge++) {
327 vert_edges[edge->
v1].
first = adj;
328 vert_edges[edge->
v1].
num += edge_polys[i].
num;
333 vert_edges[edge->
v2].
first = adj;
334 vert_edges[edge->
v2].
num += edge_polys[i].
num;
342 const MLoop *
const mloop,
348 for (
int i = 0; i < num; i++) {
349 if (mloop[i].
e == edge) {
359 for (
int i = 0; mloop[i].
e != edge; i++) {
366 const MLoop *
const mloop,
367 const uint loopstart,
370 for (
int i = loopstart; i < num; i++) {
375 for (
int i = 0; i < loopstart; i++) {
391 float max_dist = FLT_MAX;
398 data->treeData->tree, t_point, &nearest,
data->treeData->nearest_callback,
data->treeData);
403 for (
int i = 0; i < poly->
totloop; i++, loop++) {
404 edge = &
data->medge[loop->
e];
406 point_co,
data->targetCos[edge->
v1],
data->targetCos[edge->
v2]);
408 if (dist < max_dist) {
414 edge = &
data->medge[index];
425 float prev_co[2], prev_prev_co[2];
426 float curr_vec[2], prev_vec[2];
437 for (
int i = 0; i < nr; i++) {
442 if (curr_len < FLT_EPSILON) {
447 if (
len_squared_v2v2(prev_prev_co, coords[i]) < FLT_EPSILON * FLT_EPSILON) {
452 if (1.0f -
dot_v2v2(prev_vec, curr_vec) < FLT_EPSILON) {
469 for (
int i = 0; i < bwdata->
numpoly; bpoly++, i++) {
486 const float point_co[3])
499 const float world[3] = {0.0f, 0.0f, 1.0f};
500 float avg_point_dist = 0.0f;
501 float tot_weight = 0.0f;
502 int inf_weight_flags = 0;
504 bwdata =
MEM_callocN(
sizeof(*bwdata),
"SDefBindWeightData");
505 if (bwdata ==
NULL) {
510 bwdata->
numpoly =
data->vert_edges[nearest].num / 2;
523 for (vedge = vert_edges; vedge; vedge = vedge->
next) {
526 for (
int i = 0; i < edge_polys[edge_ind].
num; i++) {
530 for (
int j = 0; j < bwdata->
numpoly; bpoly++, j++) {
557 poly->
totloop,
sizeof(*bpoly->
coords),
"SDefBindPolyCoords");
572 for (
int j = 0; j < poly->
totloop; j++, loop++) {
576 if (loop->
v == nearest) {
600 for (
int j = 0; j < poly->
totloop; j++) {
609 data->success = is_poly_valid;
648 float corner_angles[2];
661 if (bpoly->
scales[0] < FLT_EPSILON || bpoly->
scales[1] < FLT_EPSILON ||
679 float cent_point_vec[2], point_angles[2];
685 signf(corner_angles[0]);
687 signf(corner_angles[1]);
689 if (point_angles[0] <= 0 && point_angles[1] <= 0) {
692 if (point_angles[0] < point_angles[1]) {
731 avg_point_dist /= bwdata->
numpoly;
735 if (!inf_weight_flags) {
736 for (vedge = vert_edges; vedge; vedge = vedge->
next) {
739 float ang_weights[2];
741 uint edge_on_poly[2];
743 epolys = &edge_polys[edge_ind];
748 for (
int i = 0, j = 0; (i < bwdata->
numpoly) && (j < epolys->num); bpoly++, i++) {
764 if (epolys->
num == 1) {
766 bpolys[0]->edgemid_angle);
769 else if (epolys->
num == 2) {
771 bpolys[0]->edgemid_angle);
773 bpolys[1]->edgemid_angle);
785 if (!inf_weight_flags) {
788 for (
int i = 0; i < bwdata->
numpoly; bpoly++, i++) {
789 float corner_angle_weights[2];
790 float scale_weight,
sqr, inv_sqr;
795 if (
isnan(corner_angle_weights[0]) ||
isnan(corner_angle_weights[1])) {
802 if (corner_angle_weights[0] < corner_angle_weights[1]) {
827 scale_weight /= scale_weight + (edge_angle_b /
max_ff(edge_angle_b, bpoly->
edgemid_angle));
830 sqr = scale_weight * scale_weight;
831 inv_sqr = 1.0f - scale_weight;
833 scale_weight =
sqr / (
sqr + inv_sqr);
835 BLI_assert(scale_weight >= 0 && scale_weight <= 1);
868 for (
int i = 0; i < bwdata->
numpoly; bpoly++, i++) {
883 for (
int i = 0; i < bwdata->
numpoly; bpoly++, i++) {
905 tot_weight += bpoly->
weight;
910 for (
int i = 0; i < bwdata->
numpoly; bpoly++, i++) {
911 bpoly->
weight /= tot_weight;
917 if (bpoly->
weight >= FLT_EPSILON) {
937 const float point_co_proj[3],
944 normal_dist =
len_v3(disp_vec);
959 float point_co_proj[3];
975 if (bwdata ==
NULL) {
990 sdbind = sdvert->
binds;
994 for (
int i = 0; i < bwdata->
numbinds; bpoly++) {
995 if (bpoly->
weight >= FLT_EPSILON) {
1023 for (
int j = 0; j < bpoly->
numverts; j++, loop++) {
1035 float cent[3],
norm[3];
1036 float v1[3],
v2[3], v3[3];
1044 3,
sizeof(*sdbind->
vert_weights),
"SDefCentVertWeights");
1091 3,
sizeof(*sdbind->
vert_weights),
"SDefTriVertWeights");
1141 float (*vertexCos)[3],
1158 vert_edges =
MEM_calloc_arrayN(tnumverts,
sizeof(*vert_edges),
"SDefVertEdgeMap");
1159 if (vert_edges ==
NULL) {
1164 adj_array =
MEM_malloc_arrayN(tnumedges, 2 *
sizeof(*adj_array),
"SDefVertEdge");
1165 if (adj_array ==
NULL) {
1171 edge_polys =
MEM_calloc_arrayN(tnumedges,
sizeof(*edge_polys),
"SDefEdgeFaceMap");
1172 if (edge_polys ==
NULL) {
1196 mpoly, medge, mloop, tnumpoly, tnumedges, vert_edges, adj_array, edge_polys);
1200 ob, (
ModifierData *)smd_eval,
"Target has edges with more than two polygons");
1212 .treeData = &treeData,
1213 .vert_edges = vert_edges,
1214 .edge_polys = edge_polys,
1219 .targetCos =
MEM_malloc_arrayN(tnumverts,
sizeof(
float[3]),
"SDefTargetBindVertArray"),
1220 .bind_verts = smd_orig->
verts,
1221 .vertexCos = vertexCos,
1234 for (
int i = 0; i < tnumverts; i++) {
1251 ob, (
ModifierData *)smd_eval,
"Target has edges with more than two polygons");
1274 return data.success == 1;
1282 const SDefBind *sdbind =
data->bind_verts[index].binds;
1283 const int num_binds =
data->bind_verts[index].numbinds;
1284 float *
const vertexCos =
data->vertexCos[index];
1285 float norm[3], temp[3], offset[3];
1288 float weight = 1.0f;
1290 if (
data->dvert &&
data->defgrp_index != -1) {
1293 if (
data->invert_vgroup) {
1294 weight = 1.0f - weight;
1300 if (weight == 0.0f) {
1308 for (
int j = 0; j < num_binds; j++) {
1309 max_verts =
MAX2(max_verts, sdbind[j].numverts);
1312 const bool big_buffer = max_verts > 256;
1313 float(*coords_buffer)[3];
1322 for (
int j = 0; j < num_binds; j++, sdbind++) {
1323 for (
int k = 0; k < sdbind->
numverts; k++) {
1330 switch (sdbind->
mode) {
1341 for (
int k = 0; k < sdbind->
numverts; k++) {
1377 float (*vertexCos)[3],
1384 uint tnumverts, tnumpoly;
1418 float tmp_mat[4][4];
1426 if (!
surfacedeformBind(ob, smd_orig, smd, vertexCos, numverts, tnumpoly, tnumverts, target)) {
1438 if (smd->
numpoly != tnumpoly) {
1440 ob, md,
"Target polygons changed from %u to %u", smd->
numpoly, tnumpoly);
1457 .bind_verts = smd->
verts,
1458 .targetCos =
MEM_malloc_arrayN(tnumverts,
sizeof(
float[3]),
"SDefTargetVertArray"),
1459 .vertexCos = vertexCos,
1461 .defgrp_index = defgrp_index,
1462 .invert_vgroup = invert_vgroup,
1481 float (*vertexCos)[3],
1503 float (*vertexCos)[3],
1515 if (mesh_src !=
NULL) {
1587 for (
int i = 0; i < smd->
numverts; i++) {
1615 for (
int i = 0; i < smd->
numverts; i++) {
1638 "SurfaceDeformModifierData",
1643 ICON_MOD_MESHDEFORM,
typedef float(TangentPoint)[2]
BVHTree * BKE_bvhtree_from_mesh_get(struct BVHTreeFromMesh *data, struct Mesh *mesh, const BVHCacheType bvh_cache_type, const int tree_type)
void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data)
void BKE_id_free(struct Main *bmain, void *idv)
const struct MLoopTri * BKE_mesh_runtime_looptri_ensure(struct Mesh *mesh)
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
int BKE_mesh_wrapper_vert_len(const struct Mesh *me)
int BKE_mesh_wrapper_poly_len(const struct Mesh *me)
void BKE_mesh_wrapper_vert_coords_copy_with_mat4(const struct Mesh *me, float(*vert_coords)[3], int vert_coords_len, const float mat[4][4])
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_OnlyDeform
struct ModifierData * BKE_modifier_get_original(struct ModifierData *md)
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval, const bool get_cage_mesh)
#define BLI_array_alloca(arr, realsize)
int BLI_bvhtree_find_nearest(BVHTree *tree, const float co[3], BVHTreeNearest *nearest, BVHTree_NearestPointCallback callback, void *userdata)
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
MINLINE float interpf(float a, float b, float t)
MINLINE float signf(float f)
float dist_squared_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3])
MINLINE float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
void interp_weights_tri_v3(float w[3], const float v1[3], const float v2[3], const float v3[3], const float co[3])
bool isect_point_poly_v2(const float pt[2], const float verts[][2], const unsigned int nr, const bool use_holes)
void interp_weights_poly_v2(float w[], float v[][2], const int n, const float co[2])
bool isect_line_plane_v3(float r_isect_co[3], const float l1[3], const float l2[3], const float plane_co[3], const float plane_no[3]) ATTR_WARN_UNUSED_RESULT
float normal_poly_v3(float n[3], const float verts[][3], unsigned int nr)
bool is_poly_convex_v2(const float verts[][2], unsigned int nr)
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2])
void map_to_plane_axis_angle_v2_v3v3fl(float r_co[2], const float co[3], const float axis[3], const float angle)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
float angle_normalized_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v2_v2fl(float r[2], const float a[2], 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 float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
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])
float angle_signed_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3_array(float r[3], const float(*vec_arr)[3], const unsigned int nbr)
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 void zero_v2(float r[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 void zero_v3(float r[3])
MINLINE float normalize_v2(float r[2])
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void BLI_task_parallel_range(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void BLO_read_float3_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_write_uint32_array(BlendWriter *writer, uint num, const uint32_t *data_ptr)
#define BLO_read_data_address(reader, ptr_p)
void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
void BLO_read_float_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_read_uint32_array(BlendDataReader *reader, int array_size, uint32_t **ptr_p)
void BLO_write_float_array(BlendWriter *writer, uint num, const float *data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
bool DEG_is_active(const struct Depsgraph *depsgraph)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct SurfaceDeformModifierData SurfaceDeformModifierData
@ eModifierType_SurfaceDeform
Object is a sort of wrapper for general info.
_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.
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
Mesh * MOD_deform_mesh_eval_get(Object *ob, struct BMEditMesh *em, Mesh *mesh, const float(*vertexCos)[3], const int num_verts, const bool use_normals, const bool use_orco)
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
StructRNA RNA_SurfaceDeformModifier
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
IconTextureDrawCall normal
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
struct SDefAdjacency * next
BVHTreeFromMesh *const treeData
SDefVert *const bind_verts
float(*const targetCos)[3]
const MLoopTri *const looptri
float(*const vertexCos)[3]
const SDefEdgePolys *const edge_polys
const SDefAdjacencyArray *const vert_edges
float corner_edgemid_angles[2]
float dominant_angle_weight
float cent_edgemid_vecs_v2[2][2]
float point_edgemid_angles[2]
SDefBindPoly * bind_polys
ccl_device_inline float sqr(float a)