[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48926] trunk/blender/source/blender/ blenkernel/intern/mask_rasterize.c: mask rasterizer, render unclosed splines as lines.

Campbell Barton ideasman42 at gmail.com
Sat Jul 14 22:29:18 CEST 2012


Revision: 48926
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48926
Author:   campbellbarton
Date:     2012-07-14 20:29:17 +0000 (Sat, 14 Jul 2012)
Log Message:
-----------
mask rasterizer, render unclosed splines as lines.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c

Modified: trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-14 19:21:13 UTC (rev 48925)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-14 20:29:17 UTC (rev 48926)
@@ -46,6 +46,7 @@
 
 #ifndef USE_RASKTER
 
+#define SPLINE_RESOL_CAP 32
 #define SPLINE_RESOL 32
 #define BUCKET_PIXELS_PER_CELL 8
 
@@ -443,6 +444,11 @@
 
 	for (masklay = mask->masklayers.first, masklay_index = 0; masklay; masklay = masklay->next, masklay_index++) {
 
+		const unsigned int tot_splines = BLI_countlist(&masklay->splines);
+		/* we need to store vertex ranges for open splines for filling */
+		unsigned int (*open_spline_ranges)[2] = MEM_callocN(sizeof(open_spline_ranges) * tot_splines, __func__);
+		unsigned int   open_spline_index = 0;
+
 		MaskSpline *spline;
 
 		/* scanfill */
@@ -461,7 +467,7 @@
 		BLI_scanfill_begin(&sf_ctx);
 
 		for (spline = masklay->splines.first; spline; spline = spline->next) {
-			// const unsigned int is_cyclic = (spline->flag & MASK_SPLINE_CYCLIC) != 0;
+			const unsigned int is_cyclic = (spline->flag & MASK_SPLINE_CYCLIC) != 0;
 
 			float (*diff_points)[2];
 			int tot_diff_point;
@@ -535,58 +541,115 @@
 					}
 				}
 
-				copy_v2_v2(co, diff_points[0]);
-				sf_vert_prev = BLI_scanfill_vert_add(&sf_ctx, co);
-				sf_vert_prev->tmp.u = sf_vert_tot;
-				sf_vert_prev->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
-				sf_vert_tot++;
-
-				/* TODO, an alternate functions so we can avoid double vector copy! */
-				for (j = 1; j < tot_diff_point; j++) {
-					copy_v2_v2(co, diff_points[j]);
-					sf_vert = BLI_scanfill_vert_add(&sf_ctx, co);
-					sf_vert->tmp.u = sf_vert_tot;
-					sf_vert->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
+				if (is_cyclic) {
+					copy_v2_v2(co, diff_points[0]);
+					sf_vert_prev = BLI_scanfill_vert_add(&sf_ctx, co);
+					sf_vert_prev->tmp.u = sf_vert_tot;
+					sf_vert_prev->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
 					sf_vert_tot++;
-				}
 
-				sf_vert = sf_vert_prev;
-				sf_vert_prev = sf_ctx.fillvertbase.last;
+					/* TODO, an alternate functions so we can avoid double vector copy! */
+					for (j = 1; j < tot_diff_point; j++) {
+						copy_v2_v2(co, diff_points[j]);
+						sf_vert = BLI_scanfill_vert_add(&sf_ctx, co);
+						sf_vert->tmp.u = sf_vert_tot;
+						sf_vert->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
+						sf_vert_tot++;
+					}
 
-				for (j = 0; j < tot_diff_point; j++) {
-					ScanFillEdge *sf_edge = BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_vert);
-					sf_edge->tmp.c = SF_EDGE_IS_BOUNDARY;
+					sf_vert = sf_vert_prev;
+					sf_vert_prev = sf_ctx.fillvertbase.last;
 
-					sf_vert_prev = sf_vert;
-					sf_vert = sf_vert->next;
-				}
+					for (j = 0; j < tot_diff_point; j++) {
+						ScanFillEdge *sf_edge = BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_vert);
+						sf_edge->tmp.c = SF_EDGE_IS_BOUNDARY;
 
-				if (diff_feather_points) {
-					float co_feather[3];
-					co_feather[2] = 1.0f;
+						sf_vert_prev = sf_vert;
+						sf_vert = sf_vert->next;
+					}
 
-					BLI_assert(tot_diff_feather_points == tot_diff_point);
+					if (diff_feather_points) {
+						float co_feather[3];
+						co_feather[2] = 1.0f;
 
-					/* note: only added for convenience, we don't infact use these to scanfill,
-					 * only to create feather faces after scanfill */
-					for (j = 0; j < tot_diff_feather_points; j++) {
-						copy_v2_v2(co_feather, diff_feather_points[j]);
-						sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
+						BLI_assert(tot_diff_feather_points == tot_diff_point);
 
-						/* no need for these attrs */
-#if 0
-						sf_vert->tmp.u = sf_vert_tot;
-						sf_vert->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
-#endif
-						sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
-						sf_vert_tot++;
+						/* note: only added for convenience, we don't infact use these to scanfill,
+						 * only to create feather faces after scanfill */
+						for (j = 0; j < tot_diff_feather_points; j++) {
+							copy_v2_v2(co_feather, diff_feather_points[j]);
+							sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
+
+							/* no need for these attrs */
+	#if 0
+							sf_vert->tmp.u = sf_vert_tot;
+							sf_vert->keyindex = sf_vert_tot + tot_diff_point; /* absolute index of feather vert */
+	#endif
+							sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
+							sf_vert_tot++;
+						}
+
+						if (diff_feather_points) {
+							MEM_freeN(diff_feather_points);
+						}
+
+						tot_feather_quads += tot_diff_point;
 					}
+				}
+				else {
+					/* unfilled spline (non cyclic) */
+					if (diff_feather_points) {
 
-					if (diff_feather_points) {
+						float co_diff[3];
+
+						float co_feather[3];
+						co_feather[2] = 1.0f;
+
+
+						open_spline_ranges[open_spline_index ][0] = sf_vert_tot;
+						open_spline_ranges[open_spline_index ][1] = tot_diff_point;
+						open_spline_index++;
+
+
+						/* TODO, an alternate functions so we can avoid double vector copy! */
+						for (j = 0; j < tot_diff_point; j++) {
+
+							/* center vert */
+							copy_v2_v2(co, diff_points[j]);
+							sf_vert = BLI_scanfill_vert_add(&sf_ctx, co);
+							sf_vert->tmp.u = sf_vert_tot;
+							sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
+							sf_vert_tot++;
+
+
+							/* feather vert A */
+							copy_v2_v2(co_feather, diff_feather_points[j]);
+							sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
+							sf_vert->tmp.u = sf_vert_tot;
+							sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
+							sf_vert_tot++;
+
+
+							/* feather vert B */
+							sub_v2_v2v2(co_diff, co, co_feather);
+							add_v2_v2v2(co_feather, co, co_diff);
+							sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
+							sf_vert->tmp.u = sf_vert_tot;
+							sf_vert->keyindex = SF_KEYINDEX_TEMP_ID;
+							sf_vert_tot++;
+
+							tot_feather_quads += 2;
+						}
+						tot_feather_quads -= 2;
+
 						MEM_freeN(diff_feather_points);
+
+						/* ack these are infact tris, but they are extra faces so no matter,
+						 * +1 becausing adding one vert results in 2 tris (joining the existing endpoints)
+						 */
+						// tot_feather_quads + ((SPLINE_RESOL_CAP + 1) * 2);
+
 					}
-
-					tot_feather_quads += tot_diff_point;
 				}
 			}
 
@@ -659,6 +722,37 @@
 				}
 			}
 
+			/* feather only splines */
+			while (open_spline_index > 0) {
+				unsigned int start_vidx          = open_spline_ranges[--open_spline_index][0];
+				unsigned int tot_diff_point_sub1 = open_spline_ranges[  open_spline_index][1] - 1;
+				unsigned int k, j;
+
+				j = start_vidx;
+
+				/* subtract one since we reference next vertex triple */
+				for (k = 0; k < tot_diff_point_sub1; k++, j += 3) {
+
+					BLI_assert(j == start_vidx + (k * 3));
+
+					*(face++) = j + 0;
+					*(face++) = j + 1;
+					*(face++) = j + 4; /* next span */
+					*(face++) = j + 3; /* next span */
+
+					face_index++;
+
+					*(face++) = j + 0;
+					*(face++) = j + 3; /* next span */
+					*(face++) = j + 5; /* next span */
+					*(face++) = j + 2;
+
+					face_index++;
+				}
+			}
+
+			MEM_freeN(open_spline_ranges);
+
 			// fprintf(stderr, "%d %d\n", face_index, sf_face_tot + tot_feather_quads);
 
 			BLI_assert(face_index == sf_tri_tot + tot_feather_quads);




More information about the Bf-blender-cvs mailing list