[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