Skip to content

Commit cb947ed

Browse files
committed
Add optimizer parameter, controls, etc for geodesic remeshing option
1 parent dd12ef3 commit cb947ed

File tree

11 files changed

+376
-326
lines changed

11 files changed

+376
-326
lines changed

Libs/Optimize/Domain/MeshDomain.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,19 @@ bool MeshDomain::IsWithinDistance(const PointType &a, int idx_a, const PointType
8080
}
8181

8282
//-------------------------------------------------------------------
83-
void MeshDomain::SetMesh(std::shared_ptr<MeshWrapper> mesh_) {
83+
void MeshDomain::SetMesh(std::shared_ptr<MeshWrapper> mesh, double geodesic_remesh_percent) {
8484
m_FixedDomain = false;
85-
mesh_wrapper_ = mesh_;
85+
mesh_wrapper_ = mesh;
8686
sw_mesh_ = std::make_shared<Mesh>(mesh_wrapper_->GetPolydata());
8787

88-
auto poly_data = mesh_wrapper_->GetPolydata();
89-
Mesh mesh_copy(poly_data);
90-
mesh_copy.remeshPercent(50, 1.0);
91-
92-
geodesics_mesh_ = std::make_shared<MeshWrapper>(mesh_copy.getVTKMesh());
88+
if (geodesic_remesh_percent >= 100.0) { // no remeshing
89+
geodesics_mesh_ = mesh_wrapper_;
90+
} else {
91+
auto poly_data = mesh_wrapper_->GetPolydata();
92+
Mesh mesh_copy(poly_data);
93+
mesh_copy.remeshPercent(geodesic_remesh_percent, 1.0);
94+
geodesics_mesh_ = std::make_shared<MeshWrapper>(mesh_copy.getVTKMesh());
95+
}
9396
}
9497

9598
//-------------------------------------------------------------------

Libs/Optimize/Domain/MeshDomain.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class MeshDomain : public ParticleDomain {
7373
// TODO Change this to a generic delete function
7474
}
7575

76-
void SetMesh(std::shared_ptr<MeshWrapper> mesh_);
76+
void SetMesh(std::shared_ptr<MeshWrapper> mesh_, double geodesic_remesh_percent);
7777

7878
std::shared_ptr<Mesh> GetSWMesh() const { return sw_mesh_; }
7979

Libs/Optimize/Optimize.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1876,9 +1876,11 @@ void Optimize::AddMesh(vtkSmartPointer<vtkPolyData> poly_data) {
18761876
// fixed domain
18771877
m_sampler->AddMesh(nullptr);
18781878
} else {
1879+
double geodesic_remesh_percent = m_geodesics_enabled ? m_geodesic_remesh_percent : 100;
1880+
18791881
const auto mesh =
18801882
std::make_shared<shapeworks::MeshWrapper>(poly_data, m_geodesics_enabled, m_geodesic_cache_size_multiplier);
1881-
m_sampler->AddMesh(mesh);
1883+
m_sampler->AddMesh(mesh, geodesic_remesh_percent);
18821884
}
18831885
this->m_num_shapes++;
18841886
this->m_spacing = 0.5;
@@ -2087,6 +2089,9 @@ void Optimize::SetGeodesicsEnabled(bool is_enabled) { this->m_geodesics_enabled
20872089
//---------------------------------------------------------------------------
20882090
void Optimize::SetGeodesicsCacheSizeMultiplier(size_t n) { this->m_geodesic_cache_size_multiplier = n; }
20892091

2092+
//---------------------------------------------------------------------------
2093+
void Optimize::SetGeodesicsRemeshPercent(double percent) { m_geodesic_remesh_percent = percent; }
2094+
20902095
//---------------------------------------------------------------------------
20912096
vnl_vector_fixed<double, 3> Optimize::TransformPoint(int domain, vnl_vector_fixed<double, 3> input) {
20922097
// If initial transform provided, transform cutting plane points

Libs/Optimize/Optimize.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ class Optimize {
288288
//! n * number_of_triangles
289289
void SetGeodesicsCacheSizeMultiplier(size_t n);
290290

291+
//! Set the remeshing percent for the mesh used for computing geodesics (0-100)
292+
void SetGeodesicsRemeshPercent(double percent);
293+
291294
OptimizationVisualizer& GetVisualizer();
292295
void SetShowVisualizer(bool show);
293296
bool GetShowVisualizer();
@@ -420,6 +423,7 @@ class Optimize {
420423
std::string m_python_filename;
421424
bool m_geodesics_enabled = false; // geodesics disabled by default
422425
size_t m_geodesic_cache_size_multiplier = 0; // 0 => MeshWrapper will use a heuristic to determine cache size
426+
double m_geodesic_remesh_percent = 100.0; // 100% by default (e.g. no remeshing)
423427

424428
// m_spacing is used to scale the random update vector for particle splitting.
425429
double m_spacing = 0;

Libs/Optimize/OptimizeParameters.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const std::string field_attribute_weights = "field_attribute_weights";
5050
const std::string use_geodesics_to_landmarks = "use_geodesics_to_landmarks";
5151
const std::string geodesics_to_landmarks_weight = "geodesics_to_landmarks_weight";
5252
const std::string particle_format = "particle_format";
53+
const std::string geodesic_remesh_percent = "geodesic_remesh_percent";
5354
} // namespace Keys
5455

5556
//---------------------------------------------------------------------------
@@ -90,7 +91,8 @@ OptimizeParameters::OptimizeParameters(ProjectHandle project) {
9091
Keys::geodesics_to_landmarks_weight,
9192
Keys::keep_checkpoints,
9293
Keys::use_disentangled_ssm,
93-
Keys::particle_format};
94+
Keys::particle_format,
95+
Keys::geodesic_remesh_percent};
9496

9597
// check if params_ has any unknown keys
9698
for (auto& param : params_.get_map()) {
@@ -412,6 +414,7 @@ bool OptimizeParameters::set_up_optimize(Optimize* optimize) {
412414
optimize->SetOptimizationIterations(get_optimization_iterations());
413415
optimize->SetGeodesicsEnabled(get_use_geodesic_distance());
414416
optimize->SetGeodesicsCacheSizeMultiplier(get_geodesic_cache_multiplier());
417+
optimize->SetGeodesicsRemeshPercent(get_geodesic_remesh_percent());
415418
optimize->SetNarrowBand(get_narrow_band());
416419
optimize->SetOutputDir(get_output_prefix());
417420
optimize->SetMeshFFCMode(get_mesh_ffc_mode());
@@ -802,3 +805,11 @@ std::string OptimizeParameters::get_particle_format() { return params_.get(Keys:
802805

803806
//---------------------------------------------------------------------------
804807
void OptimizeParameters::set_particle_format(std::string format) { params_.set(Keys::particle_format, format); }
808+
809+
//---------------------------------------------------------------------------
810+
double OptimizeParameters::get_geodesic_remesh_percent() { return params_.get(Keys::geodesic_remesh_percent, 100); }
811+
812+
//---------------------------------------------------------------------------
813+
void OptimizeParameters::set_geodesic_remesh_percent(double value) {
814+
params_.set(Keys::geodesic_remesh_percent, value);
815+
}

Libs/Optimize/OptimizeParameters.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ class OptimizeParameters {
129129
std::string get_particle_format();
130130
void set_particle_format(std::string format);
131131

132+
double get_geodesic_remesh_percent();
133+
void set_geodesic_remesh_percent(double value);
134+
132135

133136
private:
134137
std::string get_output_prefix();

Libs/Optimize/Sampler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,12 +282,12 @@ void Sampler::ReInitialize() {
282282
this->m_MeanCurvatureCache->ZeroAllValues();
283283
}
284284

285-
void Sampler::AddMesh(std::shared_ptr<shapeworks::MeshWrapper> mesh) {
285+
void Sampler::AddMesh(std::shared_ptr<shapeworks::MeshWrapper> mesh, double geodesic_remesh_percent) {
286286
auto domain = std::make_shared<MeshDomain>();
287287
m_NeighborhoodList.push_back(ParticleSurfaceNeighborhood::New());
288288
if (mesh) {
289289
this->m_Spacing = 1;
290-
domain->SetMesh(mesh);
290+
domain->SetMesh(mesh, geodesic_remesh_percent);
291291
this->m_meshes.push_back(mesh->GetPolydata());
292292
m_NeighborhoodList.back()->SetWeightingEnabled(!mesh->IsGeodesicsEnabled()); // disable weighting for geodesics
293293
}

Libs/Optimize/Sampler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class Sampler {
101101
}
102102
}
103103

104-
void AddMesh(std::shared_ptr<shapeworks::MeshWrapper> mesh);
104+
void AddMesh(std::shared_ptr<shapeworks::MeshWrapper> mesh, double geodesic_remesh_percent = 100);
105105

106106
void AddContour(vtkSmartPointer<vtkPolyData> poly_data);
107107

Studio/Interface/ShapeWorksStudioApp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,8 +1740,6 @@ void ShapeWorksStudioApp::action_export_screenshot_triggered() {
17401740

17411741
//---------------------------------------------------------------------------
17421742
void ShapeWorksStudioApp::closeEvent(QCloseEvent* event) {
1743-
// close error dialog in case it is open
1744-
error_message_dialog_.close();
17451743
// close the preferences window in case it is open
17461744
preferences_window_->close();
17471745
if (preferences_.not_saved() && ui_->action_save_project->isEnabled()) {
@@ -1769,6 +1767,8 @@ void ShapeWorksStudioApp::closeEvent(QCloseEvent* event) {
17691767
optimize_tool_->shutdown_threads();
17701768
deepssm_tool_->shutdown();
17711769
SW_CLOSE_LOG();
1770+
1771+
QCoreApplication::quit();
17721772
}
17731773

17741774
//---------------------------------------------------------------------------

Studio/Optimize/OptimizeTool.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ OptimizeTool::OptimizeTool(Preferences& prefs, Telemetry& telemetry) : preferenc
3333
connect(ui_->use_normals, &QCheckBox::toggled, this, &OptimizeTool::update_ui_elements);
3434
connect(ui_->procrustes, &QCheckBox::toggled, this, &OptimizeTool::update_ui_elements);
3535
connect(ui_->multiscale, &QCheckBox::toggled, this, &OptimizeTool::update_ui_elements);
36+
connect(ui_->use_geodesics_from_landmarks, &QCheckBox::toggled, this, &OptimizeTool::update_ui_elements);
37+
connect(ui_->use_geodesic_distance, &QCheckBox::toggled, this, &OptimizeTool::update_ui_elements);
3638

3739
ui_->number_of_particles->setToolTip("Number of correspondence points to generate");
3840
ui_->initial_relative_weighting->setToolTip("Relative weighting of correspondence term during initialization");
@@ -44,6 +46,7 @@ OptimizeTool::OptimizeTool(Preferences& prefs, Telemetry& telemetry) : preferenc
4446
ui_->use_geodesic_distance->setToolTip(
4547
"Use geodesic distances for sampling term: may be more effective for capturing thin features. "
4648
"Requires ~10x more time, and larger memory footprint. Only supported for mesh inputs");
49+
ui_->geodesic_remesh_percent->setToolTip("Percent remesh reduction to use for geodesic distance");
4750
ui_->use_normals->setToolTip("Use surface normals as part of optimization");
4851
ui_->normals_strength->setToolTip("Strength of surface normals relative to position");
4952
ui_->procrustes->setToolTip("Use procrustes registration during optimization");
@@ -257,6 +260,7 @@ void OptimizeTool::load_params() {
257260
ui_->optimization_iterations->setText(QString::number(params.get_optimization_iterations()));
258261

259262
ui_->use_geodesic_distance->setChecked(params.get_use_geodesic_distance());
263+
ui_->geodesic_remesh_percent->setText(QString::number(params.get_geodesic_remesh_percent()));
260264
ui_->use_normals->setChecked(params.get_use_normals()[0]);
261265
ui_->normals_strength->setText(QString::number(params.get_normals_strength()));
262266
ui_->use_geodesics_from_landmarks->setChecked(params.get_use_geodesics_to_landmarks());
@@ -302,6 +306,7 @@ void OptimizeTool::store_params() {
302306
params.set_optimization_iterations(ui_->optimization_iterations->text().toDouble());
303307

304308
params.set_use_geodesic_distance(ui_->use_geodesic_distance->isChecked());
309+
params.set_geodesic_remesh_percent(ui_->geodesic_remesh_percent->text().toDouble());
305310
params.set_use_normals({ui_->use_normals->isChecked()});
306311
params.set_normals_strength(ui_->normals_strength->text().toDouble());
307312
params.set_use_geodesics_to_landmarks(ui_->use_geodesics_from_landmarks->isChecked());
@@ -354,6 +359,7 @@ void OptimizeTool::update_ui_elements() {
354359
ui_->procrustes_interval->setEnabled(ui_->procrustes->isChecked());
355360
ui_->multiscale_particles->setEnabled(ui_->multiscale->isChecked());
356361
ui_->geodesics_to_landmarks_weight->setEnabled(ui_->use_geodesics_from_landmarks->isChecked());
362+
ui_->geodesic_remesh_percent->setEnabled(ui_->use_geodesic_distance->isChecked());
357363
}
358364

359365
//---------------------------------------------------------------------------
@@ -446,7 +452,8 @@ void OptimizeTool::setup_domain_boxes() {
446452
QWidget::setTabOrder(ui_->ending_regularization, ui_->iterations_per_split);
447453
QWidget::setTabOrder(ui_->iterations_per_split, ui_->optimization_iterations);
448454
QWidget::setTabOrder(ui_->optimization_iterations, ui_->use_geodesic_distance);
449-
QWidget::setTabOrder(ui_->use_geodesic_distance, ui_->use_normals);
455+
QWidget::setTabOrder(ui_->use_geodesic_distance, ui_->geodesic_remesh_percent);
456+
QWidget::setTabOrder(ui_->geodesic_remesh_percent, ui_->use_normals);
450457
QWidget::setTabOrder(ui_->use_normals, ui_->normals_strength);
451458
QWidget::setTabOrder(ui_->normals_strength, ui_->use_geodesics_from_landmarks);
452459
QWidget::setTabOrder(ui_->use_geodesics_from_landmarks, ui_->geodesics_to_landmarks_weight);

0 commit comments

Comments
 (0)