From 68a9980a5e7fb25a411c5b4deed2c09c4c6bd4c8 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Nov 2019 10:17:44 +0100 Subject: [PATCH] ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE -> Small refactoring to improve performances --- src/libslic3r/Slicing.cpp | 16 +++++++++------- src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp index 0d3b3af388..9fb2e00f48 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -361,16 +361,15 @@ std::vector smooth_height_profile(const std::vector& profile, co for (size_t i = 0; i < size; ++i) { - unsigned int id = 0; - double value = 0.0; - for (int j = (int)(i - radius); j <= (int)(i + radius); ++j) + ret.push_back(0.0); + double& height = ret.back(); + int begin = (int)(i - radius); + int end = (int)(i + radius); + for (int j = begin; j <= end; ++j) { if ((0 <= j) && (j < size)) - value += kernel[id] * profile[j]; - - ++id; + height += kernel[j - begin] * profile[j]; } - ret.push_back(value); } return ret; @@ -381,13 +380,16 @@ std::vector smooth_height_profile(const std::vector& profile, co std::vector heights; size_t heights_size = ret.size() / 2; heights.reserve(heights_size); + // extract heights from profile for (size_t i = 0; i < heights_size; ++i) { heights.push_back(ret[i * 2 + 1]); } + // smooth heights heights = gauss_blur(heights, std::max(radius, (unsigned int)1)); + // put smoothed heights back into profile for (size_t i = 0; i < heights_size; ++i) { ret[i * 2 + 1] = clamp(slicing_params.min_layer_height, slicing_params.max_layer_height, heights[i]); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d0cd1fbeb0..d9746bd053 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -287,6 +287,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const #if ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE_SMOOTHING ImGui::Separator(); + imgui.disabled_begin(m_layer_height_profile.size() < 10); if (imgui.button(_(L("Smooth")))) wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), Event(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, m_smooth_radius)); @@ -299,6 +300,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const int radius = (int)m_smooth_radius; if (ImGui::SliderInt("##1", &radius, 1, 10)) m_smooth_radius = (unsigned int)radius; + imgui.disabled_end(); #endif // ENABLE_ADAPTIVE_LAYER_HEIGHT_PROFILE_SMOOTHING ImGui::Separator();