34#include "RNA_prototypes.hh"
110 const char defgrpName[64],
123 sys->
co =
static_cast<float(*)[3]
>(
MEM_malloc_arrayN(verts_num,
sizeof(
float[3]), __func__));
124 sys->
no =
static_cast<float(*)[3]
>(
MEM_calloc_arrayN(verts_num,
sizeof(
float[3]), __func__));
159 MeshElemMap *map = MEM_cnew_array<MeshElemMap>(mvert_tot, __func__);
163 for (
int j = 0; j < 3; j++) {
164 const int v_index = corner_verts[tri[j]];
165 map[v_index].
count++;
169 indices = MEM_cnew_array<int>(indices_num, __func__);
171 for (
int i = 0; i < mvert_tot; i++) {
172 map[i].indices = index_iter;
173 index_iter += map[i].count;
178 for (
int j = 0; j < 3; j++) {
179 const int v_index = corner_verts[tri[j]];
180 map[v_index].indices[map[v_index].count] = i;
181 map[v_index].
count++;
193 MeshElemMap *map = MEM_cnew_array<MeshElemMap>(mvert_tot, __func__);
194 int i, vid[2], indices_num = 0;
197 for (
const int i : edges.index_range()) {
198 vid[0] = edges[i][0];
199 vid[1] = edges[i][1];
204 indices = MEM_cnew_array<int>(indices_num, __func__);
206 for (i = 0; i < mvert_tot; i++) {
207 map[i].indices = index_iter;
208 index_iter += map[i].count;
211 for (
const int i : edges.index_range()) {
212 vid[0] = edges[i][0];
213 vid[1] = edges[i][1];
214 map[vid[0]].indices[map[vid[0]].count] = vid[1];
216 map[vid[1]].indices[map[vid[1]].count] = vid[0];
262 for (ti = 0; ti < sys->
tris_num; ti++) {
266 co[0] = sys->
co[vidt[0]];
267 co[1] = sys->
co[vidt[1]];
268 co[2] = sys->
co[vidt[2]];
275 for (j = 0; j < 3; j++) {
276 const float *v1, *
v2, *v3;
279 idv[1] = vidt[(j + 1) % i];
280 idv[2] = vidt[(j + 2) % i];
282 v1 = sys->
co[idv[0]];
283 v2 = sys->
co[idv[1]];
284 v3 = sys->
co[idv[2]];
289 sys->
delta[idv[0]][0] += v1[0] * (w2 + w3);
290 sys->
delta[idv[0]][1] += v1[1] * (w2 + w3);
291 sys->
delta[idv[0]][2] += v1[2] * (w2 + w3);
293 sys->
delta[idv[0]][0] -=
v2[0] * w2;
294 sys->
delta[idv[0]][1] -=
v2[1] * w2;
295 sys->
delta[idv[0]][2] -=
v2[2] * w2;
297 sys->
delta[idv[0]][0] -= v3[0] * w3;
298 sys->
delta[idv[0]][1] -= v3[1] * w3;
299 sys->
delta[idv[0]][2] -= v3[2] * w3;
310 int vid, *vidn =
nullptr;
311 float minj, mjt, qj[3], vj[3];
319 for (j = 0; j < ln; j++) {
335 float alpha,
beta, gamma;
336 float pj[3], ni[3], di[3];
337 float uij[3], dun[3], e2[3], pi[3], fni[3], vn[3][3];
338 int i, j, fidn_num, k, fi;
361 for (fi = 0; fi < fidn_num; fi++) {
364 vin = sys->
tris[fidn[fi]];
365 for (j = 0; j < 3; j++) {
384 fni[0] = alpha * ni[0] +
beta * uij[0] + gamma * e2[0];
385 fni[1] = alpha * ni[1] +
beta * uij[1] + gamma * e2[1];
386 fni[2] = alpha * ni[2] +
beta * uij[2] + gamma * e2[2];
403 int vid, i, j, n, na;
410 for (i = 0; i < n; i++) {
415 for (i = 0; i < na; i++) {
425 for (i = 0; i < n; i++) {
430 for (i = 0; i < na; i++) {
440 for (j = 1; j <= sys->
repeat; j++) {
443 for (i = 0; i < na; i++) {
456 for (vid = 0; vid < sys->
verts_num; vid++) {
472 for (i = 0; i < n; i++) {
477 for (i = 0; i < na; i++) {
487 for (j = 1; j <= sys->
repeat; j++) {
490 for (i = 0; i < na; i++) {
502 for (vid = 0; vid < sys->
verts_num; vid++) {
525 return (dvert !=
nullptr);
541 int *index_anchors =
static_cast<int *
>(
551 for (i = 0; i < verts_num; i++) {
572 memcpy(sys->
index_anchors, index_anchors,
sizeof(
int) * anchors_num);
573 memcpy(sys->
co, vertexCos,
sizeof(
float[3]) * verts_num);
576 memcpy(lmd->
vertexco, vertexCos,
sizeof(
float[3]) * verts_num);
583 for (i = 0; i < sys->
tris_num; i++) {
584 sys->
tris[i][0] = corner_verts[corner_tris[i][0]];
585 sys->
tris[i][1] = corner_verts[corner_tris[i][1]];
586 sys->
tris[i][2] = corner_verts[corner_tris[i][2]];
619 for (i = 0; i < verts_num; i++) {
637 float(*filevertexCos)[3];
640 filevertexCos =
nullptr;
656 filevertexCos =
static_cast<float(*)[3]
>(
658 memcpy(filevertexCos, lmd->
vertexco,
sizeof(
float[3]) * verts_num);
663 initSystem(lmd, ob, mesh, filevertexCos, verts_num);
673 ob, &lmd->
modifier,
"Vertices changed from %d to %d", lmd->
verts_num, verts_num);
677 ob, &lmd->
modifier,
"Edges changed from %d to %d", sys->
edges_num, mesh->edges_num);
682 "Vertex group '%s' is not valid, or maybe empty",
696 "Vertex group '%s' is not valid, or maybe empty",
698 lmd->
flag &= ~MOD_LAPLACIANDEFORM_BIND;
701 filevertexCos =
static_cast<float(*)[3]
>(
703 memcpy(filevertexCos, lmd->
vertexco,
sizeof(
float[3]) * verts_num);
706 initSystem(lmd, ob, mesh, filevertexCos, verts_num);
712 initSystem(lmd, ob, mesh, vertexCos, verts_num);
768 reinterpret_cast<float(*)[3]
>(positions.data()),
807 "OBJECT_OT_laplaciandeform_bind");
850 N_(
"LaplacianDeform"),
851 "LaplacianDeformModifierData",
853 &RNA_LaplacianDeformModifier,
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
float cotangent_tri_weight_v3(const float v1[3], const float v2[3], const float v3[3])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
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 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 cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
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])
#define STRNCPY(dst, src)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STACK_PUSH(stack, val)
#define STACK_DECLARE(stack)
#define STACK_SIZE(stack)
#define STACK_INIT(stack, stack_num)
void BLO_read_float3_array(BlendDataReader *reader, int array_size, float **ptr_p)
void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
#define ID_IS_LINKED(_id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eModifierFlag_OverrideLibrary_Local
struct LaplacianDeformModifierData LaplacianDeformModifierData
@ eModifierType_LaplacianDeform
@ MOD_LAPLACIANDEFORM_BIND
@ MOD_LAPLACIANDEFORM_INVERT_VGROUP
Read Guarded memory(de)allocation.
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
constexpr int64_t count(const T &value) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
draw_view in_light_buf[] float
LinearSolver * EIG_linear_least_squares_solver_new(int num_rows, int num_columns, int num_rhs)
void EIG_linear_solver_variable_set(LinearSolver *solver, int rhs, int index, double value)
void EIG_linear_solver_right_hand_side_add(LinearSolver *solver, int rhs, int index, double value)
void EIG_linear_solver_delete(LinearSolver *solver)
double EIG_linear_solver_variable_get(LinearSolver *solver, int rhs, int index)
void EIG_linear_solver_matrix_add(LinearSolver *solver, int row, int col, double value)
bool EIG_linear_solver_solve(LinearSolver *solver)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
int RNA_string_length(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
ccl_device_inline float beta(float x, float y)