diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 623a2ae3b..38adce332 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -80,6 +80,8 @@ namespace Slic3r { float mm3_per_mm{ 0.0f }; float fan_speed{ 0.0f }; // percentage + float volumetric_rate() const { return feedrate * mm3_per_mm; } + std::string to_string() const { std::string str = std::to_string((int)type); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 4cffb39bd..e02a80993 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -31,7 +31,10 @@ void GCodeViewer::VBuffer::reset() { // release gpu memory if (vbo_id > 0) + { glsafe(::glDeleteBuffers(1, &vbo_id)); + vbo_id = 0; + } vertices_count = 0; } @@ -40,7 +43,10 @@ void GCodeViewer::IBuffer::reset() { // release gpu memory if (ibo_id > 0) + { glsafe(::glDeleteBuffers(1, &ibo_id)); + ibo_id = 0; + } // release cpu memory data = std::vector<unsigned int>(); @@ -62,7 +68,7 @@ bool GCodeViewer::IBuffer::init_shader(const std::string& vertex_shader_src, con void GCodeViewer::IBuffer::add_path(const GCodeProcessor::MoveVertex& move) { unsigned int id = static_cast<unsigned int>(data.size()); - paths.push_back({ move.type, move.extrusion_role, id, id, move.height, move.width, move.feedrate, move.fan_speed }); + paths.push_back({ move.type, move.extrusion_role, id, id, move.height, move.width, move.feedrate, move.fan_speed, move.volumetric_rate() }); } std::array<float, 3> GCodeViewer::Extrusions::Range::get_color_at(float value, const std::array<std::array<float, 3>, Default_Range_Colors_Count>& colors) const @@ -160,6 +166,7 @@ void GCodeViewer::refresh_toolpaths_ranges(const GCodeProcessor::Result& gcode_r m_extrusions.ranges.width.update_from(curr.width); m_extrusions.ranges.feedrate.update_from(curr.feedrate); m_extrusions.ranges.fan_speed.update_from(curr.fan_speed); + m_extrusions.ranges.volumetric_rate.update_from(curr.volumetric_rate()); } break; } @@ -216,48 +223,21 @@ bool GCodeViewer::init_shaders() for (unsigned char i = begin_id; i < end_id; ++i) { + std::string vertex_shader; + std::string fragment_shader; + switch (buffer_type(i)) { - case GCodeProcessor::EMoveType::Tool_change: - { - if (!m_buffers[i].init_shader("toolchanges.vs", "toolchanges.fs")) - return false; + case GCodeProcessor::EMoveType::Tool_change: { vertex_shader = "toolchanges.vs"; fragment_shader = "toolchanges.fs"; break; } + case GCodeProcessor::EMoveType::Retract: { vertex_shader = "retractions.vs"; fragment_shader = "retractions.fs"; break; } + case GCodeProcessor::EMoveType::Unretract: { vertex_shader = "unretractions.vs"; fragment_shader = "unretractions.fs"; break; } + case GCodeProcessor::EMoveType::Extrude: { vertex_shader = "extrusions.vs"; fragment_shader = "extrusions.fs"; break; } + case GCodeProcessor::EMoveType::Travel: { vertex_shader = "travels.vs"; fragment_shader = "travels.fs"; break; } + default: { break; } + } - break; - } - case GCodeProcessor::EMoveType::Retract: - { - if (!m_buffers[i].init_shader("retractions.vs", "retractions.fs")) - return false; - - break; - } - case GCodeProcessor::EMoveType::Unretract: - { - if (!m_buffers[i].init_shader("unretractions.vs", "unretractions.fs")) - return false; - - break; - } - case GCodeProcessor::EMoveType::Extrude: - { - if (!m_buffers[i].init_shader("extrusions.vs", "extrusions.fs")) - return false; - - break; - } - case GCodeProcessor::EMoveType::Travel: - { - if (!m_buffers[i].init_shader("travels.vs", "travels.fs")) - return false; - - break; - } - default: - { - break; - } - } + if (vertex_shader.empty() || fragment_shader.empty() || !m_buffers[i].init_shader(vertex_shader, fragment_shader)) + return false; } if (!m_shells.shader.init("shells.vs", "shells.fs")) @@ -449,7 +429,7 @@ void GCodeViewer::render_toolpaths() const case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width, m_extrusions.ranges.colors); break; } case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate, m_extrusions.ranges.colors); break; } case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed, m_extrusions.ranges.colors); break; } - case EViewType::VolumetricRate: + case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate, m_extrusions.ranges.colors); break; } case EViewType::Tool: case EViewType::ColorPrint: default: { color = { 1.0f, 1.0f, 1.0f }; break; } @@ -654,11 +634,11 @@ void GCodeViewer::render_overlay() const } break; } - case EViewType::Height: { add_range(m_extrusions.ranges.height, 3); break; } - case EViewType::Width: { add_range(m_extrusions.ranges.width, 3); break; } - case EViewType::Feedrate: { add_range(m_extrusions.ranges.feedrate, 1); break; } - case EViewType::FanSpeed: { add_range(m_extrusions.ranges.fan_speed, 0); break; } - case EViewType::VolumetricRate: { break; } + case EViewType::Height: { add_range(m_extrusions.ranges.height, 3); break; } + case EViewType::Width: { add_range(m_extrusions.ranges.width, 3); break; } + case EViewType::Feedrate: { add_range(m_extrusions.ranges.feedrate, 1); break; } + case EViewType::FanSpeed: { add_range(m_extrusions.ranges.fan_speed, 0); break; } + case EViewType::VolumetricRate: { add_range(m_extrusions.ranges.volumetric_rate, 3); break; } case EViewType::Tool: { break; } case EViewType::ColorPrint: { break; } } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 644f08842..6f27c6852 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -44,9 +44,11 @@ class GCodeViewer float width{ 0.0f }; float feedrate{ 0.0f }; float fan_speed{ 0.0f }; + float volumetric_rate{ 0.0f }; bool matches(const GCodeProcessor::MoveVertex& move) const { - return type == move.type && role == move.extrusion_role && height == move.height && width == move.width && feedrate == move.feedrate && fan_speed == move.fan_speed; + return type == move.type && role == move.extrusion_role && height == move.height && width == move.width && + feedrate == move.feedrate && fan_speed == move.fan_speed && volumetric_rate == move.volumetric_rate(); } }; @@ -82,17 +84,8 @@ class GCodeViewer Range() { reset(); } - void update_from(const float value) - { - min = std::min(min, value); - max = std::max(max, value); - } - - void reset() - { - min = FLT_MAX; - max = -FLT_MAX; - } + void update_from(const float value) { min = std::min(min, value); max = std::max(max, value); } + void reset() { min = FLT_MAX; max = -FLT_MAX; } float step_size() const { return (max - min) / (static_cast<float>(Default_Range_Colors_Count) - 1.0f); } std::array<float, 3> get_color_at(float value, const std::array<std::array<float, 3>, Default_Range_Colors_Count>& colors) const; @@ -110,14 +103,15 @@ class GCodeViewer Range feedrate; // Color mapping by fan speed. Range fan_speed; -// // Color mapping by volumetric extrusion rate. -// Range volumetric_rate; + // Color mapping by volumetric extrusion rate. + Range volumetric_rate; void reset() { height.reset(); width.reset(); feedrate.reset(); fan_speed.reset(); + volumetric_rate.reset(); } };