diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index d6c4a6838ae..5e6be926caa 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -1136,18 +1136,27 @@ static void hookModifier_deformVerts(ModifierData *md, Object *ob, void *derived Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv, NULL, NULL, NULL, NULL, NULL); for (i=0; itotindex; i++) { - float *co = vertexCos[hmd->indexar[i]]; - float fac = hmd->force; + int index = hmd->indexar[i]; - if(hmd->falloff!=0.0) { - float len= VecLenf(co, hmd->cent); - if(len > hmd->falloff) fac = 0.0; - else if(len>0.0) fac *= sqrt(1.0 - len/hmd->falloff); - } + /* These should always be true and I don't generally like + * "paranoid" style code like this, but old files can have + * indices that are out of range because old blender did + * not correct them on exit editmode. + */ + if (indexforce; - if(fac!=0.0) { - VecMat4MulVecfl(vec, mat, co); - VecLerpf(co, co, vec, fac); + if(hmd->falloff!=0.0) { + float len= VecLenf(co, hmd->cent); + if(len > hmd->falloff) fac = 0.0; + else if(len>0.0) fac *= sqrt(1.0 - len/hmd->falloff); + } + + if(fac!=0.0) { + VecMat4MulVecfl(vec, mat, co); + VecLerpf(co, co, vec, fac); + } } } } diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index 9ce15b55f6a..54a298a54ed 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -52,6 +52,7 @@ #include "DNA_scene_types.h" #include "DNA_view3d_types.h" #include "DNA_material_types.h" +#include "DNA_modifier_types.h" #include "DNA_texture_types.h" #include "DNA_userdef_types.h" @@ -1194,6 +1195,42 @@ void load_editMesh(void) me->mcol= 0; } + /* patch hook indices */ + { + Object *ob; + ModifierData *md; + EditVert *eve, **vertMap = NULL; + int i,j; + + for (ob=G.main->object.first; ob; ob=ob->id.next) { + for (md=ob->modifiers.first; md; md=md->next) { + if (md->type==eModifierType_Hook) { + HookModifierData *hmd = (HookModifierData*) md; + + if (!vertMap) { + vertMap = MEM_callocN(sizeof(*vertMap)*ototvert, "vertMap"); + + for (eve=em->verts.first; eve; eve=eve->next) { + if (eve->keyindex!=-1) + vertMap[eve->keyindex] = eve; + } + } + + for (i=j=0; itotindex; i++) { + eve = vertMap[hmd->indexar[i]]; + + if (eve) { + hmd->indexar[j++] = (long) eve->vn; + } + } + + hmd->totindex = j; + } + } + } + + if (vertMap) MEM_freeN(vertMap); + } /* are there keys? */ if(me->key) {