[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