[Bf-blender-cvs] [6c17d21] master: Scanfill: optimize filling curves, text, masks - skip calculating holes

Campbell Barton noreply at git.blender.org
Tue Feb 4 19:30:31 CET 2014


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;




More information about the Bf-blender-cvs mailing list