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:
authorCampbell Barton <ideasman42@gmail.com>2012-07-18 00:01:01 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-07-18 00:01:01 +0400
commitb6a9ffffedb9204edcaa4081f4ab8fb2b722ef9f (patch)
treec9048984b2f8fe58210f7a078f86e3b5d80d220e /source/blender/blenkernel/intern/mask_rasterize.c
parent382ded688a31065b456ee213dc8756be6225b732 (diff)
wip mask capping - works but needs aspect correction and to be faded out.
Diffstat (limited to 'source/blender/blenkernel/intern/mask_rasterize.c')
-rw-r--r--source/blender/blenkernel/intern/mask_rasterize.c152
1 files changed, 142 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c
index 69bc092a613..4de39816e2d 100644
--- a/source/blender/blenkernel/intern/mask_rasterize.c
+++ b/source/blender/blenkernel/intern/mask_rasterize.c
@@ -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,6 +57,34 @@
#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,10 +718,41 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
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 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
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 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
*(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 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
*(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 @@ void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
*(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);
+
}
}