Add high resolution option for polygonize color regions

This commit is contained in:
sentientstardust
2026-05-28 19:41:35 +01:00
parent fdf97b19dd
commit 29abec47b1
4 changed files with 61 additions and 4 deletions

View File

@@ -502,6 +502,7 @@ struct TopSurfaceImageRegionPlan {
bool contoning_blue_noise_error_diffusion_enabled = false;
bool contoning_supersampled_cells_enabled = false;
bool contoning_polygonize_color_regions_enabled = false;
bool contoning_polygonize_high_resolution_enabled = TextureMappingZone::DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled;
bool contoning_surface_anchored_stacks_enabled = false;
int contoning_flat_surface_infill_mode = TextureMappingZone::SlicerDefaultTopSurfaceContoningFlatSurfaceInfillMode;
};
@@ -1164,6 +1165,7 @@ struct TopSurfaceImageContoningStackPlanKey {
bool supersampled { false };
bool blue_noise { false };
bool polygonize { false };
bool polygonize_high_resolution { false };
bool operator<(const TopSurfaceImageContoningStackPlanKey &rhs) const
{
@@ -1189,7 +1191,8 @@ struct TopSurfaceImageContoningStackPlanKey {
recolor_surrounding_perimeters,
supersampled,
blue_noise,
polygonize) <
polygonize,
polygonize_high_resolution) <
std::tie(rhs.source_layer,
rhs.source_layer_id,
rhs.target_layer,
@@ -1212,7 +1215,8 @@ struct TopSurfaceImageContoningStackPlanKey {
rhs.recolor_surrounding_perimeters,
rhs.supersampled,
rhs.blue_noise,
rhs.polygonize);
rhs.polygonize,
rhs.polygonize_high_resolution);
}
};
@@ -1468,15 +1472,21 @@ static float top_surface_image_contoning_sample_pitch_mm(const TopSurfaceImageRe
float pitch = std::clamp(plan.contoning_external_width_mm,
0.25f,
std::max(0.25f, plan.contoning_min_feature_mm * 0.5f));
const bool high_resolution =
plan.contoning_polygonize_color_regions_enabled &&
plan.contoning_polygonize_high_resolution_enabled;
const float min_pitch = high_resolution ? 0.125f : 0.25f;
if (high_resolution)
pitch = std::max(min_pitch, pitch * 0.5f);
const double width_mm = unscale<double>(bbox.max.x() - bbox.min.x());
const double height_mm = unscale<double>(bbox.max.y() - bbox.min.y());
const double max_samples = 350000.0;
const double max_samples = high_resolution ? 2600000.0 : 650000.0;
if (width_mm > 0.0 && height_mm > 0.0) {
const double estimated = std::ceil(width_mm / double(pitch)) * std::ceil(height_mm / double(pitch));
if (estimated > max_samples)
pitch = float(std::sqrt(width_mm * height_mm / max_samples));
}
return std::clamp(pitch, 0.25f, std::max(0.25f, plan.contoning_min_feature_mm));
return std::clamp(pitch, min_pitch, std::max(min_pitch, plan.contoning_min_feature_mm));
}
static float top_surface_image_contoning_angle_rad(int depth, bool varied_angles)
@@ -2582,6 +2592,9 @@ static TopSurfaceImageContoningStackPlanKey top_surface_image_contoning_stack_pl
key.supersampled = plan.contoning_supersampled_cells_enabled;
key.blue_noise = use_blue_noise_error_diffusion;
key.polygonize = plan.contoning_polygonize_color_regions_enabled;
key.polygonize_high_resolution =
plan.contoning_polygonize_color_regions_enabled &&
plan.contoning_polygonize_high_resolution_enabled;
return key;
}
@@ -3230,6 +3243,8 @@ static std::vector<TopSurfaceImageRegionPlan> top_surface_image_region_plans(
plan.contoning_blue_noise_error_diffusion_enabled = zone->top_surface_contoning_blue_noise_error_diffusion_enabled;
plan.contoning_supersampled_cells_enabled = zone->top_surface_contoning_supersampled_cells_enabled;
plan.contoning_polygonize_color_regions_enabled = zone->top_surface_contoning_polygonize_color_regions_enabled;
plan.contoning_polygonize_high_resolution_enabled =
zone->top_surface_contoning_polygonize_high_resolution_enabled;
plan.contoning_surface_anchored_stacks_enabled =
zone->effective_top_surface_contoning_surface_anchored_stacks_enabled();
const TextureMappingContoningSolver contoning_solver(*zone, print_config, components);

View File

@@ -1145,6 +1145,7 @@ bool TextureMappingZone::operator==(const TextureMappingZone &rhs) const
top_surface_contoning_blue_noise_error_diffusion_enabled == rhs.top_surface_contoning_blue_noise_error_diffusion_enabled &&
top_surface_contoning_supersampled_cells_enabled == rhs.top_surface_contoning_supersampled_cells_enabled &&
top_surface_contoning_polygonize_color_regions_enabled == rhs.top_surface_contoning_polygonize_color_regions_enabled &&
top_surface_contoning_polygonize_high_resolution_enabled == rhs.top_surface_contoning_polygonize_high_resolution_enabled &&
effective_top_surface_contoning_surface_anchored_stacks_enabled() == rhs.effective_top_surface_contoning_surface_anchored_stacks_enabled() &&
compact_offset_mode == rhs.compact_offset_mode &&
use_legacy_fixed_color_mode == rhs.use_legacy_fixed_color_mode &&
@@ -1542,6 +1543,8 @@ std::string TextureMappingManager::serialize_entries()
zone.top_surface_contoning_supersampled_cells_enabled;
texture["top_surface_contoning_polygonize_color_regions_enabled"] =
zone.top_surface_contoning_polygonize_color_regions_enabled;
texture["top_surface_contoning_polygonize_high_resolution_enabled"] =
zone.top_surface_contoning_polygonize_high_resolution_enabled;
texture["top_surface_contoning_surface_anchored_stacks_enabled"] =
zone.effective_top_surface_contoning_surface_anchored_stacks_enabled();
texture["compact_offset_mode"] = zone.compact_offset_mode;
@@ -1831,6 +1834,9 @@ void TextureMappingManager::load_entries(const std::string &serialized,
zone.top_surface_contoning_polygonize_color_regions_enabled =
texture.value("top_surface_contoning_polygonize_color_regions_enabled",
TextureMappingZone::DefaultTopSurfaceContoningPolygonizeColorRegionsEnabled);
zone.top_surface_contoning_polygonize_high_resolution_enabled =
texture.value("top_surface_contoning_polygonize_high_resolution_enabled",
TextureMappingZone::DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled);
zone.top_surface_contoning_surface_anchored_stacks_enabled =
texture.value("top_surface_contoning_surface_anchored_stacks_enabled",
TextureMappingZone::DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled);

View File

@@ -202,6 +202,7 @@ struct TextureMappingZone
static constexpr bool DefaultTopSurfaceContoningBlueNoiseErrorDiffusionEnabled = false;
static constexpr bool DefaultTopSurfaceContoningSupersampledCellsEnabled = false;
static constexpr bool DefaultTopSurfaceContoningPolygonizeColorRegionsEnabled = false;
static constexpr bool DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled = true;
static constexpr bool DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled = false;
static constexpr bool DefaultCompactOffsetMode = true;
static constexpr bool DefaultUseLegacyFixedColorMode = false;
@@ -354,6 +355,7 @@ struct TextureMappingZone
bool top_surface_contoning_blue_noise_error_diffusion_enabled = DefaultTopSurfaceContoningBlueNoiseErrorDiffusionEnabled;
bool top_surface_contoning_supersampled_cells_enabled = DefaultTopSurfaceContoningSupersampledCellsEnabled;
bool top_surface_contoning_polygonize_color_regions_enabled = DefaultTopSurfaceContoningPolygonizeColorRegionsEnabled;
bool top_surface_contoning_polygonize_high_resolution_enabled = DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled;
bool top_surface_contoning_surface_anchored_stacks_enabled = DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled;
bool compact_offset_mode = DefaultCompactOffsetMode;
bool use_legacy_fixed_color_mode = DefaultUseLegacyFixedColorMode;
@@ -544,6 +546,7 @@ struct TextureMappingZone
top_surface_contoning_blue_noise_error_diffusion_enabled = DefaultTopSurfaceContoningBlueNoiseErrorDiffusionEnabled;
top_surface_contoning_supersampled_cells_enabled = DefaultTopSurfaceContoningSupersampledCellsEnabled;
top_surface_contoning_polygonize_color_regions_enabled = DefaultTopSurfaceContoningPolygonizeColorRegionsEnabled;
top_surface_contoning_polygonize_high_resolution_enabled = DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled;
top_surface_contoning_surface_anchored_stacks_enabled = DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled;
compact_offset_mode = DefaultCompactOffsetMode;
use_legacy_fixed_color_mode = DefaultUseLegacyFixedColorMode;

View File

@@ -1982,6 +1982,7 @@ public:
bool top_surface_contoning_blue_noise_error_diffusion_enabled,
bool top_surface_contoning_supersampled_cells_enabled,
bool top_surface_contoning_polygonize_color_regions_enabled,
bool top_surface_contoning_polygonize_high_resolution_enabled,
bool top_surface_contoning_surface_anchored_stacks_enabled,
const TextureMappingManager &texture_mapping_zones,
const TextureMappingGlobalSettings &global_settings,
@@ -2768,6 +2769,15 @@ public:
0,
wxEXPAND | wxTOP | wxBOTTOM,
gap / 2);
m_top_surface_contoning_polygonize_high_resolution_checkbox =
new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("High-resolution polygon tracing"));
m_top_surface_contoning_polygonize_high_resolution_checkbox->SetValue(top_surface_contoning_polygonize_high_resolution_enabled);
m_top_surface_contoning_polygonize_high_resolution_checkbox->SetMinSize(
wxSize(-1, std::max(m_top_surface_contoning_polygonize_high_resolution_checkbox->GetBestSize().GetHeight(), FromDIP(24))));
contoning_checkboxes_root->Add(m_top_surface_contoning_polygonize_high_resolution_checkbox,
0,
wxEXPAND | wxTOP | wxBOTTOM,
gap / 2);
if (TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) {
m_top_surface_contoning_surface_anchored_stacks_checkbox =
new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Surface-anchored stacks"));
@@ -2805,6 +2815,11 @@ public:
update_top_surface_image_options_visibility(true);
});
}
if (m_top_surface_contoning_polygonize_color_regions_checkbox != nullptr) {
m_top_surface_contoning_polygonize_color_regions_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) {
update_top_surface_image_options_visibility(true);
});
}
m_top_surface_image_printing_enabled_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) {
update_top_surface_image_options_visibility(true);
});
@@ -3224,6 +3239,12 @@ public:
return m_top_surface_contoning_polygonize_color_regions_checkbox != nullptr &&
m_top_surface_contoning_polygonize_color_regions_checkbox->GetValue();
}
bool top_surface_contoning_polygonize_high_resolution_enabled() const
{
return m_top_surface_contoning_polygonize_high_resolution_checkbox == nullptr ?
TextureMappingZone::DefaultTopSurfaceContoningPolygonizeHighResolutionEnabled :
m_top_surface_contoning_polygonize_high_resolution_checkbox->GetValue();
}
bool top_surface_contoning_surface_anchored_stacks_enabled() const
{
if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions)
@@ -3732,6 +3753,14 @@ private:
m_top_surface_contoning_polygonize_color_regions_checkbox->Show(contoning);
m_top_surface_contoning_polygonize_color_regions_checkbox->Enable(contoning);
}
const bool polygonize_color_regions =
contoning &&
m_top_surface_contoning_polygonize_color_regions_checkbox != nullptr &&
m_top_surface_contoning_polygonize_color_regions_checkbox->GetValue();
if (m_top_surface_contoning_polygonize_high_resolution_checkbox != nullptr) {
m_top_surface_contoning_polygonize_high_resolution_checkbox->Show(polygonize_color_regions);
m_top_surface_contoning_polygonize_high_resolution_checkbox->Enable(polygonize_color_regions);
}
if (m_top_surface_contoning_surface_anchored_stacks_checkbox != nullptr) {
m_top_surface_contoning_surface_anchored_stacks_checkbox->Show(contoning);
m_top_surface_contoning_surface_anchored_stacks_checkbox->Enable(contoning);
@@ -3810,6 +3839,7 @@ private:
wxCheckBox *m_top_surface_contoning_blue_noise_error_diffusion_checkbox {nullptr};
wxCheckBox *m_top_surface_contoning_supersampled_cells_checkbox {nullptr};
wxCheckBox *m_top_surface_contoning_polygonize_color_regions_checkbox {nullptr};
wxCheckBox *m_top_surface_contoning_polygonize_high_resolution_checkbox {nullptr};
wxCheckBox *m_top_surface_contoning_surface_anchored_stacks_checkbox {nullptr};
wxCheckBox *m_use_legacy_fixed_color_mode_checkbox {nullptr};
wxCheckBox *m_minimum_visibility_offset_checkbox {nullptr};
@@ -8833,6 +8863,7 @@ void Sidebar::update_texture_mapping_panel(bool sync_manager)
updated.top_surface_contoning_blue_noise_error_diffusion_enabled,
updated.top_surface_contoning_supersampled_cells_enabled,
updated.top_surface_contoning_polygonize_color_regions_enabled,
updated.top_surface_contoning_polygonize_high_resolution_enabled,
updated.top_surface_contoning_surface_anchored_stacks_enabled,
bundle->texture_mapping_zones,
bundle->texture_mapping_global_settings,
@@ -8905,6 +8936,8 @@ void Sidebar::update_texture_mapping_panel(bool sync_manager)
dlg.top_surface_contoning_supersampled_cells_enabled();
updated.top_surface_contoning_polygonize_color_regions_enabled =
dlg.top_surface_contoning_polygonize_color_regions_enabled();
updated.top_surface_contoning_polygonize_high_resolution_enabled =
dlg.top_surface_contoning_polygonize_high_resolution_enabled();
updated.top_surface_contoning_surface_anchored_stacks_enabled =
dlg.top_surface_contoning_surface_anchored_stacks_enabled();
if (updated.top_surface_image_printing_enabled &&