[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58179] trunk/blender/source/blender/ blenlib/intern: fix [#36105] Bevel UV Flicker

Campbell Barton ideasman42 at gmail.com
Thu Jul 11 17:57:22 CEST 2013


Revision: 58179
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58179
Author:   campbellbarton
Date:     2013-07-11 15:57:22 +0000 (Thu, 11 Jul 2013)
Log Message:
-----------
fix [#36105] Bevel UV Flicker
interp_weights_poly_v2/3 functions used much too small an epsilon value, caused flickering.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/math_geom.c
    trunk/blender/source/blender/blenlib/intern/math_vector.c

Modified: trunk/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_geom.c	2013-07-11 15:32:26 UTC (rev 58178)
+++ trunk/blender/source/blender/blenlib/intern/math_geom.c	2013-07-11 15:57:22 UTC (rev 58179)
@@ -2599,8 +2599,10 @@
 void interp_weights_poly_v3(float *w, float v[][3], const int n, const float co[3])
 {
 	/* TODO: t1 and t2 overlap each iter, we could call this only once per iter and reuse previous value */
+	const float eps = 0.00001f;  /* take care, low values cause [#36105] */
 	float totweight, t1, t2, len, *vmid, *vprev, *vnext;
 	int i, i_next, i_curr;
+	bool vert_interp = false;
 	bool edge_interp = false;
 
 	totweight = 0.0f;
@@ -2613,9 +2615,15 @@
 		vprev = (i == 0) ? v[n - 1] : v[i - 1];
 		vnext = v[i_next];
 
+		len = len_v3v3(co, vmid);
+
 		/* Mark Mayer et al algorithm that is used here does not operate well if vertex is close
 		 * to borders of face. In that case, do simple linear interpolation between the two edge vertices */
-		if (dist_to_line_segment_v3(co, vmid, vnext) < 10 * FLT_EPSILON) {
+		if (len < eps) {
+			vert_interp = true;
+			break;
+		}
+		else if (dist_to_line_segment_v3(co, vmid, vnext) < eps) {
 			edge_interp = true;
 			break;
 		}
@@ -2623,12 +2631,16 @@
 		t1 = mean_value_half_tan_v3(co, vprev, vmid);
 		t2 = mean_value_half_tan_v3(co, vmid, vnext);
 
-		len = len_v3v3(co, vmid);
-		w[i] = (len != 0.0f) ? (t1 + t2) / len: 0.0f;
+		w[i] = (t1 + t2) / len;
 		totweight += w[i];
 	}
 
-	if (edge_interp) {
+	if (vert_interp) {
+		for (i = 0; i < n; i++)
+			w[i] = 0.0;
+		w[i_curr] = 1.0f;
+	}
+	else if (edge_interp) {
 		float len_curr = len_v3v3(co, vmid);
 		float len_next = len_v3v3(co, vnext);
 		float edge_len = len_curr + len_next;
@@ -2651,8 +2663,10 @@
 void interp_weights_poly_v2(float *w, float v[][2], const int n, const float co[2])
 {
 	/* TODO: t1 and t2 overlap each iter, we could call this only once per iter and reuse previous value */
+	const float eps = 0.00001f;  /* take care, low values cause [#36105] */
 	float totweight, t1, t2, len, *vmid, *vprev, *vnext;
 	int i, i_next, i_curr;
+	bool vert_interp = false;
 	bool edge_interp = false;
 
 	totweight = 0.0f;
@@ -2665,9 +2679,15 @@
 		vprev = (i == 0) ? v[n - 1] : v[i - 1];
 		vnext = v[i_next];
 
+		len = len_v2v2(co, vmid);
+
 		/* Mark Mayer et al algorithm that is used here does not operate well if vertex is close
 		 * to borders of face. In that case, do simple linear interpolation between the two edge vertices */
-		if (dist_to_line_segment_v2(co, vmid, vnext) < 10 * FLT_EPSILON) {
+		if (len < eps) {
+			vert_interp = true;
+			break;
+		}
+		else if (dist_to_line_segment_v2(co, vmid, vnext) < eps) {
 			edge_interp = true;
 			break;
 		}
@@ -2675,12 +2695,16 @@
 		t1 = mean_value_half_tan_v2(co, vprev, vmid);
 		t2 = mean_value_half_tan_v2(co, vmid, vnext);
 
-		len = len_v2v2(co, vmid);
-		w[i] = (len != 0.0f) ? (t1 + t2) / len: 0.0f;
+		w[i] = (t1 + t2) / len;
 		totweight += w[i];
 	}
 
-	if (edge_interp) {
+	if (vert_interp) {
+		for (i = 0; i < n; i++)
+			w[i] = 0.0;
+		w[i_curr] = 1.0f;
+	}
+	else if (edge_interp) {
 		float len_curr = len_v2v2(co, vmid);
 		float len_next = len_v2v2(co, vnext);
 		float edge_len = len_curr + len_next;

Modified: trunk/blender/source/blender/blenlib/intern/math_vector.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector.c	2013-07-11 15:32:26 UTC (rev 58178)
+++ trunk/blender/source/blender/blenlib/intern/math_vector.c	2013-07-11 15:57:22 UTC (rev 58179)
@@ -546,8 +546,8 @@
 {
 	int i = 0;
 	printf("%s[%d]:", str, n);
-	while (i++ < n) {
-		printf(" %.3f", v[i]);
+	while (i < n) {
+		printf(" %.3f", v[i++]);
 	}
 	printf("\n");
 }




More information about the Bf-blender-cvs mailing list