[Bf-blender-cvs] [c85e66e] master: Scanfill: add user-flags for edges and verts, useful elsewhere.

Campbell Barton noreply at git.blender.org
Thu Feb 13 06:47:45 CET 2014


Commit: c85e66e7fe6d12c8a1b33dec703e9bb342b9953b
Author: Campbell Barton
Date:   Thu Feb 13 16:46:51 2014 +1100
https://developer.blender.org/rBc85e66e7fe6d12c8a1b33dec703e9bb342b9953b

Scanfill: add user-flags for edges and verts, useful elsewhere.

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

M	source/blender/blenlib/BLI_scanfill.h
M	source/blender/blenlib/intern/scanfill.c

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

diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h
index 8e5445b..c564fce 100644
--- a/source/blender/blenlib/BLI_scanfill.h
+++ b/source/blender/blenlib/BLI_scanfill.h
@@ -69,14 +69,16 @@ typedef struct ScanFillVert {
 	unsigned int keyindex; /* index, caller can use how it likes to match the scanfill result with own data */
 	unsigned short poly_nr;
 	unsigned char edge_tot;  /* number of edges using this vertex */
-	unsigned char f;
+	unsigned int f : 4;  /* vert status */
+	unsigned int user_flag : 4;  /* flag callers can use as they like */
 } ScanFillVert;
 
 typedef struct ScanFillEdge {
 	struct ScanFillEdge *next, *prev;
 	struct ScanFillVert *v1, *v2;
 	unsigned short poly_nr;
-	unsigned char f;
+	unsigned int f : 4;  /* edge status */
+	unsigned int user_flag : 4;  /* flag callers can use as they like */
 	union {
 		unsigned char c;
 	} tmp;
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 4d998b5..c01a4a5 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -52,7 +52,7 @@ typedef struct PolyFill {
 	unsigned int edges, verts;
 	float min_xy[2], max_xy[2];
 	unsigned short nr;
-	unsigned char f;
+	bool f;
 } PolyFill;
 
 typedef struct ScanFillVertLink {
@@ -66,16 +66,26 @@ typedef struct ScanFillVertLink {
 #define SF_EPSILON   0.00003f
 #define SF_EPSILON_SQ (SF_EPSILON * SF_EPSILON)
 
+
+/* ScanFillVert.status */
 #define SF_VERT_NEW        0  /* all new verts have this flag set */
 #define SF_VERT_AVAILABLE  1  /* available - in an edge */
-#define SF_VERT_ZERO_LEN 255
+#define SF_VERT_ZERO_LEN   2
+
 
+/* ScanFillEdge.status */
 /* Optionally set ScanFillEdge f to this to mark original boundary edges.
  * Only needed if there are internal diagonal edges passed to BLI_scanfill_calc. */
 #define SF_EDGE_NEW      0  /* all new edges have this flag set */
 // #define SF_EDGE_BOUNDARY 1  /* UNUSED */
 #define SF_EDGE_INTERNAL 2  /* edge is created while scan-filling */
 
+
+/* PolyFill.status */
+#define SF_POLY_NEW   0  /* all polys initialized to this */
+#define SF_POLY_VALID 1  /* has at least 3 verts */
+
+
 /**
  * \note this is USHRT_MAX so incrementing  will set to zero
  * which happens if callers choose to increment #ScanFillContext.poly_nr before adding each curve.
@@ -131,6 +141,7 @@ ScanFillVert *BLI_scanfill_vert_add(ScanFillContext *sf_ctx, const float vec[3])
 	sf_v->poly_nr = sf_ctx->poly_nr;
 	sf_v->edge_tot = 0;
 	sf_v->f = SF_VERT_NEW;
+	sf_v->user_flag = 0;
 
 	return sf_v;
 }
@@ -148,6 +159,7 @@ ScanFillEdge *BLI_scanfill_edge_add(ScanFillContext *sf_ctx, ScanFillVert *v1, S
 	/* just zero out the rest */
 	sf_ed->poly_nr = sf_ctx->poly_nr;
 	sf_ed->f = SF_EDGE_NEW;
+	sf_ed->user_flag = 0;
 	sf_ed->tmp.c = 0;
 
 	return sf_ed;
@@ -550,7 +562,7 @@ static unsigned int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int fl
 
 	/* STEP 2: FILL LOOP */
 
-	if (pf->f == 0)
+	if (pf->f == SF_POLY_NEW)
 		twoconnected = true;
 
 	/* (temporal) security: never much more faces than vertices */
@@ -1035,7 +1047,7 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const
 		pf->edges = pf->verts = 0;
 		pf->min_xy[0] = pf->min_xy[1] =  1.0e20f;
 		pf->max_xy[0] = pf->max_xy[1] = -1.0e20f;
-		pf->f = 0;
+		pf->f = SF_POLY_NEW;
 		pf->nr = a;
 		pf++;
 	}
@@ -1052,7 +1064,9 @@ unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const
 		min_xy_p[1] = (min_xy_p[1]) < (eve->xy[1]) ? (min_xy_p[1]) : (eve->xy[1]);
 		max_xy_p[0] = (max_xy_p[0]) > (eve->xy[0]) ? (max_xy_p[0]) : (eve->xy[0]);
 		max_xy_p[1] = (max_xy_p[1]) > (eve->xy[1]) ? (max_xy_p[1]) : (eve->xy[1]);
-		if (eve->edge_tot > 2) pflist[eve->poly_nr].f = 1;
+		if (eve->edge_tot > 2) {
+			pflist[eve->poly_nr].f = SF_POLY_VALID;
+		}
 	}
 
 	/* STEP 4: FIND HOLES OR BOUNDS, JOIN THEM




More information about the Bf-blender-cvs mailing list