[Bf-blender-cvs] [7b59b53938] uv_unwrapping_slim_algorithm: UV Unwrapping SLIM adding liveUnwrap with slim

Aurel Gruber noreply at git.blender.org
Wed Mar 15 16:49:11 CET 2017


Commit: 7b59b53938a3c11e62c990a6f319b0db9f323c69
Author: Aurel Gruber
Date:   Wed Mar 15 14:16:13 2017 +0100
Branches: uv_unwrapping_slim_algorithm
https://developer.blender.org/rB7b59b53938a3c11e62c990a6f319b0db9f323c69

UV Unwrapping SLIM adding liveUnwrap with slim

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

M	intern/slim/intern/slim.cpp
M	intern/slim/intern/slim_capi.cpp
M	intern/slim/intern/slim_parametrizer.cpp
M	intern/slim/slim.h
M	intern/slim/slim_capi.h
M	intern/slim/slim_parametrizer.h
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/intern/slim/intern/slim.cpp b/intern/slim/intern/slim.cpp
index 5d2a56760a..f900a157e1 100644
--- a/intern/slim/intern/slim.cpp
+++ b/intern/slim/intern/slim.cpp
@@ -904,6 +904,10 @@ void igl::slim_precompute(Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixX
   data.energy = igl::slim::compute_energy(data,data.V_o) / data.mesh_area;
 }
 
+void igl::recompute_energy(SLIMData &data){
+	data.energy = igl::slim::compute_energy(data, data.V_o);
+}
+
 Eigen::MatrixXd igl::slim_solve(SLIMData &data, int iter_num)
 {
   for (int i = 0; i < iter_num; i++)
@@ -924,5 +928,6 @@ Eigen::MatrixXd igl::slim_solve(SLIMData &data, int iter_num)
                                                  data.energy * data.mesh_area) / data.mesh_area;
 
   }
+
   return data.V_o;
 }
diff --git a/intern/slim/intern/slim_capi.cpp b/intern/slim/intern/slim_capi.cpp
index 7f42879b9b..096a3dfe85 100644
--- a/intern/slim/intern/slim_capi.cpp
+++ b/intern/slim/intern/slim_capi.cpp
@@ -65,6 +65,20 @@ void SLIM_parametrize_single_iteration(void* slim_data_ptr){
 	param_slim_single_iteration(slim_data);
 }
 
+/*	Executes slim iterations during live unwrap. needs to provide new selected-pin positions
+ */
+void SLIM_parametrize_live(void* slim_data_ptr,
+						   int n_pins,
+						   int* pinned_vertex_indices,
+						   double *pinned_vertex_positions_2D){
+
+	SLIMData* slim_data = (SLIMData*) slim_data_ptr;
+	param_slim_live_unwrap(slim_data,
+						   n_pins,
+						   pinned_vertex_indices,
+						   pinned_vertex_positions_2D);
+}
+
 void SLIM_parametrize(SLIMMatrixTransfer *mt, int n_iterations, bool are_border_vertices_pinned, bool skip_initialization){
 	param_slim(mt, n_iterations, are_border_vertices_pinned, skip_initialization);
 }
diff --git a/intern/slim/intern/slim_parametrizer.cpp b/intern/slim/intern/slim_parametrizer.cpp
index 5182b7850e..ecb671e6d9 100644
--- a/intern/slim/intern/slim_parametrizer.cpp
+++ b/intern/slim/intern/slim_parametrizer.cpp
@@ -76,10 +76,32 @@ Eigen::MatrixXd getInteractiveResultBlendedWithOriginal(float blend, SLIMData *s
 	Executes a single iteration of SLIM, must follow a proper setup & initialisation.
  */
 void param_slim_single_iteration(SLIMData *slimData){
-	int numberOfIterations = 1;
+	int numberOfIterations = 5;
 	slim_solve(*slimData, numberOfIterations);
 }
 
+static void adjustPins(SLIMData *slimData, int n_pins, int* selectedPinnedVertexIndices, double *selectedPinnedVertexPositions2D){
+	slimData->b.resize(n_pins);
+	slimData->bc.resize(n_pins, 2);
+	for (int i = 0; i < n_pins; i++){
+		slimData->b(i) = selectedPinnedVertexIndices[i];
+		slimData->bc(i, 0) = selectedPinnedVertexPositions2D[2*i];
+		slimData->bc(i, 1) = selectedPinnedVertexPositions2D[2*i+1];
+	}
+}
+
+/*
+	Executes several iterations of SLIM when used with LiveUnwrap
+ */
+void param_slim_live_unwrap(SLIMData *slimData, int n_pins, int* selectedPinnedVertexIndices, double *selectedPinnedVertexPositions2D) {
+	int numberOfIterations = 5;
+	adjustPins(slimData, n_pins, selectedPinnedVertexIndices, selectedPinnedVertexPositions2D);
+	// recompute current energy
+	recompute_energy(*slimData);
+	slim_solve(*slimData, numberOfIterations);
+}
+
+
 void param_slim(SLIMMatrixTransfer *mt, int nIterations, bool borderVerticesArePinned, bool skipInitialization){
 
 	igl::Timer timer;
diff --git a/intern/slim/slim.h b/intern/slim/slim.h
index 019e292a74..91c3a5a180 100644
--- a/intern/slim/slim.h
+++ b/intern/slim/slim.h
@@ -99,6 +99,9 @@ struct SLIMData
                                 Eigen::MatrixXd& bc,
                                 double soft_p);
 
+// Recompute the current energy if using liveunwrap
+	void recompute_energy(SLIMData &data);
+
 // Run iter_num iterations of SLIM
 // Outputs:
 //    V_o (in SLIMData): #V by dim list of mesh vertex positions
diff --git a/intern/slim/slim_capi.h b/intern/slim/slim_capi.h
index 036a67eae4..5ed10aede9 100644
--- a/intern/slim/slim_capi.h
+++ b/intern/slim/slim_capi.h
@@ -37,6 +37,10 @@ extern "C" {
 void SLIM_parametrize(SLIMMatrixTransfer *mt, int n_iterations, bool are_border_vertices_pinned, bool skip_initialization);
 void SLIM_transfer_uvs_blended(SLIMMatrixTransfer *mt, void *slim, int uv_chart_index, float blend);
 void SLIM_parametrize_single_iteration(void *slim);
+void SLIM_parametrize_live(void* slim_data_ptr,
+						   int n_pins,
+						   int* selected_pinned_vertex_indices,
+						   double *selected_pinned_vertex_positions_2D);
 void* SLIM_setup(SLIMMatrixTransfer *mt, int uv_chart_index, bool are_border_vertices_pinned, bool skip_initialization);
 void SLIM_free_data(void* slim_data_ptr);
 
diff --git a/intern/slim/slim_parametrizer.h b/intern/slim/slim_parametrizer.h
index f5d742d006..3ac6eecbb0 100644
--- a/intern/slim/slim_parametrizer.h
+++ b/intern/slim/slim_parametrizer.h
@@ -47,6 +47,10 @@ SLIMData* setup_slim(SLIMMatrixTransfer *transferredData,
 						 bool skipInitialization);
 void transferUvsBackToNativePart(SLIMMatrixTransfer *mt, Eigen::MatrixXd &UV, int uvChartIndex);
 void param_slim_single_iteration(SLIMData *slimData);
+void param_slim_live_unwrap(SLIMData *slimData,
+							int n_pins,
+							int* selectedPinnedVertexIndices,
+							double *selectedPinnedVertexPositions2D);
 void param_slim(SLIMMatrixTransfer *mt, int n_iterations, bool fixBorder, bool skipInitialization);
 void free_slim_data(SLIMData *slimData);
 #endif // !slim_parametrizer_h
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 6b5fddff5e..8bf30a737a 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -244,7 +244,10 @@ typedef struct PHandle {
 	int n_iterations;
 	bool skip_initialization;
 	float *weight_array;
-	bool is_interactive;
+	bool is_minimize_stretch;
+
+	//for minimize_stretch and live unwrap
+	void* recurringSlim;
 } PHandle;
 
 /* PHash
@@ -4195,7 +4198,7 @@ void param_slim_enrich_handle(ParamHandle *handle,
 							  float *weight_array,
 							  int n_iterations,
 							  bool skip_initialization,
-							  bool is_interactive)
+							  bool is_minimize_stretch)
 {
 
 	PHandle *phandle = (PHandle *)handle;
@@ -4204,7 +4207,7 @@ void param_slim_enrich_handle(ParamHandle *handle,
 	phandle->n_iterations = n_iterations;
 	phandle->skip_initialization = skip_initialization;
 	phandle->weight_array = weight_array;
-	phandle->is_interactive = is_interactive;
+	phandle->is_minimize_stretch = is_minimize_stretch;
 }
 
 
@@ -4339,7 +4342,7 @@ static void transfer_vertices(const int chartNr, const PHandle *phandle, SLIMMat
 		UV[v->slimId] = v->uv[0];
 		UV[r + v->slimId] = v->uv[1];
 
-		if (v->flag & PVERT_PIN || (phandle->is_interactive && !(v->flag & PVERT_SELECT))) {
+		if (v->flag & PVERT_PIN || (phandle->is_minimize_stretch && !(v->flag & PVERT_SELECT))) {
 			mt->pinned_vertices = true;
 			mt->n_pinned_vertices[chartNr] += 1;
 
@@ -4548,7 +4551,6 @@ static void find_bounding_vertices(PVert **minx, PVert **maxx, PVert **miny, PVe
 
 }
 
-
 static double norm(PVert *min, PVert *max)
 {
 	double x = max->uv[0] - min->uv[0];
@@ -4579,6 +4581,81 @@ bool mark_pins(ParamHandle *param_handle)
 	return noPins;
 }
 
+void* getRecurringSlimData(ParamHandle *handle)
+{
+	PHandle *phandle = (PHandle *) handle;
+	return phandle->recurringSlim;
+}
+
+void setRecurringSlimData(ParamHandle *handle, void *rs)
+{
+	PHandle *phandle = (PHandle *) handle;
+	phandle->recurringSlim = rs;
+}
+
+bool get_pinned_vertex_data(ParamHandle *liveHandle,
+							int chartNr,
+							int *n_pins,
+							int *pinned_vertex_indices,
+							double *pinned_vertex_positions_2D)
+{
+
+	PHandle *phandle = (PHandle *) liveHandle;
+	PChart *chart = phandle->charts[chartNr];
+
+	bool pinned_vertex_was_moved = false;
+	int i = 0; // index of selected-and-pinned vertex
+
+	//boundary vertices have lower slimIds, process them first
+	PEdge *outer;
+	p_chart_boundaries(chart, NULL, &outer);
+	PEdge *be = outer;
+	do {
+		if (be->vert->flag & PVERT_PIN) {
+			p_vert_load_pin_select_uvs(liveHandle, be->vert);  /* reload vertex position */
+
+			if (be->vert->flag & PVERT_SELECT){
+				pinned_vertex_was_moved = true;
+			}
+			pinned_vertex_indices[i] = be->vert->slimId;
+			pinned_vertex_positions_2D[2*i] = be->vert->uv[0];
+			pinned_vertex_positions_2D[2*i+1] = be->vert->uv[1];
+
+			++i;
+		}
+		be = p_boundary_edge_next(be);
+	} while (be != outer);
+
+	PVert *v;
+	for (v = chart->verts; v; v = v->nextlink) {
+		if ( !v->on_boundary_flag && (v->flag & PVERT_PIN)) {
+			p_vert_load_pin_select_uvs(liveHandle, v);  /* reload v */
+
+			if (v->flag & PVERT_SELECT){
+				pinned_vertex_was_moved = true;
+			}
+			pinned_vertex_indices[i] = v->slimId;
+			pinned_vertex_positions_2D[2*i] = v->uv[0];
+			pinned_vertex_positions_2D[2*i+1] = v->uv[1];
+			++i;
+		}
+	}
+
+	*n_pins = i;
+	phandle->mt->n_pinned_vertices[chartNr] = i;
+	return pinned_vertex_was_moved;
+}
+
+void backup_current_uvs(ParamHandle *handle)
+{
+	PHandle *phandle = (PHandle *) handle;
+	PFace *f;
+	for (int i = 0; i < phandle->ncharts; i++) {
+		for (f = phandle->charts[i]->faces; f; f = f->nextlink)
+			p_face_backup_uvs(f);
+	}
+}
+
 void param_begin(ParamHandle *handle, ParamBool abf, bool use_slim)
 {
 	if (use_slim) {
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index dcbd6de82d..0871559d85 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -86,7 +86,7 @@ void param_slim_enrich_handle(ParamHandle *handle,
 							  float *weight_array,
 							  int n_iterations,
 							  bool skip_initialization,
-							  bool is_interactive);
+							  bool is_minimize_stretch);
 /* unwrapping:
  * -----------------------------
  * - Either Conformal or SLIM
@@ -148,7 +148,16 @@ void set_uv_param_slim(ParamHandle *handle, SLIMMatrixTransfer *mt);
 void free_slim_matrix_transfer(SLIMMatrixTransfer *mt);
 bool mark_pins(ParamHandle *param_handle);
 bool transformIslands(ParamHandle *handle);
-	
+void* getRecurringSlimData(ParamHandle *handle);
+void setRecurringSlimData(Para

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list