Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c17
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c11
2 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 9d649edd81a..339326f75d5 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1077,6 +1077,21 @@ static int emDM_getNumFaces(DerivedMesh *dm)
return BLI_countlist(&emdm->em->faces);
}
+static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+ int i;
+
+ for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
+ if (emdm->vertexCos) {
+ copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
+ } else {
+ copy_v3_v3(cos_r[i], eve->co);
+ }
+ }
+}
+
static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
{
EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
@@ -1309,6 +1324,8 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
emdm->dm.getNumEdges = emDM_getNumEdges;
emdm->dm.getNumFaces = emDM_getNumFaces;
+ emdm->dm.getVertCos = emDM_getVertCos;
+
emdm->dm.getVert = emDM_getVert;
emdm->dm.getEdge = emDM_getEdge;
emdm->dm.getFace = emDM_getFace;
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 83fa544690b..623f4a5ddeb 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -180,13 +180,13 @@ static void meshdeformModifier_do(
DerivedMesh *tmpdm, *cagedm;
MDeformVert *dvert = NULL;
MDeformWeight *dw;
- MVert *cagemvert;
MDefInfluence *influences;
int *offsets;
float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
float weight, totweight, fac, co[3], (*dco)[3], (*bindcagecos)[3];
int a, b, totvert, totcagevert, defgrp_index;
-
+ float (*cagecos)[3];
+
if(!mmd->object || (!mmd->bindcagecos && !mmd->bindfunc))
return;
@@ -251,8 +251,10 @@ static void meshdeformModifier_do(
return;
}
+ cagecos= MEM_callocN(sizeof(*cagecos)*totcagevert, "meshdeformModifier vertCos");
+
/* setup deformation data */
- cagemvert= cagedm->getVertArray(cagedm);
+ cagedm->getVertCos(cagedm, cagecos);
influences= mmd->bindinfluences;
offsets= mmd->bindoffsets;
bindcagecos= (float(*)[3])mmd->bindcagecos;
@@ -260,7 +262,7 @@ static void meshdeformModifier_do(
dco= MEM_callocN(sizeof(*dco)*totcagevert, "MDefDco");
for(a=0; a<totcagevert; a++) {
/* get cage vertex in world space with binding transform */
- copy_v3_v3(co, cagemvert[a].co);
+ copy_v3_v3(co, cagecos[a]);
if(G.rt != 527) {
mul_m4_v3(mmd->bindmat, co);
@@ -331,6 +333,7 @@ static void meshdeformModifier_do(
/* release cage derivedmesh */
MEM_freeN(dco);
+ MEM_freeN(cagecos);
cagedm->release(cagedm);
}