[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49008] trunk/blender/source/blender/ blenkernel/intern/mask_rasterize.c: wip mask capping - works but needs aspect correction and to be faded out.

Campbell Barton ideasman42 at gmail.com
Tue Jul 17 22:01:02 CEST 2012


Revision: 49008
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49008
Author:   campbellbarton
Date:     2012-07-17 20:01:01 +0000 (Tue, 17 Jul 2012)
Log Message:
-----------
wip mask capping - works but needs aspect correction and to be faded out.

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-17 18:14:59 UTC (rev 49007)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-17 20:01:01 UTC (rev 49008)
@@ -47,7 +47,7 @@
 
 #ifndef USE_RASKTER
 
-#define SPLINE_RESOL_CAP 32
+#define SPLINE_RESOL_CAP 4
 #define SPLINE_RESOL 32
 #define BUCKET_PIXELS_PER_CELL 8
 
@@ -57,7 +57,35 @@
 #define TRI_TERMINATOR_ID   ((unsigned int) -1)
 #define TRI_VERT            ((unsigned int) -1)
 
+/* for debugging add... */
+/* 	printf("%u %u %u %u\n", _t[0], _t[1], _t[2], _t[3]); \ */
+#define FACE_ASSERT(face, vert_max)                      \
+{                                                        \
+	unsigned int *_t = face;                             \
+	BLI_assert(_t[0] < vert_max);                        \
+	BLI_assert(_t[1] < vert_max);                        \
+	BLI_assert(_t[2] < vert_max || _t[2] == TRI_VERT);   \
+} (void)0
 
+void rotate_point(const float cent[2], const float angle, float p[2])
+{
+  const float s = sinf(angle);
+  const float c = cosf(angle);
+  float p_new[2];
+
+  /* translate point back to origin */
+  p[0] -= cent[0];
+  p[1] -= cent[1];
+
+  /* rotate point */
+  p_new[0] = p[0] * c - p[1] * s;
+  p_new[1] = p[0] * s + p[1] * c;
+
+  /* translate point back */
+  p[0] = p_new[0] + cent[0];
+  p[1] = p_new[1] + cent[1];
+}
+
 /* --------------------------------------------------------------------- */
 /* local structs for mask rasterizeing                                   */
 /* --------------------------------------------------------------------- */
@@ -690,11 +718,42 @@
 							tot_feather_quads -= 2;
 						}
 
-						/* 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);
+						/*cap ends */
+						if (!is_cyclic) {
 
+							unsigned int k;
+
+							for (k = 1; k < SPLINE_RESOL_CAP; k++) {
+								const float angle = (float)k * (1.0f / SPLINE_RESOL_CAP) * (float)M_PI;
+								copy_v2_v2(co_feather, diff_feather_points[0]);
+								rotate_point(diff_points[0], angle, co_feather);
+
+								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 += SPLINE_RESOL_CAP;
+
+							for (k = 1; k < SPLINE_RESOL_CAP; k++) {
+								const float angle = (float)k * (1.0f / SPLINE_RESOL_CAP) * (float)M_PI;
+								copy_v2_v2(co_feather, diff_feather_points[tot_diff_point - 1]);
+								rotate_point(diff_points[tot_diff_point - 1], -angle, co_feather);
+
+								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 += SPLINE_RESOL_CAP;
+
+
+						}
+
+						/* end capping */
+
 					}
 				}
 			}
@@ -742,14 +801,17 @@
 			sf_tri_tot = BLI_scanfill_calc_ex(&sf_ctx, FALSE, zvec);
 
 			face_array = MEM_mallocN(sizeof(*face_array) * (sf_tri_tot + tot_feather_quads), "maskrast_face_index");
+			face_index = 0;
 
 			/* tri's */
 			face = (unsigned int *)face_array;
-			for (sf_tri = sf_ctx.fillfacebase.first, face_index = 0; sf_tri; sf_tri = sf_tri->next, face_index++) {
+			for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) {
 				*(face++) = sf_tri->v3->tmp.u;
 				*(face++) = sf_tri->v2->tmp.u;
 				*(face++) = sf_tri->v1->tmp.u;
 				*(face++) = TRI_VERT;
+				face_index++;
+				FACE_ASSERT(face - 4, sf_vert_tot);
 			}
 
 			/* start of feather faces... if we have this set,
@@ -766,8 +828,8 @@
 						*(face++) = sf_edge->v2->tmp.u;
 						*(face++) = sf_edge->v2->keyindex;
 						*(face++) = sf_edge->v1->keyindex;
-
 						face_index++;
+						FACE_ASSERT(face - 4, sf_vert_tot);
 					}
 				}
 			}
@@ -789,15 +851,15 @@
 					*(face++) = j + 0;                 /* z 1 */
 					*(face++) = j + 1;                 /* z 0 */
 					*(face++) = j + 4; /* next span */ /* z 0 */
-
 					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
 
 					*(face++) = j + 0;                 /* z 1 */
 					*(face++) = j + 3; /* next span */ /* z 1 */
 					*(face++) = j + 5; /* next span */ /* z 0 */
 					*(face++) = j + 2;                 /* z 0 */
-
 					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
 				}
 
 				if (open_spline_ranges[open_spline_index].is_cyclic) {
@@ -805,15 +867,85 @@
 					*(face++) = j          + 0;                 /* z 1 */
 					*(face++) = j          + 1;                 /* z 0 */
 					*(face++) = start_vidx + 1; /* next span */ /* z 0 */
-
 					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
 
 					*(face++) = j          + 0;                 /* z 1 */
 					*(face++) = start_vidx + 0; /* next span */ /* z 1 */
 					*(face++) = start_vidx + 2; /* next span */ /* z 0 */
 					*(face++) = j          + 2;                 /* z 0 */
+					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
+				}
+				else {
+					unsigned int midvidx = start_vidx;
+					// unsigned int repvidx;  /* repeat vertex index, ugh */
 
+					/***************
+					 * cap end 'a' */
+					j = midvidx + (open_spline_ranges[open_spline_index].vertex_total * 3);
+
+					for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
+						*(face++) = midvidx + 0;  /* z 1 */
+						*(face++) = j + 0;        /* z 0 */
+						*(face++) = j + 1;        /* z 0 */
+						*(face++) = TRI_VERT;
+						face_index++;
+						FACE_ASSERT(face - 4, sf_vert_tot);
+					}
+
+					j = start_vidx + (open_spline_ranges[open_spline_index].vertex_total * 3);
+
+					/* 2 tris that join the original */
+					*(face++) = midvidx + 0;  /* z 1 */
+					*(face++) = midvidx + 1;  /* z 0 */
+					*(face++) = j + 0;        /* z 0 */
+					*(face++) = TRI_VERT;
 					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
+
+					*(face++) = midvidx + 0;               /* z 1 */
+					*(face++) = j + SPLINE_RESOL_CAP - 2;  /* z 0 */
+					*(face++) = midvidx + 2;               /* z 0 */
+					*(face++) = TRI_VERT;
+					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
+
+
+					/***************
+					 * cap end 'b' */
+					/* ... same as previous but v 2-3 flipped, and different initial offsets */
+
+					j = start_vidx + (open_spline_ranges[open_spline_index].vertex_total * 3) + (SPLINE_RESOL_CAP - 1);
+
+					midvidx = start_vidx + (open_spline_ranges[open_spline_index].vertex_total * 3) - 3;
+
+					for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
+						*(face++) = midvidx;  /* z 1 */
+						*(face++) = j + 1;    /* z 0 */
+						*(face++) = j + 0;    /* z 0 */
+						*(face++) = TRI_VERT;
+						face_index++;
+						FACE_ASSERT(face - 4, sf_vert_tot);
+					}
+
+					j = start_vidx + (open_spline_ranges[open_spline_index].vertex_total * 3) + (SPLINE_RESOL_CAP - 1);
+
+					/* 2 tris that join the original */
+					*(face++) = midvidx + 0;  /* z 1 */
+					*(face++) = j + 0;        /* z 0 */
+					*(face++) = midvidx + 1;  /* z 0 */
+					*(face++) = TRI_VERT;
+					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
+
+					*(face++) = midvidx + 0;               /* z 1 */
+					*(face++) = midvidx + 2;               /* z 0 */
+					*(face++) = j + SPLINE_RESOL_CAP - 2;  /* z 0 */
+					*(face++) = TRI_VERT;
+					face_index++;
+					FACE_ASSERT(face - 4, sf_vert_tot);
+
 				}
 			}
 




More information about the Bf-blender-cvs mailing list