2.4x Bugfix #18279 - Copy Vertex Group Location doesn't work with subsurf modifier
[blender.git] / source / blender / blenkernel / intern / constraint.c
index b668a1f214db8864b8e794f9eabaf2a612c059c7..db98c200566e2fcf1c99470b6971db2355562005 100644 (file)
@@ -540,6 +540,7 @@ static void contarget_get_mesh_mat (Object *ob, char *substring, float mat[][4])
        float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
        float imat[3][3], tmat[3][3];
        int dgroup;
+       short freeDM = 0;
        
        /* initialize target matrix using target matrix */
        Mat4CpyMat4(mat, ob->obmat);
@@ -552,10 +553,19 @@ static void contarget_get_mesh_mat (Object *ob, char *substring, float mat[][4])
        if ((G.obedit == ob) && (G.editMesh)) {
                /* target is in editmode, so get a special derived mesh */
                dm = CDDM_from_editmesh(G.editMesh, ob->data);
+               freeDM= 1;
        }
        else {
-               /* when not in EditMode, this should exist */
-               dm = (DerivedMesh *)ob->derivedFinal;
+               /* when not in EditMode, use the 'final' derived mesh 
+                *      - check if the custom data masks for derivedFinal mean that we can just use that
+                *        (this is more effficient + sufficient for most cases)
+                */
+               if (ob->lastDataMask != CD_MASK_DERIVEDMESH) {
+                       dm = mesh_get_derived_final(ob, CD_MASK_DERIVEDMESH);
+                       freeDM= 1;
+               }
+               else 
+                       dm = (DerivedMesh *)ob->derivedFinal;
        }
        
        /* only continue if there's a valid DerivedMesh */
@@ -620,10 +630,9 @@ static void contarget_get_mesh_mat (Object *ob, char *substring, float mat[][4])
                }
        }
        
-       /* free temporary DerivedMesh created (in EditMode case) */
-       if (G.editMesh) {
-               if (dm) dm->release(dm);
-       }
+       /* free temporary DerivedMesh created */
+       if (dm && freeDM) 
+               dm->release(dm);
 }
 
 /* function that sets the given matrix based on given vertex group in lattice */