Revision: 57025
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57025
Author:   campbellbarton
Date:     2013-05-25 21:24:09 +0000 (Sat, 25 May 2013)
Log Message:
-----------
bmesh: replace array reallocation with a single face array and use STACK macros.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_select.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c 2013-05-25 
20:47:06 UTC (rev 57024)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c 2013-05-25 
21:24:09 UTC (rev 57025)
@@ -3108,58 +3108,58 @@
 {
        Object *obedit = CTX_data_edit_object(C);
        BMEditMesh *em = BKE_editmesh_from_object(obedit);
+       BMesh *bm = em->bm;
+
+       BMFace **stack = MEM_mallocN(sizeof(BMFace *) * bm->totface, __func__);
+       STACK_DECLARE(stack);
+
        BMIter iter, liter, liter2;
-       BMFace *f, **stack = NULL;
-       BLI_array_declare(stack);
+       BMFace *f;
        BMLoop *l, *l2;
-       const float sharp = RNA_float_get(op->ptr, "sharpness");
-       int i;
+       const float angle_limit = RNA_float_get(op->ptr, "sharpness");
 
-       BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
-               BM_elem_flag_disable(f, BM_ELEM_TAG);
-       }
+       BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
 
-       BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
-               if (BM_elem_flag_test(f, BM_ELEM_HIDDEN) || 
!BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_TAG))
+
+       BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+               if ((BM_elem_flag_test(f, BM_ELEM_HIDDEN) != 0) ||
+                   (BM_elem_flag_test(f, BM_ELEM_TAG)    != 0) ||
+                   (BM_elem_flag_test(f, BM_ELEM_SELECT) == 0))
+               {
                        continue;
+               }
 
-               BLI_array_empty(stack);
-               i = 1;
+               STACK_INIT(stack);
 
-               BLI_array_grow_one(stack);
-               stack[i - 1] = f;
+               do {
+                       BM_face_select_set(bm, f, true);
 
-               while (i) {
-                       f = stack[i - 1];
-                       i--;
-
-                       BM_face_select_set(em->bm, f, true);
-
                        BM_elem_flag_enable(f, BM_ELEM_TAG);
 
                        BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
                                BM_ITER_ELEM (l2, &liter2, l, BM_LOOPS_OF_LOOP) 
{
                                        float angle;
 
-                                       if (BM_elem_flag_test(l2->f, 
BM_ELEM_TAG) || BM_elem_flag_test(l2->f, BM_ELEM_HIDDEN))
+                                       if (BM_elem_flag_test(l2->f, 
BM_ELEM_TAG) ||
+                                           BM_elem_flag_test(l2->f, 
BM_ELEM_HIDDEN))
+                                       {
                                                continue;
+                                       }
 
-                                       /* edge has exactly two neighboring 
faces, check angle */
                                        angle = angle_normalized_v3v3(f->no, 
l2->f->no);
 
-                                       /* invalidate: edge too sharp */
-                                       if (angle < sharp) {
-                                               BLI_array_grow_one(stack);
-                                               stack[i] = l2->f;
-                                               i++;
+                                       if (angle < angle_limit) {
+                                               STACK_PUSH(stack, l2->f);
                                        }
                                }
                        }
-               }
+               } while ((f = STACK_POP(stack)));
        }
 
-       BLI_array_free(stack);
+       STACK_FREE(stack);
 
+       MEM_freeN(stack);
+
        WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
 
        return OPERATOR_FINISHED;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to