Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-02-04 22:22:21 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-02-04 22:27:01 +0400
commit6c17d2141bf596672f6916d8d5897bcd53d3537d (patch)
tree7768401057f87d19f810407966dee2ab35ea15d5 /source/blender/blenlib/intern/scanfill.c
parentdb749684023176d00d7b1bdfe7f56527b72549e3 (diff)
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).
Diffstat (limited to 'source/blender/blenlib/intern/scanfill.c')
-rw-r--r--source/blender/blenlib/intern/scanfill.c21
1 files changed, 16 insertions, 5 deletions
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;