Revision: 44079 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44079 Author: campbellbarton Date: 2012-02-13 04:21:22 +0000 (Mon, 13 Feb 2012) Log Message: ----------- heat weight * use polygons for selection (was using tessface) * ensure tessfaces are created * mirroring was commented as BMESH_TODO, but api calls now work so add back.
Modified Paths: -------------- branches/bmesh/blender/source/blender/editors/armature/meshlaplacian.c Modified: branches/bmesh/blender/source/blender/editors/armature/meshlaplacian.c =================================================================== --- branches/bmesh/blender/source/blender/editors/armature/meshlaplacian.c 2012-02-13 04:14:35 UTC (rev 44078) +++ branches/bmesh/blender/source/blender/editors/armature/meshlaplacian.c 2012-02-13 04:21:22 UTC (rev 44079) @@ -49,6 +49,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_modifier.h" +#include "BKE_mesh.h" #ifdef RIGID_DEFORM @@ -651,10 +652,12 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected, const char **err_str) { LaplacianSystem *sys; - MFace *mface; + MPoly *mp; + MLoop *ml; + MFace *mf; float solution, weight; int *vertsflipped = NULL, *mask= NULL; - int a, totface, j, bbone, firstsegment, lastsegment; + int a, tottri, j, bbone, firstsegment, lastsegment; MVert *mvert = me->mvert; int use_vert_sel= FALSE; @@ -669,33 +672,34 @@ mask= MEM_callocN(sizeof(int)*me->totvert, "heat_bone_weighting mask"); } - for(totface=0, a=0, mface=me->mface; a<me->totface; a++, mface++) { - totface++; - if(mface->v4) totface++; - + for(a = 0, mp=me->mpoly; a < me->totpoly; mp++, a++) { /* (added selectedVerts content for vertex mask, they used to just equal 1) */ if(use_vert_sel) { - mask[mface->v1]= (mvert[mface->v1].flag & SELECT) != 0; - mask[mface->v2]= (mvert[mface->v2].flag & SELECT) != 0; - mask[mface->v3]= (mvert[mface->v3].flag & SELECT) != 0; - if(mface->v4) { - mask[mface->v4]= (mvert[mface->v4].flag & SELECT) != 0; + for (j = 0, ml = me->mloop + mp->loopstart; j < mp->totloop; j++, ml++) { + if (use_vert_sel) { + mask[ml->v] = (mvert[ml->v].flag & SELECT) != 0; + } } } else if (use_face_sel) { - if (mface->flag & ME_FACE_SEL) { - mask[mface->v1]= 1; - mask[mface->v2]= 1; - mask[mface->v3]= 1; - if(mface->v4) { - mask[mface->v4]= 1; + if (mp->flag & ME_FACE_SEL) { + for (j = 0, ml = me->mloop + mp->loopstart; j < mp->totloop; j++, ml++) { + mask[ml->v] = 1; } } } } + /* bone heat needs triangulated faces */ + BKE_mesh_tessface_ensure(me); + + for(tottri = 0, a = 0, mf = me->mface; a < me->totface; mf++, a++) { + tottri++; + if(mf->v4) tottri++; + } + /* create laplacian */ - sys = laplacian_system_construct_begin(me->totvert, totface, 1); + sys = laplacian_system_construct_begin(me->totvert, tottri, 1); sys->heat.mface= me->mface; sys->heat.totface= me->totface; @@ -710,15 +714,11 @@ laplacian_system_construct_end(sys); -#if 0 /*BMESH_TODO*/ if(dgroupflip) { vertsflipped = MEM_callocN(sizeof(int)*me->totvert, "vertsflipped"); for(a=0; a<me->totvert; a++) vertsflipped[a] = mesh_get_x_mirror_vert(ob, a); } -#else - dgroupflip = 0; -#endif /* compute weights per bone */ for(j=0; j<numsource; j++) { _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs