27 : number_of_vertices(chart.verts_num),
28 number_of_faces(chart.faces_num),
30 number_of_edges_twice(chart.edges_num + chart.boundary_vertices_num),
31 number_of_boundary_vertices(chart.boundary_vertices_num),
32 number_of_pinned_vertices(chart.pinned_vertices_num),
33 use_weights(mt.use_weights),
34 weight_influence(mt.weight_influence),
35 vertex_positions3d(chart.v_matrices.data(), number_of_vertices, columns_3),
36 uv_positions2d(chart.uv_matrices.data(), number_of_vertices, columns_2),
37 positions_of_pinned_vertices2d(),
38 positions_of_explicitly_pinned_vertices2d(
39 number_of_pinned_vertices != 0 ? chart.pp_matrices.data() : nullptr,
40 number_of_pinned_vertices,
42 faces_by_vertexindices(chart.f_matrices.data(), number_of_faces, columns_3),
43 edges_by_vertexindices(chart.e_matrices.data(), number_of_edges_twice, columns_2),
44 pinned_vertex_indices(),
45 explicitly_pinned_vertex_indices(number_of_pinned_vertices != 0 ? chart.p_matrices.data() :
47 number_of_pinned_vertices),
48 edge_lengths(chart.el_vectors.data(), number_of_edges_twice),
49 boundary_vertex_indices(chart.b_vectors.data(), number_of_boundary_vertices),
50 weights_per_vertex(chart.w_vectors.data(), number_of_vertices)
57 if (!slim_data.
valid) {
72 for (
int fid = 0; fid < slim_data.
F.rows(); fid++) {
73 Eigen::RowVector3i row = slim_data.
F.row(fid);
74 float w1, w2, w3, mean, weight_factor, flipped_mean;
78 mean = (w1 + w2 + w3) / 3;
79 flipped_mean = 1 - mean;
81 weight_factor = std::pow(max_factor, weight_influence_sign * 2 * (flipped_mean - 0.5));
86void GeometryData::set_geometry_data_matrices(SLIMData &slim_data)
const
88 if (!slim_data.valid) {
102bool GeometryData::has_valid_preinitialized_map()
const
107 bool no_flips_present = (number_of_flips == 0);
108 return (no_flips_present);
117bool GeometryData::can_initialization_be_skipped(
bool skip_initialization)
const
119 return (skip_initialization && has_valid_preinitialized_map());
123 bool skip_initialization,
124 int reflection_mode)
const
132 set_geometry_data_matrices(slim_data);
134 double penalty_for_violating_pinned_positions = 10.0e100;
135 slim_data.
soft_const_p = penalty_for_violating_pinned_positions;
138 initialize_if_needed(slim_data);
153void GeometryData::combine_matrices_of_pinned_and_boundary_vertices()
170 int vertex_index = it.value();
171 if (vertex_index > highest_vertex_index) {
178 int actual_number_of_pinned_vertices = index;
189 if (border_vertices_are_pinned) {
190 combine_matrices_of_pinned_and_boundary_vertices();
198void GeometryData::initialize_if_needed(
SLIMData &slim_data)
const
203 initialize_uvs(slim_data);
207void GeometryData::initialize_uvs(SLIMData &slim_data)
const
212 bool all_vertices_on_boundary = (slim_data.V_o.rows() == uv_positions_of_boundary.rows());
213 if (all_vertices_on_boundary) {
214 slim_data.V_o = uv_positions_of_boundary;
223 uv_positions_of_boundary,
void edge_lengths(const Eigen::PlainObjectBase< DerivedV > &V, const Eigen::PlainObjectBase< DerivedF > &F, Eigen::PlainObjectBase< DerivedL > &L)
void map_vertices_to_convex_border(Eigen::MatrixXd &vertex_positions)
void slim_precompute(Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXd &V_init, SLIMData &data, SLIMData::SLIM_ENERGY slim_energy, Eigen::VectorXi &b, Eigen::MatrixXd &bc, double soft_p)
int count_flips(const Eigen::MatrixXi &f, const Eigen::MatrixXd &uv)
void transform_initialization_if_necessary(SLIMData &slim_data)
void mvc(const Eigen::MatrixXi &f, const Eigen::MatrixXd &v, const Eigen::MatrixXi &e, const Eigen::VectorXd &el, const Eigen::VectorXi &bnd, const Eigen::MatrixXd &bnd_uv, Eigen::MatrixXd &uv)
static void create_weights_per_face(SLIMData &slim_data)
void correct_mesh_surface_area_if_necessary(SLIMData &slim_data)
void construct_slim_data(SLIMData &slim_data, bool skip_initialization, int reflection_mode) const
Map< VectorXd > edge_lengths
int number_of_pinned_vertices
MatrixXd positions_of_pinned_vertices2d
Map< VectorXi > explicitly_pinned_vertex_indices
VectorXi pinned_vertex_indices
Map< MatrixXi > edges_by_vertexindices
Map< MatrixXd > uv_positions2d
Map< VectorXi > boundary_vertex_indices
Map< MatrixXd > vertex_positions3d
void retrieve_pinned_vertices(bool border_vertices_are_pinned)
GeometryData(const MatrixTransfer &mt, MatrixTransferChart &chart)
Map< MatrixXi > faces_by_vertexindices
int number_of_boundary_vertices
Map< VectorXf > weights_per_vertex
Map< Matrix< double, Dynamic, Dynamic, RowMajor > > positions_of_explicitly_pinned_vertices2d
bool withWeightedParameterization
Eigen::VectorXf weightPerFaceMap
Eigen::VectorXf weightmap