[Bf-blender-cvs] [3cae116704f] uv_unwrapping_slim_algorithm: SLIM: In live Unwrap mode unpinned vertices can now be moved. Also, a single pin also invokes SLIM. That also avoids crashing minimize_stretch when invoked on chart with one pin.

Aurel Gruber noreply at git.blender.org
Thu Apr 13 16:33:56 CEST 2017


Commit: 3cae116704f35dc7b73480057761538a6a612ea6
Author: Aurel Gruber
Date:   Thu Apr 13 16:22:49 2017 +0200
Branches: uv_unwrapping_slim_algorithm
https://developer.blender.org/rB3cae116704f35dc7b73480057761538a6a612ea6

SLIM: In live Unwrap mode unpinned vertices can now be moved. Also, a single pin also invokes SLIM. That also avoids crashing minimize_stretch when invoked on chart with one pin.

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

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 66bc0e8f8c3..8d599a3a1e4 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -4821,7 +4821,7 @@ static void slim_get_pinned_vertex_data(ParamHandle *liveHandle,
 				selected_pins[*n_selected_pins] = be->vert->slim_id;
 				++(*n_selected_pins);
 			}
-			
+
 			pinned_vertex_indices[i] = be->vert->slim_id;
 			pinned_vertex_positions_2D[2*i] = be->vert->uv[0];
 			pinned_vertex_positions_2D[2*i+1] = be->vert->uv[1];
@@ -4851,6 +4851,21 @@ static void slim_get_pinned_vertex_data(ParamHandle *liveHandle,
 	phandle->slim_mt->n_pinned_vertices[chartNr] = i;
 }
 
+void slim_reload_all_uvs(ParamHandle *liveHandle)
+{
+
+	PHandle *phandle = (PHandle *) liveHandle;
+
+	PVert *v;
+	for (int i = 0; i < phandle->ncharts; i++) {
+		PChart *chart = phandle->charts[i];
+
+		for (v = chart->verts; v; v = v->nextlink) {
+			p_vert_load_pin_select_uvs(liveHandle, v);  /* reload v */
+		}
+	}
+}
+
 void param_slim_solve(ParamHandle *handle, SLIMMatrixTransfer *mt)
 {
 	PHandle *phandle = (PHandle *) handle;
@@ -4896,7 +4911,7 @@ void param_slim_begin(ParamHandle *handle, SLIMMatrixTransfer *mt)
 				deselect = P_TRUE;
 		}
 
-		if ((!mt->is_minimize_stretch && (!select || !deselect)) || (npins == 1)) {
+		if ((!mt->is_minimize_stretch && (!select || !deselect)) || (npins == 0)) {
 			/* nothing to unwrap */
 			chart->u.slim.ptr = NULL;
 			chart->flag |= PCHART_NOFLUSH;
@@ -4936,25 +4951,25 @@ void param_slim_solve_iteration(ParamHandle *handle)
 			continue;
 
 		int *pinned_vertex_indices =
-			MEM_callocN(sizeof(*pinned_vertex_indices) * mt->n_verts[i],
-						"indices of pinned verts");
+		MEM_callocN(sizeof(*pinned_vertex_indices) * mt->n_verts[i],
+					"indices of pinned verts");
 		double *pinned_vertex_positions_2D =
-			MEM_callocN(sizeof(*pinned_vertex_positions_2D) * 2 * mt->n_verts[i],
-						"positions of pinned verts: [u1, v1, u2, v2, ..., un, vn]");
+		MEM_callocN(sizeof(*pinned_vertex_positions_2D) * 2 * mt->n_verts[i],
+					"positions of pinned verts: [u1, v1, u2, v2, ..., un, vn]");
 		int *selected_pins =
-			MEM_callocN(sizeof(*pinned_vertex_indices) * mt->n_verts[i],
-			            "indices of pinned & selected verts");
+		MEM_callocN(sizeof(*pinned_vertex_indices) * mt->n_verts[i],
+					"indices of pinned & selected verts");
 
 		int n_pins = 0;
 		int n_selected_pins = 0;
 
 		slim_get_pinned_vertex_data(handle,
-		                            i,
-		                            &n_pins,
-		                            pinned_vertex_indices,
-		                            pinned_vertex_positions_2D,
-		                            &n_selected_pins,
-		                            selected_pins);
+									i,
+									&n_pins,
+									pinned_vertex_indices,
+									pinned_vertex_positions_2D,
+									&n_selected_pins,
+									selected_pins);
 
 		SLIM_parametrize_live(chart->u.slim.ptr,
 							  n_pins,
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 0d41b3b2d9d..45b8f5733f1 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -80,7 +80,7 @@ void param_delete(ParamHandle *chart);
  * - solve: compute cheap initialization (if necessary) and refine iteratively
  * - end: clean up
 */
-
+void slim_reload_all_uvs(ParamHandle *handle);
 void param_slim_solve(ParamHandle *handle, SLIMMatrixTransfer *mt);
 
 void param_slim_begin(ParamHandle *handle, SLIMMatrixTransfer *mt);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index b9d0eed6d4a..08f1b00a3d7 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -898,6 +898,7 @@ void ED_uvedit_live_unwrap_re_solve(void)
 {
 	if (liveHandle) {
 		if (param_is_slim(liveHandle)) {
+			slim_reload_all_uvs(liveHandle);
 			param_slim_solve_iteration(liveHandle);
 		}
 		else {




More information about the Bf-blender-cvs mailing list