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:
-rw-r--r--source/blender/blenkernel/intern/displist.c3
-rw-r--r--source/blender/blenkernel/intern/mask_rasterize.c2
-rw-r--r--source/blender/blenlib/BLI_scanfill.h4
-rw-r--r--source/blender/blenlib/intern/scanfill.c21
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;