Revision: 44285
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44285
Author:   mont29
Date:     2012-02-20 22:16:20 +0000 (Mon, 20 Feb 2012)
Log Message:
-----------
Done BMESH_TODO in object/object_vgroup.c (make getSurroundingVerts() use 
polys/loops instead of tessfaces).

Also done a few optimizations of related code (OBJECT_OT_vertex_group_fix 
operator).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2012-02-20 
22:04:29 UTC (rev 44284)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2012-02-20 
22:16:20 UTC (rev 44285)
@@ -48,6 +48,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_particle_types.h"
 
+#include "BLI_array.h"
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
@@ -748,100 +749,68 @@
        }
 }
 
-/* This adds the indices of vertices to a list if they are not already present
-It returns the number that it added (0-2)
-It relies on verts having -1 for unassigned indices
-*/
-static int tryToAddVerts(int *verts, int length, int a, int b)
+/* This finds all of the vertices face-connected to vert by an edge and 
returns a
+ * MEM_allocated array of indices of size count.
+ * count is an int passed by reference so it can be assigned the value of the 
length here. */
+static int* getSurroundingVerts(Mesh *me, int vert, int *count)
 {
-       char containsA = FALSE;
-       char containsB = FALSE;
-       int added = 0;
-       int i;
-       for(i = 0; i < length && (!containsA || !containsB); i++) {
-               if(verts[i] == a) {
-                       containsA = TRUE;
-               } else if(verts[i] == b) {
-                       containsB = TRUE;
-               } else if(verts[i] == -1) {
-                       if(!containsA) {
-                               verts[i] = a;
-                               containsA = TRUE;
-                               added++;
-                       } else if(!containsB){
-                               verts[i] = b;
-                               containsB = TRUE;
-                               added++;
-                       }
-               }
-       }
-       return added;
-}
+       MPoly *mp = me->mpoly;
+       int i = me->totpoly;
+       /* Instead of looping twice on all polys and loops, and use a temp 
array, let's rather
+        * use a BLI_array, with a reasonable starting/reserved size 
(typically, there are not
+        * many vertices face-linked to another one, even 8 might be too 
high...). */
+       int *verts = NULL;
+       BLI_array_declare(verts);
 
-/* BMESH_TODO - use MPoly's */
+       BLI_array_reserve(verts, 8);
+       while(i--) {
+               int j = mp->totloop;
+               int first_l = mp->totloop - 1;
+               MLoop *ml = &me->mloop[mp->loopstart];
+               while(j--) {
+                       /* XXX This assume a vert can only be once in a poly, 
even though
+                        *     it seems logical to me, not totaly sure of that. 
*/
+                       if (ml->v == vert) {
+                               int a, b, k;
+                               if(j == first_l) {
+                                       /* We are on the first corner. */
+                                       a = ml[1].v;
+                                       b = ml[j].v;
+                               }
+                               else if(!j) {
+                                       /* We are on the last corner. */
+                                       a = (ml-1)->v;
+                                       b = me->mloop[mp->loopstart].v;
+                               }
+                               else {
+                                       a = (ml-1)->v;
+                                       b = (ml+1)->v;
+                               }
 
-/* This finds all of the vertices connected to vert by an edge
-and returns an array of indices of size count
+                               /* Append a and b verts to array, if not yet 
present. */
+                               k = BLI_array_count(verts);
+                               /* XXX Maybe a == b is enough? */
+                               while(k-- && !(a == b && a == -1)) {
+                                       if(verts[k] == a)
+                                               a = -1;
+                                       else if(verts[k] == b)
+                                               b = -1;
+                               }
+                               if(a != -1)
+                                       BLI_array_append(verts, a);
+                               if(b != -1)
+                                       BLI_array_append(verts, b);
 
-count is an int passed by reference so it can be assigned the value of the 
length here.
-*/
-static int* getSurroundingVerts(Mesh *me, int vert, int *count)
-{
-       int length = 0;
-       int *tverts;
-       int *verts = NULL;
-       MFace *mf = me->mface;
-       int totface = me->totface;
-       int found = 0;
-       int i;
-       for(i = 0; i < totface; i++, mf++) {
-               if(vert == mf->v1 || vert == mf->v2 || vert == mf->v3 || 
(mf->v4 &&vert == mf->v4)) {
-                       length+=2;
-               }
-       }
-       if(!length) {
-               return NULL;
-       }
-       tverts = MEM_mallocN(sizeof(int)*length, "tempSurroundingVerts");
-       mf = me->mface;
-       for(i = 0; i < length; i++) {
-               tverts[i] = -1;
-       }
-       for(i = 0; i < totface; i++, mf++) {
-               int a=-1, b=-1;
-               if(mf->v1 == vert) {
-                       a = mf->v2;
-                       if(mf->v4) {
-                               b = mf->v4;
-                       } else {
-                               b = mf->v3;
+                               /* Vert found in this poly, we can go to next 
one! */
+                               break;
                        }
-               } else if(mf->v2 == vert) {
-                       a = mf->v1;
-                       b = mf->v3;
-               } else if(mf->v3 == vert) {
-                       a = mf->v2;
-                       if(mf->v4) {
-                               b = mf->v4;
-                       } else {
-                               b = mf->v1;
-                       }
-               } else if (mf->v4 && mf->v4 == vert){
-                       a = mf->v1;
-                       b = mf->v3;
-               } else {
-                       continue;
+                       ml++;
                }
-               found += tryToAddVerts(tverts, length, a, b);
+               mp++;
        }
-       if(found) {
-               verts = MEM_mallocN(sizeof(int)* found, "surroundingVerts");
-               for(i = 0; i < found; i++) {
-                       verts[i] = tverts[i];
-               }
-               *count = found;
-       }
-       MEM_freeN(tverts);
+
+       /* Do not free the array! */
+       *count = BLI_array_count(verts);
        return verts;
 }
 
@@ -1087,12 +1056,11 @@
 
        Mesh *me = ob->data;
        MVert *mvert = me->mvert;
-       const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
        int *verts = NULL;
+       if(!(me->editflag & ME_EDIT_VERT_SEL))
+               return;
        for(i = 0; i < me->totvert && mvert; i++, mvert++) {
-               
-               if(use_vert_sel && (mvert->flag & SELECT)) {
-                       
+               if(mvert->flag & SELECT) {
                        int count=0;
                        if((verts = getSurroundingVerts(me, i, &count))) {
                                MVert m;
@@ -1100,7 +1068,8 @@
                                int k;
 
                                DerivedMesh *dm = 
mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
-                               for(k = 0; k < count; k++) {
+                               k = count;
+                               while(k--) {
                                        dm->getVert(dm, verts[k], &m);
                                        p[k] = m;
                                }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to