/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ /** \file * \ingroup intern_slim */ #pragma once #include #include namespace slim { struct SLIMData; typedef std::unique_ptr SLIMDataPtr; /** * 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 v_matrices; /** UV positions of vertices (matrix [verts_num x 2] in a linearized form). */ std::vector uv_matrices; /** Positions of pinned vertices (matrix [pinned_vertices_num x 2] in a linearized form). */ std::vector pp_matrices; /** Edge lengths. */ std::vector el_vectors; /** Weights per vertex. */ std::vector w_vectors; /** Vertex index triplets making up faces (matrix [faces_num x 3] in a linearized form). */ std::vector f_matrices; /** Indices of pinned vertices. */ std::vector p_matrices; /** Vertex index tuples making up edges (matrix [edges_num x 2] in a linearized form). */ std::vector e_matrices; /** Vertex indices of boundary vertices. */ std::vector 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 pinned_vertex_indices; std::vector pinned_vertex_positions_2D; std::vector 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 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