[Bf-blender-cvs] [c0b420b] soc-2016-uv_tools: Prevent infinite loops and make "scale around origin" it's own function

Phil Gosch noreply at git.blender.org
Mon Jul 11 12:06:50 CEST 2016


Commit: c0b420beb827b86665958b64d29977bfe83fa248
Author: Phil Gosch
Date:   Mon Jul 11 12:06:36 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rBc0b420beb827b86665958b64d29977bfe83fa248

Prevent infinite loops and make "scale around origin" it's own function

===================================================================

M	source/blender/editors/uvedit/uvedit_parametrizer.c

===================================================================

diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 03e4435..275dee9 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -563,6 +563,25 @@ static void p_chart_uv_to_array(PChart *chart, float (*points)[2])
 	}
 }
 
+static void p_chart_uv_scale_origin(PChart *chart, float scale)
+{
+	float minv[2], maxv[2], trans[2];
+
+	/* Get the island center */
+	p_chart_uv_bbox(chart, minv, maxv);
+	trans[0] = (minv[0] + maxv[0]) / -2.0f;
+	trans[1] = (minv[1] + maxv[1]) / -2.0f;
+
+	/* Move center to 0,0 */
+	p_chart_uv_translate(chart, trans);
+	p_chart_uv_scale(chart, scale);
+
+	/* Move to original center */
+	trans[0] = -trans[0];
+	trans[1] = -trans[1];
+	p_chart_uv_translate(chart, trans);
+}
+
 static void UNUSED_FUNCTION(p_chart_uv_from_array)(PChart *chart, float (*points)[2])
 {
 	PVert *v;
@@ -5162,7 +5181,7 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart *item)
 	PConvexHull *ch_item = item->u.ipack.convex_hull;
 	PChart *fixed;
 	float end_pos[2], randf1, randf2;
-	int i, j;
+	int i, j, cur_iter = 0, max_iter = 100;
 	unsigned int rand1, rand2;
 	bool found = false, init = true;
 
@@ -5201,6 +5220,7 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart *item)
 	}
 	else {
 		while (!found) {
+			cur_iter++;
 			randf1 = BLI_rng_get_float(phandle->rng);
 			printf("randf1 choosen as: %f\n", randf1);
 			rand1 = (int)(randf1 * (float)phandle->ncharts);
@@ -5219,6 +5239,10 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart *item)
 					found = p_temp_cfr_check(nfps, ifp, end_pos, phandle->ncharts, rand1);
 				}
 			}
+
+			if (cur_iter >= max_iter) {
+				return false;
+			}
 		}
 	}
 	
@@ -5254,7 +5278,7 @@ float p_scale_binary_search(PHandle *phandle, PChart *chart, float val, float mi
 	float val1, min1, max1;
 
 	if (depth--) {
-		p_chart_uv_scale(chart, val);
+		p_chart_uv_scale_origin(chart, val);
 
 		if (!(p_chart_pack_individual(phandle, chart))) {
 			/*scale down */
@@ -5280,7 +5304,7 @@ float p_scale_binary_search(PHandle *phandle, PChart *chart, float val, float mi
 
 float p_binary_depth_search(PHandle *phandle, PChart *chart, int depth)
 {
-	float scale = 0.5f, min = 0.0f, max = 1.0f;
+	float scale = 0.5f, min = 0.1f, max = 1.0f;
 
 	return p_scale_binary_search(phandle, chart, scale, min, max, depth);
 }
@@ -5303,12 +5327,12 @@ bool p_compute_packing_solution(PHandle *phandle /* ToDo SaphireS: Simulated Ann
 		printf("p_compute_packing_solution: chart[%i] with area %f:\n", i, chart->u.ipack.area);
 
 		if (!(chart->u.ipack.convex_hull->placed)) {
-			while (!p_chart_pack_individual(phandle, chart)){
+			if (!p_chart_pack_individual(phandle, chart)) {
 				/* binary depth search for scaling down the current chart */
 				scale = p_binary_depth_search(phandle, chart, depth);
 
 				/* scale chart */
-				p_chart_uv_scale(chart, scale);
+				p_chart_uv_scale_origin(chart, scale);
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list