Files
test/intern/slim/slim_matrix_transfer.h

111 lines
3.2 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup intern_slim
*/
#pragma once
#include <memory>
#include <vector>
namespace slim {
struct SLIMData;
using SLIMDataPtr = std::unique_ptr<SLIMData>;
/**
* MatrixTransferChart holds all information and data matrices to be
* transferred from Blender to SLIM.
*/
struct MatrixTransferChart {
int verts_num = 0;
int faces_num = 0;
int pinned_vertices_num = 0;
int boundary_vertices_num = 0;
int edges_num = 0;
/** Field indicating whether a given SLIM operation succeeded or not. */
bool succeeded = false;
/** Vertex positions (matrix [verts_num x 3] in a linearized form). */
std::vector<double> v_matrices;
/** UV positions of vertices (matrix [verts_num x 2] in a linearized form). */
std::vector<double> uv_matrices;
/** Positions of pinned vertices (matrix [pinned_vertices_num x 2] in a linearized form). */
std::vector<double> pp_matrices;
/** Edge lengths. */
std::vector<double> el_vectors;
/** Weights per vertex. */
std::vector<float> w_vectors;
/** Vertex index triplets making up faces (matrix [faces_num x 3] in a linearized form). */
std::vector<int> f_matrices;
/** Indices of pinned vertices. */
std::vector<int> p_matrices;
/** Vertex index tuples making up edges (matrix [edges_num x 2] in a linearized form). */
std::vector<int> e_matrices;
/** Vertex indices of boundary vertices. */
std::vector<int> b_vectors;
SLIMDataPtr data;
MatrixTransferChart();
MatrixTransferChart(MatrixTransferChart &&);
MatrixTransferChart(const MatrixTransferChart &) = delete;
MatrixTransferChart &operator=(const MatrixTransferChart &) = delete;
~MatrixTransferChart();
void try_slim_solve(int iter_num);
/** Executes a single iteration of SLIM, must follow a proper setup & initialization. */
void parametrize_single_iteration();
/**
* Called from the native part during each iteration of interactive parametrization.
* The blend parameter decides the linear blending between the original UV map and the one
* obtained from the accumulated SLIM iterations so far.
*/
void transfer_uvs_blended(float blend);
void free_slim_data();
};
struct PinnedVertexData {
std::vector<int> pinned_vertex_indices;
std::vector<double> pinned_vertex_positions_2D;
std::vector<int> selected_pins;
};
struct MatrixTransfer {
bool fixed_boundary = false;
bool use_weights = false;
double weight_influence = 0.0;
int reflection_mode = 0;
int n_iterations = 0;
bool skip_initialization = false;
bool is_minimize_stretch = false;
std::vector<MatrixTransferChart> charts;
/** Used for pins update in live unwrap. */
PinnedVertexData pinned_vertex_data;
MatrixTransfer();
MatrixTransfer(const MatrixTransfer &) = delete;
MatrixTransfer &operator=(const MatrixTransfer &) = delete;
~MatrixTransfer();
void parametrize();
/** Executes slim iterations during live unwrap. needs to provide new selected-pin positions. */
void parametrize_live(MatrixTransferChart &chart, const PinnedVertexData &pinned_vertex_data);
/** Transfers all the matrices from the native part and initializes SLIM. */
void setup_slim_data(MatrixTransferChart &chart) const;
};
} // namespace slim