[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42970] branches/bmesh/blender/source/ blender: bmesh mirror modifier cleanup

Michael Fox mfoxdogg at gmail.com
Thu Dec 29 23:31:11 CET 2011


Off by default is fine, but removal all together i will not allow, it 
has helped me and many other users immensely modelling a symmetrical 
object but having each side independently animated, all this does is 
mirror weights in vgroup .L to vgroup .R


On 30/12/11 09:24, Daniel Salazar - 3Developer.com wrote:
> maybe bmesh is an opportunity to kill vertex group mirroring in vgroup
> modifier or at least have it off by default. I still can't imagine any real
> use for this
>
> cheers
>
> Daniel Salazar
> 3Developer.com
>
>
> On Thu, Dec 29, 2011 at 3:15 AM, Campbell Barton<ideasman42 at gmail.com>wrote:
>
>> Revision: 42970
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42970
>> Author:   campbellbarton
>> Date:     2011-12-29 09:15:06 +0000 (Thu, 29 Dec 2011)
>> Log Message:
>> -----------
>> bmesh mirror modifier cleanup
>> * vertex map was a dynamicly realloc'd array when the final size was
>> known, use a fixed array instead.
>> * vertex map was being calculated even when not used.
>> * face tesselation was being called twice.
>> * an unused deform group array was being created.
>>
>> Modified Paths:
>> --------------
>>     branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>>     branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
>>
>> Modified:
>> branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> ===================================================================
>> ---
>> branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> 2011-12-29 07:29:44 UTC (rev 42969)
>> +++
>> branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> 2011-12-29 09:15:06 UTC (rev 42970)
>> @@ -2268,15 +2268,16 @@
>>   }
>>
>>   #if 1
>> -/*merge verts
>> -
>> -  vtargetmap is a table that maps vertices to target vertices.  a value
>> of -1
>> -  indicates a vertex is a target, and is to be kept.
>> -
>> -  this frees dm, and returns a new one.
>> -
>> -  this is a really horribly written function.  ger. - joeedh
>> -
>> +/* merge verts
>> + *
>> + * vtargetmap is a table that maps vertices to target vertices.  a value
>> of -1
>> + * indicates a vertex is a target, and is to be kept.
>> + *
>> + * this frees dm, and returns a new one.
>> + *
>> + * this is a really horribly written function.  ger. - joeedh
>> + *
>> + * note, CDDM_recalc_tesselation has to run on the returned DM if you
>> want to access tessfaces.
>>   */
>>   DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, int *vtargetmap)
>>   {
>> @@ -2437,8 +2438,6 @@
>>         memcpy(cddm2->mloop, mloop, sizeof(MLoop)*BLI_array_count(mloop));
>>         memcpy(cddm2->mpoly, mpoly, sizeof(MPoly)*BLI_array_count(mpoly));
>>         BLI_array_free(mvert); BLI_array_free(medge);
>> BLI_array_free(mloop); BLI_array_free(mpoly);
>> -
>> -       CDDM_recalc_tesselation((DerivedMesh*)cddm2);
>>
>>         if (newv)
>>                 MEM_freeN(newv);
>>
>> Modified:
>> branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
>> ===================================================================
>> --- branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
>> 2011-12-29 07:29:44 UTC (rev 42969)
>> +++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
>> 2011-12-29 09:15:06 UTC (rev 42970)
>> @@ -100,37 +100,22 @@
>>   {
>>         float tolerance_sq;
>>         DerivedMesh *cddm, *origdm;
>> -       bDeformGroup *def;
>> -       bDeformGroup **vector_def = NULL;
>>         MVert *mv, *ov;
>>         MEdge *me;
>>         MLoop *ml;
>>         MPoly *mp;
>>         float mtx[4][4];
>> -       int i, j, *vtargetmap = NULL;
>> -       BLI_array_declare(vtargetmap);
>> -       int vector_size=0, a, totshape;
>> +       int i, j;
>> +       int a, totshape;
>> +       int *vtargetmap, *vtmap_a, *vtmap_b;
>> +       const int do_vtargetmap = !(mmd->flag&  MOD_MIR_NO_MERGE);
>>
>>         tolerance_sq = mmd->tolerance * mmd->tolerance;
>>
>>         origdm = dm;
>>         if (!CDDM_Check(dm))
>>                 dm = CDDM_copy(dm, 0);
>> -
>> -       if (mmd->flag&  MOD_MIR_VGROUP) {
>> -               /* calculate the number of deformedGroups */
>> -               for(vector_size = 0, def = ob->defbase.first; def;
>> -                       def = def->next, vector_size++);
>>
>> -               /* load the deformedGroups for fast access */
>> -               vector_def =
>> -                       (bDeformGroup **)MEM_mallocN(sizeof(bDeformGroup*)
>> * vector_size,
>> -
>>         "group_index");
>> -               for(a = 0, def = ob->defbase.first; def; def = def->next,
>> a++) {
>> -                       vector_def[a] = def;
>> -               }
>> -       }
>> -
>>         /*mtx is the mirror transformation*/
>>         unit_m4(mtx);
>>         mtx[axis][axis] = -1.0;
>> @@ -166,20 +151,30 @@
>>         CustomData_copy_data(&dm->vertData,&cddm->vertData, 0,
>> dm->numVertData, dm->numVertData);
>>         CustomData_copy_data(&dm->edgeData,&cddm->edgeData, 0,
>> dm->numEdgeData, dm->numEdgeData);
>>         CustomData_copy_data(&dm->polyData,&cddm->polyData, 0,
>> dm->numPolyData, dm->numPolyData);
>> -
>> +
>> +       if (do_vtargetmap) {
>> +               /* second half is filled with -1 */
>> +               vtargetmap = MEM_mallocN(sizeof(int) * dm->numVertData *
>> 2, "MOD_mirror tarmap");
>> +
>> +               vtmap_a = vtargetmap;
>> +               vtmap_b = vtargetmap + dm->numVertData;
>> +       }
>> +
>>         /*mirror vertex coordinates*/
>>         ov = CDDM_get_verts(cddm);
>>         mv = ov + dm->numVertData;
>>         for (i=0; i<dm->numVertData; i++, mv++, ov++) {
>>                 mul_m4_v3(mtx, mv->co);
>> -               /*compare location of the original and mirrored vertex, to
>> see if they
>> -                 should be mapped for merging*/
>> -               if (len_squared_v3v3(ov->co, mv->co)<  tolerance_sq) {
>> -                       BLI_array_append(vtargetmap, i+dm->numVertData);
>> +
>> +               if (do_vtargetmap) {
>> +                       /* compare location of the original and mirrored
>> vertex, to see if they
>> +                        * should be mapped for merging */
>> +                       *vtmap_a = (len_squared_v3v3(ov->co, mv->co)<
>> tolerance_sq) ? dm->numVertData + i : -1;
>> +                       *vtmap_b = -1; /* fill here to avoid 2x loops */
>> +
>> +                       vtmap_a++;
>> +                       vtmap_b++;
>>                 }
>> -               else {
>> -                       BLI_array_append(vtargetmap, -1);
>> -               }
>>         }
>>
>>         /*handle shape keys*/
>> @@ -191,10 +186,6 @@
>>                 }
>>         }
>>
>> -       for (i=0; i<dm->numVertData; i++) {
>> -               BLI_array_append(vtargetmap, -1);
>> -       }
>> -
>>         /*adjust mirrored edge vertex indices*/
>>         me = CDDM_get_edges(cddm) + dm->numEdgeData;
>>         for (i=0; i<dm->numEdgeData; i++, me++) {
>> @@ -250,8 +241,6 @@
>>                 }
>>         }
>>
>> -       CDDM_recalc_tesselation(cddm);
>> -
>>         /*handle vgroup stuff*/
>>         if ((mmd->flag&  MOD_MIR_VGROUP)&&
>> CustomData_has_layer(&cddm->vertData, CD_MDEFORMVERT)) {
>>                 MDeformVert *dvert = CustomData_get_layer(&cddm->vertData,
>> CD_MDEFORMVERT);
>> @@ -259,18 +248,19 @@
>>
>>                 flip_map= defgroup_flip_map(ob,&flip_map_len, FALSE);
>>
>> -               for (i=0; i<dm->numVertData; i++, dvert++) {
>> +               for (i = dm->numVertData; i-->  0; dvert++) {
>>                         defvert_flip(dvert, flip_map, flip_map_len);
>>                 }
>>         }
>> -
>> -       if (!(mmd->flag&  MOD_MIR_NO_MERGE))
>> +
>> +       if (do_vtargetmap) {
>> +               /* this calls CDDM_recalc_tesselation, so dont do twice */
>>                 cddm = CDDM_merge_verts(cddm, vtargetmap);
>> +               MEM_freeN(vtargetmap);
>> +       }
>> +
>> +       CDDM_recalc_tesselation(cddm);
>>
>> -       BLI_array_free(vtargetmap);
>> -
>> -       if (vector_def) MEM_freeN(vector_def);
>> -
>>         if (dm != origdm) {
>>                 dm->needsFree = 1;
>>                 dm->release(dm);
>>
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



More information about the Bf-committers mailing list