Bone Heat Weighting
[blender-staging.git] / source / blender / blenkernel / intern / subsurf_ccg.c
index 7f3c5ddf8a7b41c76ecfdf2d55f2931319eef923..8fc928292585dad1cb16a7a1aa793e53be9dd641 100644 (file)
@@ -2441,11 +2441,11 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
 
 void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) 
 {
-               /* Finds the subsurf limit positions for the verts in a mesh 
-                * and puts them in an array of floats. Please note that the 
-                * calculated vert positions is incorrect for the verts 
-                * on the boundary of the mesh.
-                */
+       /* Finds the subsurf limit positions for the verts in a mesh 
+        * and puts them in an array of floats. Please note that the 
+        * calculated vert positions is incorrect for the verts 
+        * on the boundary of the mesh.
+        */
        CCGSubSurf *ss = _getSubSurf(NULL, 1, 0, 1, 0);
        float edge_sum[3], face_sum[3];
        CCGVertIterator *vi;
@@ -2474,6 +2474,11 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
                        VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(ss, f));
                }
 
+               /* ad-hoc correction for boundary vertices, to at least avoid them
+                  moving completely out of place (brecht) */
+               if(numFaces && numFaces != N)
+                       VecMulf(face_sum, (float)N/(float)numFaces);
+
                co = ccgSubSurf_getVertData(ss, v);
                positions_r[idx][0] = (co[0]*N*N + edge_sum[0]*4 + face_sum[0])/(N*(N+5));
                positions_r[idx][1] = (co[1]*N*N + edge_sum[1]*4 + face_sum[1])/(N*(N+5));