static void freeData(ModifierData *md) { LaplacianDeformModifierData *lmd = (LaplacianDeformModifierData *)md; LaplacianSystem *sys = (LaplacianSystem *)lmd->cache_system; if (sys) { deleteLaplacianSystem(sys); } MEM_SAFE_FREE(lmd->vertexco); lmd->total_verts = 0; }
static void LaplacianDeformModifier_do( LaplacianDeformModifierData *lmd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts) { float (*filevertexCos)[3]; int sysdif; LaplacianSystem *sys = NULL; filevertexCos = NULL; if (!(lmd->flag & MOD_LAPLACIANDEFORM_BIND)) { if (lmd->cache_system) { sys = lmd->cache_system; deleteLaplacianSystem(sys); lmd->cache_system = NULL; } lmd->total_verts = 0; MEM_SAFE_FREE(lmd->vertexco); return; } if (lmd->cache_system) { sysdif = isSystemDifferent(lmd, ob, dm, numVerts); sys = lmd->cache_system; if (sysdif) { if (sysdif == LAPDEFORM_SYSTEM_ONLY_CHANGE_ANCHORS || sysdif == LAPDEFORM_SYSTEM_ONLY_CHANGE_GROUP) { filevertexCos = MEM_mallocN(sizeof(float[3]) * numVerts, "TempModDeformCoordinates"); memcpy(filevertexCos, lmd->vertexco, sizeof(float[3]) * numVerts); MEM_SAFE_FREE(lmd->vertexco); lmd->total_verts = 0; deleteLaplacianSystem(sys); lmd->cache_system = NULL; initSystem(lmd, ob, dm, filevertexCos, numVerts); sys = lmd->cache_system; /* may have been reallocated */ MEM_SAFE_FREE(filevertexCos); if (sys) { laplacianDeformPreview(sys, vertexCos); } } else { if (sysdif == LAPDEFORM_SYSTEM_CHANGE_VERTEXES) { modifier_setError(&lmd->modifier, "Vertices changed from %d to %d", lmd->total_verts, numVerts); } else if (sysdif == LAPDEFORM_SYSTEM_CHANGE_EDGES) { modifier_setError(&lmd->modifier, "Edges changed from %d to %d", sys->total_edges, dm->getNumEdges(dm)); } else if (sysdif == LAPDEFORM_SYSTEM_CHANGE_NOT_VALID_GROUP) { modifier_setError(&lmd->modifier, "Vertex group '%s' is not valid", sys->anchor_grp_name); } } } else { sys->repeat = lmd->repeat; laplacianDeformPreview(sys, vertexCos); } } else { if (lmd->total_verts > 0 && lmd->total_verts == numVerts) { if (isValidVertexGroup(lmd, ob, dm)) { filevertexCos = MEM_mallocN(sizeof(float[3]) * numVerts, "TempDeformCoordinates"); memcpy(filevertexCos, lmd->vertexco, sizeof(float[3]) * numVerts); MEM_SAFE_FREE(lmd->vertexco); lmd->total_verts = 0; initSystem(lmd, ob, dm, filevertexCos, numVerts); sys = lmd->cache_system; MEM_SAFE_FREE(filevertexCos); laplacianDeformPreview(sys, vertexCos); } } else { if (isValidVertexGroup(lmd, ob, dm)) { initSystem(lmd, ob, dm, vertexCos, numVerts); sys = lmd->cache_system; laplacianDeformPreview(sys, vertexCos); } } } if (sys->is_matrix_computed && !sys->has_solution) { modifier_setError(&lmd->modifier, "The system did not find a solution"); } }