Revision: 41970
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41970
Author:   campbellbarton
Date:     2011-11-18 16:06:20 +0000 (Fri, 18 Nov 2011)
Log Message:
-----------
speedup for editmesh tesselation (approx 4.4x speedup in optimized builds),
this is important because it runs while transforming the mesh in editmode.

also made this code a bit more efficient.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
    branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c  
2011-11-18 15:52:00 UTC (rev 41969)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c  
2011-11-18 16:06:20 UTC (rev 41970)
@@ -130,8 +130,12 @@
 
 static void BMEdit_RecalcTesselation_intern(BMEditMesh *tm)
 {
+       /* use this to avoid locking pthread for _every_ polygon
+        * and calling the fill function */
+#define USE_TESSFACE_SPEEDUP
+
        BMesh *bm = tm->bm;
-       BMLoop **looptris = NULL;
+       BMLoop *(*looptris)[3]= NULL;
        BLI_array_declare(looptris);
        BMIter iter, liter;
        BMFace *f;
@@ -142,69 +146,99 @@
 
        f = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
        for ( ; f; f=BMIter_Step(&iter)) {
-               EditVert *v, *lastv=NULL, *firstv=NULL;
-               EditEdge *e;
-               EditFace *efa;
-
                /*don't consider two-edged faces*/
-               if (f->len < 3) continue;
-               
-               BLI_begin_edgefill();
-               /*scanfill time*/
-               l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
-               for (j=0; l; l=BMIter_Step(&liter), j++) {
-                       /*mark order*/
-                       l->_index = j;
+               if (f->len < 3) {
+                       /* do nothing */
+               }
 
-                       v = BLI_addfillvert(l->v->co);
-                       v->tmp.p = l;
-                       
-                       if (lastv) {
-                               e = BLI_addfilledge(lastv, v);
+#ifdef USE_TESSFACE_SPEEDUP
+
+               /* no need to ensure the loop order, we know its ok */
+
+               else if (f->len == 3) {
+                       BLI_array_growone(looptris);
+                       l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
+                       for (j=0; l; l=BMIter_Step(&liter), j++) {
+                               looptris[i][j] = l;
                        }
+                       i += 1;
+               }
+               else if (f->len == 4) {
+                       BMLoop *ltmp[4];
+                       BLI_array_growitems(looptris, 2);
 
-                       lastv = v;
-                       if (firstv==NULL) firstv = v;
+                       l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
+                       for (j=0; l; l=BMIter_Step(&liter), j++) {
+                               ltmp[j] = l;
+                       }
+
+                       looptris[i][0] = ltmp[0];
+                       looptris[i][1] = ltmp[1];
+                       looptris[i][2] = ltmp[2];
+                       i += 1;
+
+                       looptris[i][0] = ltmp[0];
+                       looptris[i][1] = ltmp[2];
+                       looptris[i][2] = ltmp[3];
+                       i += 1;
                }
 
-               /*complete the loop*/
-               BLI_addfilledge(firstv, v);
+#endif /* USE_TESSFACE_SPEEDUP */
 
-               BLI_edgefill(2);
-               
-               for (efa = fillfacebase.first; efa; efa=efa->next) {
-                       BMLoop *l1, *l2, *l3;
+               else {
+                       EditVert *v, *lastv=NULL, *firstv=NULL;
+                       EditEdge *e;
+                       EditFace *efa;
 
-                       BLI_array_growone(looptris);
-                       BLI_array_growone(looptris);
-                       BLI_array_growone(looptris);
-                       
-                       looptris[i*3] = l1 = efa->v1->tmp.p;
-                       looptris[i*3+1] = l2 = efa->v2->tmp.p;
-                       looptris[i*3+2] = l3 = efa->v3->tmp.p;
-                       
-                       if (l1->_index > l2->_index) {
-                               SWAP(BMLoop*, l1, l2);
+                       BLI_begin_edgefill();
+                       /*scanfill time*/
+                       l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
+                       for (j=0; l; l=BMIter_Step(&liter), j++) {
+                               /*mark order*/
+                               l->_index = j;
+
+                               v = BLI_addfillvert(l->v->co);
+                               v->tmp.p = l;
+
+                               if (lastv) {
+                                       e = BLI_addfilledge(lastv, v);
+                               }
+
+                               lastv = v;
+                               if (firstv==NULL) firstv = v;
                        }
-                       if (l2->_index > l3->_index) {
-                               SWAP(BMLoop*, l2, l3);
+
+                       /*complete the loop*/
+                       BLI_addfilledge(firstv, v);
+
+                       BLI_edgefill(2);
+
+                       for (efa = fillfacebase.first; efa; efa=efa->next) {
+                               BMLoop *l1= efa->v1->tmp.p;
+                               BMLoop *l2= efa->v2->tmp.p;
+                               BMLoop *l3= efa->v3->tmp.p;
+
+                               BLI_array_growone(looptris);
+
+                               if (l1->_index > l2->_index) { SWAP(BMLoop*, 
l1, l2); }
+                               if (l2->_index > l3->_index) { SWAP(BMLoop*, 
l2, l3); }
+                               if (l1->_index > l2->_index) { SWAP(BMLoop*, 
l1, l2); }
+
+                               looptris[i][0] = l1;
+                               looptris[i][1] = l2;
+                               looptris[i][2] = l3;
+                               i += 1;
                        }
-                       if (l1->_index > l2->_index) {
-                               SWAP(BMLoop*, l1, l2);
-                       }
-                       
-                       looptris[i*3] = l1;
-                       looptris[i*3+1] = l2;
-                       looptris[i*3+2] = l3;
 
-                       i += 1;
+                       BLI_end_edgefill();
                }
-
-               BLI_end_edgefill();
        }
 
        tm->tottri = i;
-       tm->looptris = (BMLoop *(*)[3])looptris;
+       tm->looptris = looptris;
+
+#undef USE_TESSFACE_SPEEDUP
+
 }
 
 void BMEdit_RecalcTesselation(BMEditMesh *em)

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c      
2011-11-18 15:52:00 UTC (rev 41969)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c      
2011-11-18 16:06:20 UTC (rev 41970)
@@ -2430,6 +2430,9 @@
        }
 
        return totface;
+
+#undef USE_TESSFACE_SPEEDUP
+
 }
 
 /*

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h   2011-11-18 
15:52:00 UTC (rev 41969)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_class.h   2011-11-18 
16:06:20 UTC (rev 41970)
@@ -97,7 +97,7 @@
        struct BMLoop *radial_next, *radial_prev;
        
        /*private variables*/
-       struct BMLoop *next, *prev; /*won't be able to use listbase API, ger, 
due to head*/\
+       struct BMLoop *next, *prev; /*won't be able to use listbase API, ger, 
due to head*/
        int _index; /*used for sorting during tesselation*/
 } BMLoop;
 
@@ -108,10 +108,10 @@
 
 typedef struct BMFace {
        BMHeader head;
-       int len; /*includes all boundary loops*/\
-       int totbounds; /*total boundaries, is one plus the number of holes in 
the face*/\
+       int len; /*includes all boundary loops*/
+       int totbounds; /*total boundaries, is one plus the number of holes in 
the face*/
        ListBase loops;
-       float no[3]; /*yes, we do store this here*/\
+       float no[3]; /*yes, we do store this here*/
        short mat_nr;
 } BMFace;
 

Modified: branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c    
2011-11-18 15:52:00 UTC (rev 41969)
+++ branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c    
2011-11-18 16:06:20 UTC (rev 41970)
@@ -884,7 +884,7 @@
 
 static void rna_MeshColorLayer_name_set(PointerRNA *ptr, const char *value)
 {
-       Mesh *me = rna_mesh(ptr);
+       /* Mesh *me = rna_mesh(ptr); */ /* UNUSED */
        /* CustomData *pdata = rna_mesh_pdata(ptr); */ /* UNUSED */
        CustomDataLayer *cdl= (CustomDataLayer*)ptr->data;
        BLI_strncpy_utf8(cdl->name, value, sizeof(cdl->name));
@@ -1875,7 +1875,7 @@
        RNA_def_property_boolean_sdna(prop, NULL, "texflag", AUTOSPACE);
        RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active 
object's texture space automatically when transforming object");
 
-       prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, 
PROP_TRANSLATION);
+       prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, 
PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_ui_text(prop, "Texure Space Location", "Texture space 
location");
        RNA_def_property_editable_func(prop, texspace_editable);
@@ -2363,15 +2363,15 @@
        prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, 
PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "texflag", AUTOSPACE);
        RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active 
object's texture space automatically when transforming object");
-       
+
        /*prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, 
PROP_TRANSLATION);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space 
location");
        RNA_def_property_editable_func(prop, "rna_Mesh_texspace_editable");
-       RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_loc_get", 
"rna_Mesh_texspace_loc_set", NULL);     
+       RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_loc_get", 
"rna_Mesh_texspace_loc_set", NULL);
        RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        */
-       
+
        /* not supported yet
        prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float(prop, NULL, "rot");

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

Reply via email to