diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 3f9993d381..067d4c27fe 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -535,6 +535,10 @@ void GCodeViewer::SequentialView::Marker::render_position_window(const libvgcode ImGui::SameLine(); imgui.text(_u8L("N/A")); } + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Layer") + ":"); + sprintf(buf, "%d", vertex.layer_id + 1); + ImGui::SameLine(); + imgui.text(std::string(buf)); } // force extra frame to automatically update window size @@ -1165,7 +1169,7 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr reset(); // convert data from PrusaSlicer format to libvgcode format - libvgcode::GCodeInputData data = libvgcode::convert(gcode_result); + libvgcode::GCodeInputData data = libvgcode::convert(gcode_result, m_new_viewer.get_travels_radius(), m_new_viewer.get_wipes_radius()); // send data to the viewer m_new_viewer.load(std::move(data)); @@ -3627,7 +3631,7 @@ void GCodeViewer::render_new_toolpaths() m_new_viewer.render(converted_view_matrix, converted_projetion_matrix); #if ENABLE_NEW_GCODE_VIEWER_DEBUG - Slic3r::GUI::ImGuiWrapper& imgui = *Slic3r::GUI::wxGetApp().imgui(); + ImGuiWrapper& imgui = *wxGetApp().imgui(); const Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size(); imgui.set_next_window_pos(static_cast(cnv_size.get_width()), 0.0f, ImGuiCond_Always, 1.0f, 0.0f); imgui.begin(std::string("LibVGCode Viewer Debug"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); @@ -3636,13 +3640,13 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "# vertices"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "# vertices"); ImGui::TableSetColumnIndex(1); imgui.text(std::to_string(m_new_viewer.get_vertices_count())); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled lines"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled lines"); ImGui::TableSetColumnIndex(1); const std::array& enabled_segments_range = m_new_viewer.get_enabled_segments_range(); imgui.text(std::to_string(m_new_viewer.get_enabled_segments_count()) + " [" + std::to_string(enabled_segments_range[0]) + @@ -3650,7 +3654,7 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled options"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "# enabled options"); ImGui::TableSetColumnIndex(1); const std::array& enabled_options_range = m_new_viewer.get_enabled_options_range(); imgui.text(std::to_string(m_new_viewer.get_enabled_options_count()) + " [" + std::to_string(enabled_options_range[0]) + @@ -3660,14 +3664,14 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "layers range"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "layers range"); ImGui::TableSetColumnIndex(1); const std::array& layers_range = m_new_viewer.get_layers_view_range(); imgui.text(std::to_string(layers_range[0]) + " - " + std::to_string(layers_range[1])); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "view range (full)"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (full)"); ImGui::TableSetColumnIndex(1); const std::array& full_view_range = m_new_viewer.get_view_full_range(); imgui.text(std::to_string(full_view_range[0]) + " - " + std::to_string(full_view_range[1]) + " | " + @@ -3676,7 +3680,7 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "view range (enabled)"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (enabled)"); ImGui::TableSetColumnIndex(1); const std::array& enabled_view_range = m_new_viewer.get_view_enabled_range(); imgui.text(std::to_string(enabled_view_range[0]) + " - " + std::to_string(enabled_view_range[1]) + " | " + @@ -3685,7 +3689,7 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "view range (visible)"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "view range (visible)"); ImGui::TableSetColumnIndex(1); const std::array& visible_view_range = m_new_viewer.get_view_visible_range(); imgui.text(std::to_string(visible_view_range[0]) + " - " + std::to_string(visible_view_range[1]) + " | " + @@ -3695,7 +3699,7 @@ void GCodeViewer::render_new_toolpaths() auto add_range_property_row = [&imgui](const std::string& label, const std::array& range) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, label); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); ImGui::TableSetColumnIndex(1); char buf[128]; sprintf(buf, "%.3f - %.3f", range[0], range[1]); @@ -3719,7 +3723,7 @@ void GCodeViewer::render_new_toolpaths() if (ImGui::BeginTable("Cog", 2)) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "Cog marker scale factor"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Cog marker scale factor"); ImGui::TableSetColumnIndex(1); imgui.text(std::to_string(get_cog_marker_scale_factor())); @@ -3731,13 +3735,13 @@ void GCodeViewer::render_new_toolpaths() if (ImGui::BeginTable("Tool", 2)) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker scale factor"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker scale factor"); ImGui::TableSetColumnIndex(1); imgui.text(std::to_string(m_new_viewer.get_tool_marker_scale_factor())); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker z offset"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker z offset"); ImGui::TableSetColumnIndex(1); float tool_z_offset = m_new_viewer.get_tool_marker_offset_z(); if (imgui.slider_float("##ToolZOffset", &tool_z_offset, 0.0f, 1.0f)) @@ -3745,7 +3749,7 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker color"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker color"); ImGui::TableSetColumnIndex(1); const libvgcode::Color& color = m_new_viewer.get_tool_marker_color(); std::array c = { static_cast(color[0]) / 255.0f, static_cast(color[1]) / 255.0f, static_cast(color[2]) / 255.0f }; @@ -3757,7 +3761,7 @@ void GCodeViewer::render_new_toolpaths() ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); - imgui.text_colored(Slic3r::GUI::ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker alpha"); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Tool marker alpha"); ImGui::TableSetColumnIndex(1); float tool_alpha = m_new_viewer.get_tool_marker_alpha(); if (imgui.slider_float("##ToolAlpha", &tool_alpha, 0.25f, 0.75f)) @@ -3768,6 +3772,30 @@ void GCodeViewer::render_new_toolpaths() #endif // !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS } + ImGui::Separator(); + if (ImGui::BeginTable("Radii", 2)) { + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Travels radius"); + ImGui::TableSetColumnIndex(1); + float travels_radius = m_new_viewer.get_travels_radius(); + ImGui::SetNextItemWidth(200.0f); + if (imgui.slider_float("##TravelRadius", &travels_radius, 0.05f, 0.5f)) + m_new_viewer.set_travels_radius(travels_radius); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Wipes radius"); + ImGui::TableSetColumnIndex(1); + float wipes_radius = m_new_viewer.get_wipes_radius(); + ImGui::SetNextItemWidth(200.0f); + if (imgui.slider_float("##WipesRadius", &wipes_radius, 0.05f, 0.5f)) + m_new_viewer.set_wipes_radius(wipes_radius); + + ImGui::EndTable(); + } + imgui.end(); #endif // ENABLE_NEW_GCODE_VIEWER_DEBUG } diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp index 4a3f88ca1b..63d058e878 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp @@ -148,7 +148,7 @@ Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode) } } -GCodeInputData convert(const Slic3r::GCodeProcessorResult& result) +GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, float travels_radius, float wipes_radius) { const std::vector& moves = result.moves; GCodeInputData ret; @@ -178,19 +178,19 @@ GCodeInputData convert(const Slic3r::GCodeProcessorResult& result) { case EMoveType::Travel: { - width = Default_Travel_Radius; - height = Default_Travel_Radius; + width = travels_radius; + height = travels_radius; break; } case EMoveType::Wipe: { - width = Default_Wipe_Radius; - height = Default_Wipe_Radius; + width = wipes_radius; + height = wipes_radius; break; } default: { - width = curr.width; + width = curr.width; height = curr.height; break; } diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp index dda51410e8..58548c9fe0 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp @@ -52,7 +52,8 @@ extern ETimeMode convert(const Slic3r::PrintEstimatedStatistics::ETimeMode& mode extern Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode); // mapping from Slic3r::GCodeProcessorResult to libvgcode::GCodeInputData -extern GCodeInputData convert(const Slic3r::GCodeProcessorResult& result); +extern GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, float travels_radius = Default_Travels_Radius, + float wipes_radius = Default_Wipes_Radius); } // namespace libvgcode diff --git a/src/slic3r/GUI/LibVGCode/include/Types.hpp b/src/slic3r/GUI/LibVGCode/include/Types.hpp index ba9c150b14..d505ad604e 100644 --- a/src/slic3r/GUI/LibVGCode/include/Types.hpp +++ b/src/slic3r/GUI/LibVGCode/include/Types.hpp @@ -18,8 +18,8 @@ namespace libvgcode { static constexpr float PI = 3.141592f; -static constexpr float Default_Travel_Radius = 0.05f; -static constexpr float Default_Wipe_Radius = 0.05f; +static constexpr float Default_Travels_Radius = 0.1f; +static constexpr float Default_Wipes_Radius = 0.1f; // // Vector in 3 dimensions @@ -177,7 +177,7 @@ enum class EBBoxType : uint8_t // Predefined colors // static const Color Dummy_Color{ 64, 64, 64 }; -static const Color Wipe_Color { 255, 255, 255 }; +static const Color Wipe_Color { 255, 255, 0 }; // // Palette used to render moves by ranges diff --git a/src/slic3r/GUI/LibVGCode/include/Viewer.hpp b/src/slic3r/GUI/LibVGCode/include/Viewer.hpp index 2e17271c95..0d5fb1bdb9 100644 --- a/src/slic3r/GUI/LibVGCode/include/Viewer.hpp +++ b/src/slic3r/GUI/LibVGCode/include/Viewer.hpp @@ -155,6 +155,11 @@ public: const ColorRange& get_volumetric_rate_range() const; const ColorRange& get_layer_time_range(EColorRangeType type) const; + float get_travels_radius() const; + void set_travels_radius(float radius); + float get_wipes_radius() const; + void set_wipes_radius(float radius); + #if !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS // // Returns the position of the center of gravity of the toolpaths. diff --git a/src/slic3r/GUI/LibVGCode/src/Viewer.cpp b/src/slic3r/GUI/LibVGCode/src/Viewer.cpp index 85a1dc710f..8851bc4d7c 100644 --- a/src/slic3r/GUI/LibVGCode/src/Viewer.cpp +++ b/src/slic3r/GUI/LibVGCode/src/Viewer.cpp @@ -292,6 +292,26 @@ const ColorRange& Viewer::get_layer_time_range(EColorRangeType type) const return m_impl->get_layer_time_range(type); } +float Viewer::get_travels_radius() const +{ + return m_impl->get_travels_radius(); +} + +void Viewer::set_travels_radius(float radius) +{ + m_impl->set_travels_radius(radius); +} + +float Viewer::get_wipes_radius() const +{ + return m_impl->get_wipes_radius(); +} + +void Viewer::set_wipes_radius(float radius) +{ + m_impl->set_wipes_radius(radius); +} + #if !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS Vec3 Viewer::get_cog_position() const { diff --git a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp index 054ebfbc1c..f8e4b612cc 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.cpp @@ -989,6 +989,28 @@ const ColorRange& ViewerImpl::get_layer_time_range(EColorRangeType type) const } } +float ViewerImpl::get_travels_radius() const +{ + return m_travels_radius; +} + +void ViewerImpl::set_travels_radius(float radius) +{ + m_travels_radius = std::clamp(radius, 0.05f, 0.5f); + update_heights_widths(); +} + +float ViewerImpl::get_wipes_radius() const +{ + return m_wipes_radius; +} + +void ViewerImpl::set_wipes_radius(float radius) +{ + m_wipes_radius = std::clamp(radius, 0.05f, 0.5f); + update_heights_widths(); +} + #if !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS Vec3 ViewerImpl::get_cog_marker_position() const { @@ -1089,6 +1111,7 @@ void ViewerImpl::update_view_full_range() { const std::array& layers_range = m_layers.get_view_range(); const bool travels_visible = m_settings.options_visibility.at(EOptionType::Travels); + const bool wipes_visible = m_settings.options_visibility.at(EOptionType::Wipes); auto first_it = m_vertices.begin(); while (first_it != m_vertices.end() && @@ -1099,9 +1122,11 @@ void ViewerImpl::update_view_full_range() if (first_it == m_vertices.end()) m_view_range.set_full(Range()); else { - if (travels_visible) { - // if the global range starts with a travel move, extend it to the travel start - while (first_it != m_vertices.begin() && first_it->is_travel()) { + if (travels_visible || wipes_visible) { + // if the global range starts with a travel/wipe move, extend it to the travel/wipe start + while (first_it != m_vertices.begin() && + ((travels_visible && first_it->is_travel()) || + (wipes_visible && first_it->is_wipe()))) { --first_it; } } @@ -1130,11 +1155,12 @@ void ViewerImpl::update_view_full_range() if (reduced && rev_last_it != m_vertices.rend()) last_it = rev_last_it.base() - 1; - if (travels_visible) { - // if the global range ends with a travel move, extend it to the travel end + if (travels_visible || wipes_visible) { + // if the global range ends with a travel/wipe move, extend it to the travel/wipe end while (last_it != m_vertices.end() && last_it + 1 != m_vertices.end() && - last_it->is_travel() && (last_it + 1)->is_travel()) { - ++last_it; + ((travels_visible && last_it->is_travel() && (last_it + 1)->is_travel()) || + (wipes_visible && last_it->is_wipe() && (last_it + 1)->is_wipe()))) { + ++last_it; } } @@ -1197,6 +1223,31 @@ void ViewerImpl::update_color_ranges() } } +void ViewerImpl::update_heights_widths() +{ + if (m_heights_widths_angles_buf_id == 0) + return; + + glsafe(glBindBuffer(GL_TEXTURE_BUFFER, m_heights_widths_angles_buf_id)); + Vec3* buffer = static_cast(glMapBuffer(GL_TEXTURE_BUFFER, GL_WRITE_ONLY)); + glcheck(); + + for (size_t i = 0; i < m_vertices.size(); ++i) { + const PathVertex& v = m_vertices[i]; + if (v.is_travel()) { + buffer[i][0] = m_travels_radius; + buffer[i][1] = m_travels_radius; + } + else if (v.is_wipe()) { + buffer[i][0] = m_wipes_radius; + buffer[i][1] = m_wipes_radius; + } + } + + glsafe(glUnmapBuffer(GL_TEXTURE_BUFFER)); + glsafe(glBindBuffer(GL_TEXTURE_BUFFER, 0)); +} + Color ViewerImpl::select_color(const PathVertex& v) const { if (v.type == EMoveType::Noop) diff --git a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp index 4721b06b9b..6ebb9df4d2 100644 --- a/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp +++ b/src/slic3r/GUI/LibVGCode/src/ViewerImpl.hpp @@ -138,6 +138,11 @@ public: const ColorRange& get_volumetric_rate_range() const; const ColorRange& get_layer_time_range(EColorRangeType type) const; + float get_travels_radius() const; + void set_travels_radius(float radius); + float get_wipes_radius() const; + void set_wipes_radius(float radius); + #if !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS Vec3 get_cog_marker_position() const; @@ -170,6 +175,8 @@ private: ExtrusionRoles m_extrusion_roles; std::array m_travels_time{ 0.0f, 0.0f }; std::vector m_used_extruders_ids; + float m_travels_radius{ Default_Travels_Radius }; + float m_wipes_radius{ Default_Wipes_Radius }; bool m_initialized{ false }; bool m_loading{ false }; @@ -302,6 +309,7 @@ private: void update_view_full_range(); void update_color_ranges(); + void update_heights_widths(); Color select_color(const PathVertex& v) const; void render_segments(const Mat4x4& view_matrix, const Mat4x4& projection_matrix, const Vec3& camera_position); void render_options(const Mat4x4& view_matrix, const Mat4x4& projection_matrix);