From 11cacfababde9d8d12d7948a1b72b6239cb864ad Mon Sep 17 00:00:00 2001 From: sentientstardust Date: Wed, 27 May 2026 23:57:37 +0100 Subject: [PATCH] Add flag to toggle whether some top-surface coloring options are visible in the UI --- src/libslic3r/Fill/Fill.cpp | 15 +-- src/libslic3r/TextureMapping.cpp | 33 +++-- src/libslic3r/TextureMapping.hpp | 108 ++++++++++++++- src/slic3r/GUI/Plater.cpp | 222 +++++++++++++++++-------------- 4 files changed, 250 insertions(+), 128 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 3136a7b4532..96c2cafa3d1 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -3093,7 +3093,7 @@ static std::vector top_surface_image_region_plans( plan.min_width_mm = std::clamp(zone->top_surface_image_min_line_width_mm, TextureMappingZone::MinTopSurfaceImageLineWidthMm, plan.max_width_mm); - plan.fixed_coloring = zone->top_surface_image_fixed_coloring_filaments; + plan.fixed_coloring = zone->top_surface_image_fixed_coloring_filaments_active(); plan.color_lower_surfaces = zone->top_surface_contoning_color_lower_surfaces; plan.colored_top_layers = std::clamp(zone->top_surface_image_colored_top_layers, TextureMappingZone::MinTopSurfaceImageColoredTopLayers, @@ -3108,24 +3108,23 @@ static std::vector top_surface_image_region_plans( plan.contoning_min_feature_mm = texture_mapping_contoning_min_feature_mm(*zone, print_config, components, plan.contoning_external_width_mm); plan.contoning_replace_top_perimeters_with_infill = - zone->top_surface_contoning_replace_top_perimeters_with_infill; + zone->effective_top_surface_contoning_replace_top_perimeters_with_infill(); plan.contoning_recolor_surrounding_perimeters = - zone->top_surface_contoning_recolor_surrounding_perimeters && - !plan.contoning_replace_top_perimeters_with_infill; + zone->effective_top_surface_contoning_recolor_surrounding_perimeters(); plan.contoning_perimeter_mode = - std::clamp(zone->top_surface_contoning_perimeter_mode, + std::clamp(zone->stored_top_surface_contoning_perimeter_mode(), int(TextureMappingZone::ContoningPerimeterSegmentBlocks), int(TextureMappingZone::ContoningPerimeterSegmentInfill)); plan.contoning_flat_surface_infill_mode = - std::clamp(TextureMappingZone::effective_top_surface_contoning_flat_surface_infill_mode( - zone->top_surface_contoning_flat_surface_infill_mode), + std::clamp(zone->effective_top_surface_contoning_flat_surface_infill_mode(), int(TextureMappingZone::ContoningFlatSurfaceInfillRectilinear), int(TextureMappingZone::ContoningFlatSurfaceInfillRectilinearWithBoundary)); plan.contoning_layer_phase_enabled = zone->top_surface_contoning_layer_phase_enabled; plan.contoning_varied_infill_angles_enabled = zone->top_surface_contoning_varied_infill_angles_enabled; 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_surface_anchored_stacks_enabled = zone->top_surface_contoning_surface_anchored_stacks_enabled; + plan.contoning_surface_anchored_stacks_enabled = + zone->effective_top_surface_contoning_surface_anchored_stacks_enabled(); const TextureMappingContoningSolver contoning_solver(*zone, print_config, components); const int stack_depth = plan.contoning ? diff --git a/src/libslic3r/TextureMapping.cpp b/src/libslic3r/TextureMapping.cpp index f47d26c808c..2c365fa46da 100644 --- a/src/libslic3r/TextureMapping.cpp +++ b/src/libslic3r/TextureMapping.cpp @@ -1128,22 +1128,22 @@ bool TextureMappingZone::operator==(const TextureMappingZone &rhs) const std::abs(top_surface_image_min_line_width_mm - rhs.top_surface_image_min_line_width_mm) <= eps && std::abs(top_surface_image_max_line_width_mm - rhs.top_surface_image_max_line_width_mm) <= eps && top_surface_image_colored_top_layers == rhs.top_surface_image_colored_top_layers && - top_surface_image_fixed_coloring_filaments == rhs.top_surface_image_fixed_coloring_filaments && + top_surface_image_fixed_coloring_filaments_active() == rhs.top_surface_image_fixed_coloring_filaments_active() && std::abs(top_surface_contoning_angle_threshold_deg - rhs.top_surface_contoning_angle_threshold_deg) <= eps && top_surface_contoning_stack_layers == rhs.top_surface_contoning_stack_layers && top_surface_contoning_pattern_filaments == rhs.top_surface_contoning_pattern_filaments && std::abs(top_surface_contoning_min_feature_mm - rhs.top_surface_contoning_min_feature_mm) <= eps && top_surface_contoning_color_lower_surfaces == rhs.top_surface_contoning_color_lower_surfaces && - top_surface_contoning_only_color_surface_infill == rhs.top_surface_contoning_only_color_surface_infill && - top_surface_contoning_replace_top_perimeters_with_infill == rhs.top_surface_contoning_replace_top_perimeters_with_infill && - top_surface_contoning_recolor_surrounding_perimeters == rhs.top_surface_contoning_recolor_surrounding_perimeters && - top_surface_contoning_perimeter_mode == rhs.top_surface_contoning_perimeter_mode && - top_surface_contoning_flat_surface_infill_mode == rhs.top_surface_contoning_flat_surface_infill_mode && + effective_top_surface_contoning_only_color_surface_infill() == rhs.effective_top_surface_contoning_only_color_surface_infill() && + effective_top_surface_contoning_replace_top_perimeters_with_infill() == rhs.effective_top_surface_contoning_replace_top_perimeters_with_infill() && + effective_top_surface_contoning_recolor_surrounding_perimeters() == rhs.effective_top_surface_contoning_recolor_surrounding_perimeters() && + stored_top_surface_contoning_perimeter_mode() == rhs.stored_top_surface_contoning_perimeter_mode() && + stored_top_surface_contoning_flat_surface_infill_mode() == rhs.stored_top_surface_contoning_flat_surface_infill_mode() && top_surface_contoning_layer_phase_enabled == rhs.top_surface_contoning_layer_phase_enabled && top_surface_contoning_varied_infill_angles_enabled == rhs.top_surface_contoning_varied_infill_angles_enabled && 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_surface_anchored_stacks_enabled == rhs.top_surface_contoning_surface_anchored_stacks_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 && high_speed_image_texture_sampling == rhs.high_speed_image_texture_sampling && @@ -1497,7 +1497,7 @@ std::string TextureMappingManager::serialize_entries() clamp_int(zone.top_surface_image_colored_top_layers, TextureMappingZone::MinTopSurfaceImageColoredTopLayers, TextureMappingZone::MaxTopSurfaceImageColoredTopLayers); - texture["top_surface_image_fixed_coloring_filaments"] = zone.top_surface_image_fixed_coloring_filaments; + texture["top_surface_image_fixed_coloring_filaments"] = zone.top_surface_image_fixed_coloring_filaments_active(); texture["top_surface_contoning_angle_threshold_deg"] = std::clamp(finite_or(zone.top_surface_contoning_angle_threshold_deg, TextureMappingZone::DefaultTopSurfaceContoningAngleThresholdDeg), @@ -1517,18 +1517,18 @@ std::string TextureMappingManager::serialize_entries() TextureMappingZone::MinTopSurfaceContoningMinFeatureMm, TextureMappingZone::MaxTopSurfaceContoningMinFeatureMm); texture["top_surface_contoning_color_lower_surfaces"] = zone.top_surface_contoning_color_lower_surfaces; - texture["top_surface_contoning_only_color_surface_infill"] = zone.top_surface_contoning_only_color_surface_infill; + texture["top_surface_contoning_only_color_surface_infill"] = + zone.effective_top_surface_contoning_only_color_surface_infill(); texture["top_surface_contoning_replace_top_perimeters_with_infill"] = - zone.top_surface_contoning_replace_top_perimeters_with_infill; + zone.effective_top_surface_contoning_replace_top_perimeters_with_infill(); texture["top_surface_contoning_recolor_surrounding_perimeters"] = - zone.top_surface_contoning_recolor_surrounding_perimeters && - !zone.top_surface_contoning_replace_top_perimeters_with_infill; + zone.effective_top_surface_contoning_recolor_surrounding_perimeters(); texture["top_surface_contoning_perimeter_mode"] = - clamp_int(zone.top_surface_contoning_perimeter_mode, + clamp_int(zone.stored_top_surface_contoning_perimeter_mode(), int(TextureMappingZone::ContoningPerimeterSegmentBlocks), int(TextureMappingZone::ContoningPerimeterSegmentInfill)); texture["top_surface_contoning_flat_surface_infill_mode"] = - top_surface_contoning_flat_surface_infill_mode_name(zone.top_surface_contoning_flat_surface_infill_mode); + top_surface_contoning_flat_surface_infill_mode_name(zone.stored_top_surface_contoning_flat_surface_infill_mode()); texture["top_surface_contoning_layer_phase_enabled"] = zone.top_surface_contoning_layer_phase_enabled; texture["top_surface_contoning_varied_infill_angles_enabled"] = zone.top_surface_contoning_varied_infill_angles_enabled; @@ -1537,7 +1537,7 @@ std::string TextureMappingManager::serialize_entries() texture["top_surface_contoning_supersampled_cells_enabled"] = zone.top_surface_contoning_supersampled_cells_enabled; texture["top_surface_contoning_surface_anchored_stacks_enabled"] = - zone.top_surface_contoning_surface_anchored_stacks_enabled; + zone.effective_top_surface_contoning_surface_anchored_stacks_enabled(); texture["compact_offset_mode"] = zone.compact_offset_mode; texture["use_legacy_fixed_color_mode"] = zone.use_legacy_fixed_color_mode; texture["high_speed_image_texture_sampling"] = true; @@ -1807,8 +1807,6 @@ void TextureMappingManager::load_entries(const std::string &serialized, TextureMappingZone::DefaultTopSurfaceContoningFlatSurfaceInfillMode, int(TextureMappingZone::ContoningFlatSurfaceInfillDefault), int(TextureMappingZone::ContoningFlatSurfaceInfillRectilinearWithBoundary)); - if (zone.top_surface_contoning_replace_top_perimeters_with_infill) - zone.top_surface_contoning_recolor_surrounding_perimeters = false; zone.top_surface_contoning_layer_phase_enabled = texture.value("top_surface_contoning_layer_phase_enabled", TextureMappingZone::DefaultTopSurfaceContoningLayerPhaseEnabled); @@ -1824,6 +1822,7 @@ void TextureMappingManager::load_entries(const std::string &serialized, zone.top_surface_contoning_surface_anchored_stacks_enabled = texture.value("top_surface_contoning_surface_anchored_stacks_enabled", TextureMappingZone::DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled); + zone.apply_top_surface_contoning_experimental_defaults(); zone.compact_offset_mode = texture.value("compact_offset_mode", TextureMappingZone::DefaultCompactOffsetMode); zone.use_legacy_fixed_color_mode = texture.value("use_legacy_fixed_color_mode", TextureMappingZone::DefaultUseLegacyFixedColorMode); diff --git a/src/libslic3r/TextureMapping.hpp b/src/libslic3r/TextureMapping.hpp index 293fba97b18..1da86fcdfb5 100644 --- a/src/libslic3r/TextureMapping.hpp +++ b/src/libslic3r/TextureMapping.hpp @@ -3,6 +3,10 @@ #ifndef slic3r_TextureMapping_hpp_ #define slic3r_TextureMapping_hpp_ +#ifndef SLIC3R_SHOW_EXPERIMENTAL_CONTONING_OPTIONS +#define SLIC3R_SHOW_EXPERIMENTAL_CONTONING_OPTIONS 0 +#endif + #include #include #include @@ -221,6 +225,7 @@ struct TextureMappingZone static constexpr bool DefaultPreviewLimitResolution = true; static constexpr bool DefaultPreviewSimulateTopSurfaceLod = true; static constexpr bool DefaultAutoAdjustFilamentSelection = true; + static constexpr bool ShowExperimentalTopSurfaceContoningOptions = SLIC3R_SHOW_EXPERIMENTAL_CONTONING_OPTIONS != 0; static constexpr int default_modulation_mode_for_surface_pattern(int surface_pattern) { @@ -233,11 +238,43 @@ struct TextureMappingZone static constexpr int effective_top_surface_contoning_flat_surface_infill_mode(int mode) { + if (!ShowExperimentalTopSurfaceContoningOptions) + return SlicerDefaultTopSurfaceContoningFlatSurfaceInfillMode; return mode == int(ContoningFlatSurfaceInfillDefault) ? SlicerDefaultTopSurfaceContoningFlatSurfaceInfillMode : mode; } + static constexpr int stored_top_surface_contoning_flat_surface_infill_mode(int mode) + { + return ShowExperimentalTopSurfaceContoningOptions ? mode : DefaultTopSurfaceContoningFlatSurfaceInfillMode; + } + + static constexpr int stored_top_surface_contoning_perimeter_mode(int mode) + { + return ShowExperimentalTopSurfaceContoningOptions ? mode : DefaultTopSurfaceContoningPerimeterMode; + } + + static constexpr bool effective_top_surface_contoning_only_color_surface_infill(bool value) + { + return ShowExperimentalTopSurfaceContoningOptions ? value : true; + } + + static constexpr bool effective_top_surface_contoning_replace_top_perimeters_with_infill(bool value) + { + return ShowExperimentalTopSurfaceContoningOptions && value; + } + + static constexpr bool effective_top_surface_contoning_recolor_surrounding_perimeters(bool value, bool replace) + { + return ShowExperimentalTopSurfaceContoningOptions && value && !replace; + } + + static constexpr bool effective_top_surface_contoning_surface_anchored_stacks_enabled(bool value) + { + return ShowExperimentalTopSurfaceContoningOptions && value; + } + struct LinearGradientAnchor { bool valid = false; size_t object_id = 0; @@ -371,12 +408,77 @@ struct TextureMappingZone top_surface_image_printing_method == int(TopSurfaceImageContoning) && uses_perimeter_path_modulation_v2(); } + + bool top_surface_image_fixed_coloring_filaments_active() const + { + return top_surface_image_printing_method == int(TopSurfaceImageContoning) || + top_surface_image_fixed_coloring_filaments; + } bool top_surface_contoning_perimeters_active() const { return top_surface_contoning_active() && - !top_surface_contoning_only_color_surface_infill && - !top_surface_contoning_replace_top_perimeters_with_infill && - !top_surface_contoning_recolor_surrounding_perimeters; + !effective_top_surface_contoning_only_color_surface_infill() && + !effective_top_surface_contoning_replace_top_perimeters_with_infill() && + !effective_top_surface_contoning_recolor_surrounding_perimeters(); + } + + bool effective_top_surface_contoning_only_color_surface_infill() const + { + return effective_top_surface_contoning_only_color_surface_infill(top_surface_contoning_only_color_surface_infill); + } + + bool effective_top_surface_contoning_replace_top_perimeters_with_infill() const + { + return effective_top_surface_contoning_replace_top_perimeters_with_infill( + top_surface_contoning_replace_top_perimeters_with_infill); + } + + bool effective_top_surface_contoning_recolor_surrounding_perimeters() const + { + return effective_top_surface_contoning_recolor_surrounding_perimeters( + top_surface_contoning_recolor_surrounding_perimeters, + effective_top_surface_contoning_replace_top_perimeters_with_infill()); + } + + int stored_top_surface_contoning_perimeter_mode() const + { + return stored_top_surface_contoning_perimeter_mode(top_surface_contoning_perimeter_mode); + } + + int stored_top_surface_contoning_flat_surface_infill_mode() const + { + return stored_top_surface_contoning_flat_surface_infill_mode(top_surface_contoning_flat_surface_infill_mode); + } + + int effective_top_surface_contoning_flat_surface_infill_mode() const + { + return effective_top_surface_contoning_flat_surface_infill_mode(stored_top_surface_contoning_flat_surface_infill_mode()); + } + + bool effective_top_surface_contoning_surface_anchored_stacks_enabled() const + { + return effective_top_surface_contoning_surface_anchored_stacks_enabled( + top_surface_contoning_surface_anchored_stacks_enabled); + } + + void apply_top_surface_contoning_experimental_defaults() + { + if (top_surface_image_printing_enabled && + top_surface_image_printing_method == int(TopSurfaceImageContoning)) { + modulation_mode = int(ModulationPerimeterPathV2); + modulation_mode_manually_changed = true; + top_surface_image_fixed_coloring_filaments = true; + } + if (!ShowExperimentalTopSurfaceContoningOptions) { + top_surface_contoning_only_color_surface_infill = true; + top_surface_contoning_replace_top_perimeters_with_infill = false; + top_surface_contoning_recolor_surrounding_perimeters = false; + top_surface_contoning_perimeter_mode = DefaultTopSurfaceContoningPerimeterMode; + top_surface_contoning_flat_surface_infill_mode = DefaultTopSurfaceContoningFlatSurfaceInfillMode; + top_surface_contoning_surface_anchored_stacks_enabled = false; + } else if (top_surface_contoning_replace_top_perimeters_with_infill) { + top_surface_contoning_recolor_surrounding_perimeters = false; + } } void apply_default_modulation_mode() diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 406146b6232..1dc9fe2d256 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2561,28 +2561,30 @@ public: contoning_feature_row->Add(m_top_surface_contoning_min_feature_spin, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, gap / 2); contoning_feature_row->Add(new wxStaticText(m_top_surface_contoning_panel, wxID_ANY, _L("mm")), 0, wxALIGN_CENTER_VERTICAL); top_surface_contoning_root->Add(contoning_feature_row, 0, wxEXPAND); - auto *contoning_flat_infill_row = new wxBoxSizer(wxHORIZONTAL); - contoning_flat_infill_row->Add(new wxStaticText(m_top_surface_contoning_panel, wxID_ANY, _L("Flat surface infill mode")), - 0, - wxALIGN_CENTER_VERTICAL | wxRIGHT, - gap); - wxArrayString contoning_flat_infill_choices; - contoning_flat_infill_choices.Add(_L("Default (Rectilinear)")); - contoning_flat_infill_choices.Add(_L("Rectilinear")); - contoning_flat_infill_choices.Add(_L("Concentric")); - contoning_flat_infill_choices.Add(_L("Boundary Skin (fixed width)")); - contoning_flat_infill_choices.Add(_L("Boundary Skin (variable width)")); - contoning_flat_infill_choices.Add(_L("Spiral")); - contoning_flat_infill_choices.Add(_L("Boundary Skin Hybrid")); - contoning_flat_infill_choices.Add(_L("Rectilinear with Boundary")); - m_top_surface_contoning_flat_surface_infill_choice = - new wxChoice(m_top_surface_contoning_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, contoning_flat_infill_choices); - m_top_surface_contoning_flat_surface_infill_choice->SetSelection( - std::clamp(top_surface_contoning_flat_surface_infill_mode, - int(TextureMappingZone::ContoningFlatSurfaceInfillDefault), - int(TextureMappingZone::ContoningFlatSurfaceInfillRectilinearWithBoundary))); - contoning_flat_infill_row->Add(m_top_surface_contoning_flat_surface_infill_choice, 1, wxEXPAND); - top_surface_contoning_root->Add(contoning_flat_infill_row, 0, wxEXPAND | wxTOP, gap); + if (TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) { + auto *contoning_flat_infill_row = new wxBoxSizer(wxHORIZONTAL); + contoning_flat_infill_row->Add(new wxStaticText(m_top_surface_contoning_panel, wxID_ANY, _L("Flat surface infill mode")), + 0, + wxALIGN_CENTER_VERTICAL | wxRIGHT, + gap); + wxArrayString contoning_flat_infill_choices; + contoning_flat_infill_choices.Add(_L("Default (Rectilinear)")); + contoning_flat_infill_choices.Add(_L("Rectilinear")); + contoning_flat_infill_choices.Add(_L("Concentric")); + contoning_flat_infill_choices.Add(_L("Boundary Skin (fixed width)")); + contoning_flat_infill_choices.Add(_L("Boundary Skin (variable width)")); + contoning_flat_infill_choices.Add(_L("Spiral")); + contoning_flat_infill_choices.Add(_L("Boundary Skin Hybrid")); + contoning_flat_infill_choices.Add(_L("Rectilinear with Boundary")); + m_top_surface_contoning_flat_surface_infill_choice = + new wxChoice(m_top_surface_contoning_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, contoning_flat_infill_choices); + m_top_surface_contoning_flat_surface_infill_choice->SetSelection( + std::clamp(top_surface_contoning_flat_surface_infill_mode, + int(TextureMappingZone::ContoningFlatSurfaceInfillDefault), + int(TextureMappingZone::ContoningFlatSurfaceInfillRectilinearWithBoundary))); + contoning_flat_infill_row->Add(m_top_surface_contoning_flat_surface_infill_choice, 1, wxEXPAND); + top_surface_contoning_root->Add(contoning_flat_infill_row, 0, wxEXPAND | wxTOP, gap); + } top_surface_box->Add(m_top_surface_contoning_panel, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, gap); m_top_surface_image_fixed_coloring_filaments_checkbox = new wxCheckBox(top_surface_page, wxID_ANY, _L("Fixed top-surface coloring filaments")); @@ -2600,56 +2602,58 @@ public: 0, wxEXPAND | wxTOP | wxBOTTOM, gap / 2); - m_top_surface_contoning_only_color_surface_infill_checkbox = - new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Only color surface infill")); - m_top_surface_contoning_only_color_surface_infill_checkbox->SetValue(top_surface_contoning_only_color_surface_infill); - m_top_surface_contoning_only_color_surface_infill_checkbox->SetMinSize( - wxSize(-1, std::max(m_top_surface_contoning_only_color_surface_infill_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); - contoning_checkboxes_root->Add(m_top_surface_contoning_only_color_surface_infill_checkbox, - 0, - wxEXPAND | wxTOP | wxBOTTOM, - gap / 2); - m_top_surface_contoning_replace_top_perimeters_checkbox = - new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Replace top perimeters with infill")); - m_top_surface_contoning_replace_top_perimeters_checkbox->SetValue(top_surface_contoning_replace_top_perimeters_with_infill); - m_top_surface_contoning_replace_top_perimeters_checkbox->SetMinSize( - wxSize(-1, std::max(m_top_surface_contoning_replace_top_perimeters_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); - contoning_checkboxes_root->Add(m_top_surface_contoning_replace_top_perimeters_checkbox, - 0, - wxEXPAND | wxTOP | wxBOTTOM, - gap / 2); - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox = - new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Recolor surrounding perimeters to match")); - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetValue( - top_surface_contoning_recolor_surrounding_perimeters && !top_surface_contoning_replace_top_perimeters_with_infill); - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetMinSize( - wxSize(-1, std::max(m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); - contoning_checkboxes_root->Add(m_top_surface_contoning_recolor_surrounding_perimeters_checkbox, - 0, - wxEXPAND | wxTOP | wxBOTTOM, - gap / 2); - m_top_surface_contoning_perimeter_mode_panel = new wxPanel(m_top_surface_contoning_checkboxes_panel, wxID_ANY); - auto *contoning_perimeter_mode_row = new wxBoxSizer(wxHORIZONTAL); - m_top_surface_contoning_perimeter_mode_panel->SetSizer(contoning_perimeter_mode_row); - contoning_perimeter_mode_row->Add(new wxStaticText(m_top_surface_contoning_perimeter_mode_panel, wxID_ANY, _L("Perimeter mode")), - 0, - wxALIGN_CENTER_VERTICAL | wxRIGHT, - gap); - wxArrayString contoning_perimeter_mode_choices; - contoning_perimeter_mode_choices.Add(_L("Segment perimeter into blocks")); - contoning_perimeter_mode_choices.Add(_L("Divided line")); - contoning_perimeter_mode_choices.Add(_L("Segment perimeter into infill")); - m_top_surface_contoning_perimeter_mode_choice = - new wxChoice(m_top_surface_contoning_perimeter_mode_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, contoning_perimeter_mode_choices); - m_top_surface_contoning_perimeter_mode_choice->SetSelection( - std::clamp(top_surface_contoning_perimeter_mode, - int(TextureMappingZone::ContoningPerimeterSegmentBlocks), - int(TextureMappingZone::ContoningPerimeterSegmentInfill))); - contoning_perimeter_mode_row->Add(m_top_surface_contoning_perimeter_mode_choice, 1, wxEXPAND); - contoning_checkboxes_root->Add(m_top_surface_contoning_perimeter_mode_panel, - 0, - wxEXPAND | wxTOP | wxBOTTOM, - gap / 2); + if (TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) { + m_top_surface_contoning_only_color_surface_infill_checkbox = + new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Only color surface infill")); + m_top_surface_contoning_only_color_surface_infill_checkbox->SetValue(top_surface_contoning_only_color_surface_infill); + m_top_surface_contoning_only_color_surface_infill_checkbox->SetMinSize( + wxSize(-1, std::max(m_top_surface_contoning_only_color_surface_infill_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); + contoning_checkboxes_root->Add(m_top_surface_contoning_only_color_surface_infill_checkbox, + 0, + wxEXPAND | wxTOP | wxBOTTOM, + gap / 2); + m_top_surface_contoning_replace_top_perimeters_checkbox = + new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Replace top perimeters with infill")); + m_top_surface_contoning_replace_top_perimeters_checkbox->SetValue(top_surface_contoning_replace_top_perimeters_with_infill); + m_top_surface_contoning_replace_top_perimeters_checkbox->SetMinSize( + wxSize(-1, std::max(m_top_surface_contoning_replace_top_perimeters_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); + contoning_checkboxes_root->Add(m_top_surface_contoning_replace_top_perimeters_checkbox, + 0, + wxEXPAND | wxTOP | wxBOTTOM, + gap / 2); + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox = + new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Recolor surrounding perimeters to match")); + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetValue( + top_surface_contoning_recolor_surrounding_perimeters && !top_surface_contoning_replace_top_perimeters_with_infill); + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetMinSize( + wxSize(-1, std::max(m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); + contoning_checkboxes_root->Add(m_top_surface_contoning_recolor_surrounding_perimeters_checkbox, + 0, + wxEXPAND | wxTOP | wxBOTTOM, + gap / 2); + m_top_surface_contoning_perimeter_mode_panel = new wxPanel(m_top_surface_contoning_checkboxes_panel, wxID_ANY); + auto *contoning_perimeter_mode_row = new wxBoxSizer(wxHORIZONTAL); + m_top_surface_contoning_perimeter_mode_panel->SetSizer(contoning_perimeter_mode_row); + contoning_perimeter_mode_row->Add(new wxStaticText(m_top_surface_contoning_perimeter_mode_panel, wxID_ANY, _L("Perimeter mode")), + 0, + wxALIGN_CENTER_VERTICAL | wxRIGHT, + gap); + wxArrayString contoning_perimeter_mode_choices; + contoning_perimeter_mode_choices.Add(_L("Segment perimeter into blocks")); + contoning_perimeter_mode_choices.Add(_L("Divided line")); + contoning_perimeter_mode_choices.Add(_L("Segment perimeter into infill")); + m_top_surface_contoning_perimeter_mode_choice = + new wxChoice(m_top_surface_contoning_perimeter_mode_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, contoning_perimeter_mode_choices); + m_top_surface_contoning_perimeter_mode_choice->SetSelection( + std::clamp(top_surface_contoning_perimeter_mode, + int(TextureMappingZone::ContoningPerimeterSegmentBlocks), + int(TextureMappingZone::ContoningPerimeterSegmentInfill))); + contoning_perimeter_mode_row->Add(m_top_surface_contoning_perimeter_mode_choice, 1, wxEXPAND); + contoning_checkboxes_root->Add(m_top_surface_contoning_perimeter_mode_panel, + 0, + wxEXPAND | wxTOP | wxBOTTOM, + gap / 2); + } m_top_surface_contoning_layer_phase_checkbox = new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Layer phase detail")); m_top_surface_contoning_layer_phase_checkbox->SetValue(top_surface_contoning_layer_phase_enabled); @@ -2686,35 +2690,43 @@ public: 0, wxEXPAND | wxTOP | wxBOTTOM, gap / 2); - m_top_surface_contoning_surface_anchored_stacks_checkbox = - new wxCheckBox(m_top_surface_contoning_checkboxes_panel, wxID_ANY, _L("Surface-anchored stacks")); - m_top_surface_contoning_surface_anchored_stacks_checkbox->SetValue(top_surface_contoning_surface_anchored_stacks_enabled); - m_top_surface_contoning_surface_anchored_stacks_checkbox->SetMinSize( - wxSize(-1, std::max(m_top_surface_contoning_surface_anchored_stacks_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); - contoning_checkboxes_root->Add(m_top_surface_contoning_surface_anchored_stacks_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")); + m_top_surface_contoning_surface_anchored_stacks_checkbox->SetValue(top_surface_contoning_surface_anchored_stacks_enabled); + m_top_surface_contoning_surface_anchored_stacks_checkbox->SetMinSize( + wxSize(-1, std::max(m_top_surface_contoning_surface_anchored_stacks_checkbox->GetBestSize().GetHeight(), FromDIP(24)))); + contoning_checkboxes_root->Add(m_top_surface_contoning_surface_anchored_stacks_checkbox, + 0, + wxEXPAND | wxTOP | wxBOTTOM, + gap / 2); + } top_surface_box->Add(m_top_surface_contoning_checkboxes_panel, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, gap); - m_top_surface_contoning_only_color_surface_infill_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { - update_top_surface_image_options_visibility(true); - }); - m_top_surface_contoning_replace_top_perimeters_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { - if (m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr && - m_top_surface_contoning_replace_top_perimeters_checkbox->GetValue() && - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr) { - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetValue(false); - } - update_top_surface_image_options_visibility(true); - }); - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { - if (m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr && - m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->GetValue() && - m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr) { - m_top_surface_contoning_replace_top_perimeters_checkbox->SetValue(false); - } - update_top_surface_image_options_visibility(true); - }); + if (m_top_surface_contoning_only_color_surface_infill_checkbox != nullptr) { + m_top_surface_contoning_only_color_surface_infill_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { + update_top_surface_image_options_visibility(true); + }); + } + if (m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr) { + m_top_surface_contoning_replace_top_perimeters_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { + if (m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr && + m_top_surface_contoning_replace_top_perimeters_checkbox->GetValue() && + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr) { + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->SetValue(false); + } + update_top_surface_image_options_visibility(true); + }); + } + if (m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr) { + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &) { + if (m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr && + m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->GetValue() && + m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr) { + m_top_surface_contoning_replace_top_perimeters_checkbox->SetValue(false); + } + 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); }); @@ -3065,17 +3077,23 @@ public: } bool top_surface_contoning_only_color_surface_infill() const { + if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) + return true; return m_top_surface_contoning_only_color_surface_infill_checkbox != nullptr ? m_top_surface_contoning_only_color_surface_infill_checkbox->GetValue() : TextureMappingZone::DefaultTopSurfaceContoningOnlyColorSurfaceInfill; } bool top_surface_contoning_replace_top_perimeters_with_infill() const { + if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) + return false; return m_top_surface_contoning_replace_top_perimeters_checkbox != nullptr && m_top_surface_contoning_replace_top_perimeters_checkbox->GetValue(); } bool top_surface_contoning_recolor_surrounding_perimeters() const { + if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) + return false; return m_top_surface_contoning_recolor_surrounding_perimeters_checkbox != nullptr && m_top_surface_contoning_recolor_surrounding_perimeters_checkbox->GetValue() && !top_surface_contoning_replace_top_perimeters_with_infill(); @@ -3090,6 +3108,8 @@ public: } int top_surface_contoning_flat_surface_infill_mode() const { + if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) + return TextureMappingZone::DefaultTopSurfaceContoningFlatSurfaceInfillMode; return m_top_surface_contoning_flat_surface_infill_choice != nullptr ? std::clamp(m_top_surface_contoning_flat_surface_infill_choice->GetSelection(), int(TextureMappingZone::ContoningFlatSurfaceInfillDefault), @@ -3118,6 +3138,8 @@ public: } bool top_surface_contoning_surface_anchored_stacks_enabled() const { + if (!TextureMappingZone::ShowExperimentalTopSurfaceContoningOptions) + return false; return m_top_surface_contoning_surface_anchored_stacks_checkbox == nullptr ? TextureMappingZone::DefaultTopSurfaceContoningSurfaceAnchoredStacksEnabled : m_top_surface_contoning_surface_anchored_stacks_checkbox->GetValue();