[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49009] trunk/blender/source/blender/ blenkernel/intern/mask_rasterize.c: mask rasterizer unfilled line end capping now works with aspect and blending .

Campbell Barton ideasman42 at gmail.com
Tue Jul 17 22:40:12 CEST 2012


Revision: 49009
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49009
Author:   campbellbarton
Date:     2012-07-17 20:40:12 +0000 (Tue, 17 Jul 2012)
Log Message:
-----------
mask rasterizer unfilled line end capping now works with aspect and blending.

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 20:01:01 UTC (rev 49008)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-17 20:40:12 UTC (rev 49009)
@@ -47,7 +47,7 @@
 
 #ifndef USE_RASKTER
 
-#define SPLINE_RESOL_CAP 4
+#define SPLINE_RESOL_CAP 32
 #define SPLINE_RESOL 32
 #define BUCKET_PIXELS_PER_CELL 8
 
@@ -67,23 +67,26 @@
 	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])
+void rotate_point(const float cent[2], const float angle, float p[2], const float asp[2])
 {
-  const float s = sinf(angle);
-  const float c = cosf(angle);
-  float p_new[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];
+	/* 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;
+	p[0] /= asp[0];
+	p[1] /= asp[1];
 
-  /* translate point back */
-  p[0] = p_new[0] + cent[0];
-  p[1] = p_new[1] + cent[1];
+	/* rotate point */
+	p_new[0] = ((p[0] * c) - (p[1] * s)) * asp[0];
+	p_new[1] = ((p[0] * s) + (p[1] * c)) * asp[1];
+
+	/* translate point back */
+	p[0] = p_new[0] + cent[0];
+	p[1] = p_new[1] + cent[1];
 }
 
 /* --------------------------------------------------------------------- */
@@ -720,13 +723,25 @@
 
 						/*cap ends */
 						if (!is_cyclic) {
-
 							unsigned int k;
 
+							float asp[2] = {1.0f, 1.0f};
+
+							if (do_aspect_correct) {
+								if (width != height) {
+									if (width < height) {
+										asp[1] = (float)width / (float)height;
+									}
+									else {
+										asp[0] = (float)height / (float)width;
+									}
+								}
+							}
+
 							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);
+								rotate_point(diff_points[0], angle, co_feather, asp);
 
 								sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
 								sf_vert->tmp.u = sf_vert_tot;
@@ -739,7 +754,7 @@
 							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);
+								rotate_point(diff_points[tot_diff_point - 1], -angle, co_feather, asp);
 
 								sf_vert = BLI_scanfill_vert_add(&sf_ctx, co_feather);
 								sf_vert->tmp.u = sf_vert_tot;
@@ -879,7 +894,6 @@
 				}
 				else {
 					unsigned int midvidx = start_vidx;
-					// unsigned int repvidx;  /* repeat vertex index, ugh */
 
 					/***************
 					 * cap end 'a' */
@@ -887,9 +901,9 @@
 
 					for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
 						*(face++) = midvidx + 0;  /* z 1 */
+						*(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);
 					}
@@ -898,16 +912,16 @@
 
 					/* 2 tris that join the original */
 					*(face++) = midvidx + 0;  /* z 1 */
+					*(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++) = 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);
 
@@ -922,9 +936,9 @@
 
 					for (k = 0; k < SPLINE_RESOL_CAP - 2; k++, j++) {
 						*(face++) = midvidx;  /* z 1 */
+						*(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);
 					}
@@ -933,16 +947,16 @@
 
 					/* 2 tris that join the original */
 					*(face++) = midvidx + 0;  /* z 1 */
+					*(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 + 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