Commit: 6c17d2141bf596672f6916d8d5897bcd53d3537d
Author: Campbell Barton
Date:   Wed Feb 5 05:22:21 2014 +1100
https://developer.blender.org/rB6c17d2141bf596672f6916d8d5897bcd53d3537d

Scanfill: optimize filling curves, text, masks - skip calculating holes

Support for tagging polygon numbers when adding scanfill data,
saves having to calculate connectivity afterwards (which can take approx half 
overall scanfill time for complex curves).

===================================================================

M       source/blender/blenkernel/intern/displist.c
M       source/blender/blenkernel/intern/mask_rasterize.c
M       source/blender/blenlib/BLI_scanfill.h
M       source/blender/blenlib/intern/scanfill.c

===================================================================

diff --git a/source/blender/blenkernel/intern/displist.c 
b/source/blender/blenkernel/intern/displist.c
index 8879193..e2c87e0 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -481,6 +481,9 @@ void BKE_displist_fill(ListBase *dispbase, ListBase *to, 
const float normal_proj
                                        cont = 1;
                                else if (charidx == dl->charidx) { /* character 
with needed index */
                                        if (colnr == dl->col) {
+
+                                               sf_ctx.poly_nr++;
+
                                                /* make editverts and edges */
                                                f1 = dl->verts;
                                                a = dl->nr;
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c 
b/source/blender/blenkernel/intern/mask_rasterize.c
index 6c46b9c..e1e310f 100644
--- a/source/blender/blenkernel/intern/mask_rasterize.c
+++ b/source/blender/blenkernel/intern/mask_rasterize.c
@@ -647,6 +647,8 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle 
*mr_handle, struct Mask *mas
                                float co[3];
                                co[2] = 0.0f;
 
+                               sf_ctx.poly_nr++;
+
                                if (do_aspect_correct) {
                                        if (width != height) {
                                                float *fp;
diff --git a/source/blender/blenlib/BLI_scanfill.h 
b/source/blender/blenlib/BLI_scanfill.h
index bb91b74..d77640e 100644
--- a/source/blender/blenlib/BLI_scanfill.h
+++ b/source/blender/blenlib/BLI_scanfill.h
@@ -46,6 +46,10 @@ typedef struct ScanFillContext {
        ListBase filledgebase;
        ListBase fillfacebase;
 
+       /* increment this value before adding each curve to skip having to 
calculate
+        * 'poly_nr' for edges and verts (which can take approx half scanfill 
time) */
+       unsigned short poly_nr;
+
        /* private */
        struct ScanFillVertLink *_scdata;
        struct MemArena *arena;
diff --git a/source/blender/blenlib/intern/scanfill.c 
b/source/blender/blenlib/intern/scanfill.c
index bbd15e1..2c095bc 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -117,7 +117,7 @@ ScanFillVert *BLI_scanfill_vert_add(ScanFillContext 
*sf_ctx, const float vec[3])
        /* just zero out the rest */
        zero_v2(sf_v->xy);
        sf_v->keyindex = 0;
-       sf_v->poly_nr = 0;
+       sf_v->poly_nr = sf_ctx->poly_nr;
        sf_v->edge_tot = 0;
        sf_v->f = 0;
 
@@ -135,7 +135,7 @@ ScanFillEdge *BLI_scanfill_edge_add(ScanFillContext 
*sf_ctx, ScanFillVert *v1, S
        sf_ed->v2 = v2;
 
        /* just zero out the rest */
-       sf_ed->poly_nr = 0;
+       sf_ed->poly_nr = sf_ctx->poly_nr;
        sf_ed->f = 0;
        sf_ed->tmp.c = 0;
 
@@ -784,7 +784,7 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, 
const int flag, const
                /* these values used to be set,
                 * however they should always be zero'd so check instead */
                BLI_assert(eve->f == 0);
-               BLI_assert(eve->poly_nr == 0);
+               BLI_assert(sf_ctx->poly_nr || eve->poly_nr == 0);
                BLI_assert(eve->edge_tot == 0);
        }
 #endif
@@ -824,7 +824,7 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, 
const int flag, const
        /* first test vertices if they are in edges */
        /* including resetting of flags */
        for (eed = sf_ctx->filledgebase.first; eed; eed = eed->next) {
-               BLI_assert(eed->poly_nr == 0);
+               BLI_assert(sf_ctx->poly_nr || eed->poly_nr == 0);
                eed->v1->f = SF_VERT_AVAILABLE;
                eed->v2->f = SF_VERT_AVAILABLE;
        }
@@ -872,7 +872,12 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, 
const int flag, const
 
 
        /* STEP 1: COUNT POLYS */
-       if (flag & BLI_SCANFILL_CALC_HOLES) {
+       if (sf_ctx->poly_nr) {
+               poly = sf_ctx->poly_nr;
+               sf_ctx->poly_nr = 0;
+       }
+
+       if (flag & BLI_SCANFILL_CALC_HOLES && (poly == 0)) {
                for (eve = sf_ctx->fillvertbase.first; eve; eve = eve->next) {
                        mul_v2_m3v3(eve->xy, mat_2d, eve->co);
 
@@ -915,6 +920,12 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, 
const int flag, const
                }
                /* printf("amount of poly's: %d\n", poly); */
        }
+       else if (poly) {
+               /* we pre-calculated poly_nr */
+               for (eve = sf_ctx->fillvertbase.first; eve; eve = eve->next) {
+                       mul_v2_m3v3(eve->xy, mat_2d, eve->co);
+               }
+       }
        else {
                poly = 1;

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

Reply via email to