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

Daniel Salazar - 3Developer.com zanqdo at gmail.com
Thu Dec 29 23:24:15 CET 2011


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
>


More information about the Bf-committers mailing list