diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mask_rasterize.c | 2 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_scanfill.h | 4 | ||||
-rw-r--r-- | source/blender/blenlib/intern/scanfill.c | 21 |
4 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 88791930e0e..e2c87e08b54 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 6c46b9c7c5b..e1e310f3d3c 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 bb91b747223..d77640ea187 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 bbd15e16328..2c095bc3533 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; |