[Bf-blender-cvs] [72edbc4] soc-2016-uv_tools: WIP packing: concave support for iterative solution search

Phil Gosch noreply at git.blender.org
Sat Aug 20 00:43:11 CEST 2016


Commit: 72edbc46ac2673e3cdcae59997520f0cbd16f2ca
Author: Phil Gosch
Date:   Sat Aug 20 00:42:40 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB72edbc46ac2673e3cdcae59997520f0cbd16f2ca

WIP packing: concave support for iterative solution search

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

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

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

diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 54a1eec..6c5fd26 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -6089,7 +6089,7 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int
 	PHandle *phandle = (PHandle *)handle;
 	PChart* chart;
 	float randf, rot, rand_value, rot_rand, place_rand;
-	int rand_chart, rand_param;
+	int rand_chart, rand_param, i;
 
 	BLI_rng_seed(phandle->rng, seed);
 
@@ -6100,6 +6100,11 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int
 	rand_chart = p_float_to_int_range(randf, phandle->ncharts);
 	chart = phandle->charts[rand_chart];
 	chart->u.ipack.convex_hull->placed = false;
+	if (chart->u.ipack.decomposed) {
+		for (i = 0; i < chart->u.ipack.ntris; i++){
+			chart->u.ipack.tris[i]->placed = false;
+		}
+	}
 
 	/* Set initial scale of charts so finding a better solution is possible */
 
@@ -6120,6 +6125,16 @@ void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int
 		p_convex_hull_update(chart->u.ipack.convex_hull, false);
 		p_convex_hull_compute_horizontal_angles(chart->u.ipack.convex_hull); /* ToDo: Shouldn't be necessary! */
 		p_convex_hull_compute_edge_components(chart->u.ipack.convex_hull);
+		if (chart->u.ipack.decomposed) {
+			for (i = 0; i < chart->u.ipack.ntris; i++){
+				PConvexHull *tri = chart->u.ipack.tris[i];
+				p_convex_hull_update(tri, true);
+				p_convex_hull_grow(tri, margin);
+				p_convex_hull_update(tri, false);
+				p_convex_hull_compute_horizontal_angles(tri); /* ToDo: Shouldn't be necessary! */
+				p_convex_hull_compute_edge_components(tri);
+			}
+		}
 	}
 	else {
 		place_rand = fabsf(remainderf(chart->u.ipack.sa_params[2] + rand_value, 1.0f));
@@ -6540,29 +6555,26 @@ void param_flush_restore(ParamHandle *handle)
 	}
 }
 
-void param_store_packing_solution(ParamHandle *handle)
+void param_accept_placement(ParamHandle *handle, PChart *chart)
 {
 	PHandle *phandle = (PHandle *)handle;
-	PChart *chart;
 	PConvexHull *chull;
 	int i;
 	printf("param_store_packing_solution\n");
 
-	for (i = 0; i < phandle->ncharts; i++) {
-		chart = phandle->charts[i];
-		chull = chart->u.ipack.convex_hull;
-		chart->u.ipack.best_pos->x = chull->h_verts[chull->ref_vert_index]->uv[0];
-		chart->u.ipack.best_pos->y = chull->h_verts[chull->ref_vert_index]->uv[1];
+	chart = phandle->charts[i];
+	chull = chart->u.ipack.convex_hull;
+	chart->u.ipack.best_pos->x = chull->h_verts[chull->ref_vert_index]->uv[0];
+	chart->u.ipack.best_pos->y = chull->h_verts[chull->ref_vert_index]->uv[1];
+
+	//chart->u.ipack.best_scale = chart-> ? 
 
-		//chart->u.ipack.best_scale = chart-> ? 
-	}
 	printf("DONE param_store_packing_solution\n");
 }
 
-void param_restore_packing_solution(ParamHandle *handle)
+void param_restore_placement(ParamHandle *handle, PChart *chart)
 {
 	PHandle *phandle = (PHandle *)handle;
-	PChart *chart;
 	PConvexHull *chull;
 	float trans[2], cur_pos[2];
 	int i;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index b29dd16..28cd394 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -108,8 +108,8 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate);
 void param_irregular_pack_begin(ParamHandle *handle, float *w_area, float margin, int rot_step, bool concave);
 void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int seed, int rot_step, float margin);
 void param_irregular_pack_end(ParamHandle *handle);
-void param_store_packing_solution(ParamHandle *handle);
-void param_restore_packing_solution(ParamHandle *handle);
+void param_accept_placement(ParamHandle *handle);
+void param_restore_placement(ParamHandle *handle);
 
 /* Average area for all charts */
 
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 67a180f..4320d35 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -928,18 +928,18 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i
 
 	/* Find neighboring solution */
 	/*ToDo Saphires: Pass SA parameters */
-	//param_irregular_pack_iter(pi->handle, 
-	//						  &wasted_area, 
-	//						  pi->iter_global, 
-	//						  pi->sa->rot_steps, 
-	//						  pi->margin /* SA */);
+	param_irregular_pack_iter(pi->handle, 
+							  &wasted_area, 
+							  pi->iter_global, 
+							  pi->sa->rot_steps, 
+							  pi->margin /* SA */);
 
 	/* delta Energy */
 	dE = wasted_area - pi->wasted_area_last;
 
 	if (dE < 0) {
 		/* Current solution is new best solution, keep placement */
-		/*param_store_packing_solution(pi->handle);*/
+		/*param_accept_placement(ParamHandle *handle, PChart *chart);*/
 		pi->wasted_area_last = wasted_area;
 	}
 	else {
@@ -949,12 +949,12 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i
 
 		if (r1 < r2) {
 			/* Current solution is new best solution, keep placement */
-			//param_store_packing_solution(pi->handle); 
+			//param_accept_placement(ParamHandle *handle, PChart *chart); 
 			pi->wasted_area_last = wasted_area;
 		}
 		else {
 			/* no better solution found, "frozen state solution" */
-			/* ToDo SaphireS: Revert last solution -> revert placement/scale/rot of last chart */
+			/* ToDo SaphireS: param_restore_placement(ParamHandle *handle, PChart *chart) */
 			
 			pi->iter_local++;
 		}
@@ -1096,7 +1096,7 @@ void UV_OT_irregular_pack_islands(wmOperatorType *ot)
 	ot->poll = ED_operator_uvedit;
 
 	/* properties */
-	RNA_def_boolean(ot->srna, "concave", false, "Use concave boundaries", "Use concave boundaries (slower but better results)");
+	RNA_def_boolean(ot->srna, "concave", true, "Use concave boundaries", "Use concave boundaries (slower but better results)");
 	RNA_def_float(ot->srna, "margin", 0.0f, 0.0f, 1.0f, "Margin", "Border Margin/Padding to apply per UV island", 0.0f, 1.0f);
 	RNA_def_int(ot->srna, "rotation_steps", 4, 0, 360, "Rotation Steps", "Allowed rotations to try during packing. (2=180�, 4=90�, etc.)", 0, 360);
 	RNA_def_int(ot->srna, "iterations", 0, 0, INT_MAX, "Iterations", "Number of iterations to run, 0 is unlimited when run interactively", 0, 10000);




More information about the Bf-blender-cvs mailing list