diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp index d31afd36b0..8c1f26e23d 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.cpp @@ -5,4 +5,230 @@ #include "libslic3r/libslic3r.h" #include "LibVGCodeWrapper.hpp" +namespace libvgcode { +Vec3 convert(const Slic3r::Vec3f& v) +{ + return { v.x(), v.y(), v.z() }; +} + +Slic3r::Vec3f convert(const Vec3& v) +{ + return { v[0], v[1], v[2] }; +} + +Mat4x4 convert(const Slic3r::Matrix4f& m) +{ + Mat4x4 ret; + std::memcpy(ret.data(), m.data(), 16 * sizeof(float)); + return ret; +} + +Slic3r::ColorRGBA convert(const Color& c) +{ + static const float inv_255 = 1.0f / 255.0f; + return { c[0] * inv_255, c[1] * inv_255, c[2] * inv_255, 1.0f }; +} + +Color convert(const Slic3r::ColorRGBA& c) +{ + return { static_cast(c.r() * 255.0f), static_cast(c.g() * 255.0f), static_cast(c.b() * 255.0f) }; +} + +Slic3r::GCodeExtrusionRole convert(EGCodeExtrusionRole role) +{ + switch (role) + { + case EGCodeExtrusionRole::None: { return Slic3r::GCodeExtrusionRole::None; } + case EGCodeExtrusionRole::Perimeter: { return Slic3r::GCodeExtrusionRole::Perimeter; } + case EGCodeExtrusionRole::ExternalPerimeter: { return Slic3r::GCodeExtrusionRole::ExternalPerimeter; } + case EGCodeExtrusionRole::OverhangPerimeter: { return Slic3r::GCodeExtrusionRole::OverhangPerimeter; } + case EGCodeExtrusionRole::InternalInfill: { return Slic3r::GCodeExtrusionRole::InternalInfill; } + case EGCodeExtrusionRole::SolidInfill: { return Slic3r::GCodeExtrusionRole::SolidInfill; } + case EGCodeExtrusionRole::TopSolidInfill: { return Slic3r::GCodeExtrusionRole::TopSolidInfill; } + case EGCodeExtrusionRole::Ironing: { return Slic3r::GCodeExtrusionRole::Ironing; } + case EGCodeExtrusionRole::BridgeInfill: { return Slic3r::GCodeExtrusionRole::BridgeInfill; } + case EGCodeExtrusionRole::GapFill: { return Slic3r::GCodeExtrusionRole::GapFill; } + case EGCodeExtrusionRole::Skirt: { return Slic3r::GCodeExtrusionRole::Skirt; } + case EGCodeExtrusionRole::SupportMaterial: { return Slic3r::GCodeExtrusionRole::SupportMaterial; } + case EGCodeExtrusionRole::SupportMaterialInterface: { return Slic3r::GCodeExtrusionRole::SupportMaterialInterface; } + case EGCodeExtrusionRole::WipeTower: { return Slic3r::GCodeExtrusionRole::WipeTower; } + case EGCodeExtrusionRole::Custom: { return Slic3r::GCodeExtrusionRole::Custom; } + default: { return Slic3r::GCodeExtrusionRole::None; } + } +} + +EGCodeExtrusionRole convert(Slic3r::GCodeExtrusionRole role) +{ + switch (role) + { + case Slic3r::GCodeExtrusionRole::None: { return EGCodeExtrusionRole::None; } + case Slic3r::GCodeExtrusionRole::Perimeter: { return EGCodeExtrusionRole::Perimeter; } + case Slic3r::GCodeExtrusionRole::ExternalPerimeter: { return EGCodeExtrusionRole::ExternalPerimeter; } + case Slic3r::GCodeExtrusionRole::OverhangPerimeter: { return EGCodeExtrusionRole::OverhangPerimeter; } + case Slic3r::GCodeExtrusionRole::InternalInfill: { return EGCodeExtrusionRole::InternalInfill; } + case Slic3r::GCodeExtrusionRole::SolidInfill: { return EGCodeExtrusionRole::SolidInfill; } + case Slic3r::GCodeExtrusionRole::TopSolidInfill: { return EGCodeExtrusionRole::TopSolidInfill; } + case Slic3r::GCodeExtrusionRole::Ironing: { return EGCodeExtrusionRole::Ironing; } + case Slic3r::GCodeExtrusionRole::BridgeInfill: { return EGCodeExtrusionRole::BridgeInfill; } + case Slic3r::GCodeExtrusionRole::GapFill: { return EGCodeExtrusionRole::GapFill; } + case Slic3r::GCodeExtrusionRole::Skirt: { return EGCodeExtrusionRole::Skirt; } + case Slic3r::GCodeExtrusionRole::SupportMaterial: { return EGCodeExtrusionRole::SupportMaterial; } + case Slic3r::GCodeExtrusionRole::SupportMaterialInterface: { return EGCodeExtrusionRole::SupportMaterialInterface; } + case Slic3r::GCodeExtrusionRole::WipeTower: { return EGCodeExtrusionRole::WipeTower; } + case Slic3r::GCodeExtrusionRole::Custom: { return EGCodeExtrusionRole::Custom; } + default: { return EGCodeExtrusionRole::None; } + } +} + +EMoveType convert(Slic3r::EMoveType type) +{ + switch (type) + { + case Slic3r::EMoveType::Noop: { return EMoveType::Noop; } + case Slic3r::EMoveType::Retract: { return EMoveType::Retract; } + case Slic3r::EMoveType::Unretract: { return EMoveType::Unretract; } + case Slic3r::EMoveType::Seam: { return EMoveType::Seam; } + case Slic3r::EMoveType::Tool_change: { return EMoveType::ToolChange; } + case Slic3r::EMoveType::Color_change: { return EMoveType::ColorChange; } + case Slic3r::EMoveType::Pause_Print: { return EMoveType::PausePrint; } + case Slic3r::EMoveType::Custom_GCode: { return EMoveType::CustomGCode; } + case Slic3r::EMoveType::Travel: { return EMoveType::Travel; } + case Slic3r::EMoveType::Wipe: { return EMoveType::Wipe; } + case Slic3r::EMoveType::Extrude: { return EMoveType::Extrude; } + default: { return EMoveType::COUNT; } + } +} + +EOptionType convert(const Slic3r::GUI::Preview::OptionType& type) +{ + switch (type) + { + case Slic3r::GUI::Preview::OptionType::Travel: { return EOptionType::Travels; } + case Slic3r::GUI::Preview::OptionType::Wipe: { return EOptionType::Wipes; } + case Slic3r::GUI::Preview::OptionType::Retractions: { return EOptionType::Retractions; } + case Slic3r::GUI::Preview::OptionType::Unretractions: { return EOptionType::Unretractions; } + case Slic3r::GUI::Preview::OptionType::Seams: { return EOptionType::Seams; } + case Slic3r::GUI::Preview::OptionType::ToolChanges: { return EOptionType::ToolChanges; } + case Slic3r::GUI::Preview::OptionType::ColorChanges: { return EOptionType::ColorChanges; } + case Slic3r::GUI::Preview::OptionType::PausePrints: { return EOptionType::PausePrints; } + case Slic3r::GUI::Preview::OptionType::CustomGCodes: { return EOptionType::CustomGCodes; } +#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + case Slic3r::GUI::Preview::OptionType::CenterOfGravity: { return EOptionType::COUNT; } + case Slic3r::GUI::Preview::OptionType::ToolMarker: { return EOptionType::COUNT; } +#else + case Slic3r::GUI::Preview::OptionType::CenterOfGravity: { return EOptionType::CenterOfGravity; } + case Slic3r::GUI::Preview::OptionType::ToolMarker: { return EOptionType::ToolMarker; } +#endif // !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + default: { return EOptionType::COUNT; } + } +} + +ETimeMode convert(const Slic3r::PrintEstimatedStatistics::ETimeMode& mode) +{ + switch (mode) + { + case Slic3r::PrintEstimatedStatistics::ETimeMode::Normal: { return ETimeMode::Normal; } + case Slic3r::PrintEstimatedStatistics::ETimeMode::Stealth: { return ETimeMode::Stealth; } + default: { return ETimeMode::COUNT; } + } +} + +Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode) +{ + switch (mode) + { + case ETimeMode::Normal: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Normal; } + case ETimeMode::Stealth: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Stealth; } + default: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Count; } + } +} + +GCodeInputData convert(const Slic3r::GCodeProcessorResult& result) +{ + const std::vector& moves = result.moves; + GCodeInputData ret; + ret.vertices.reserve(2 * moves.size()); + for (size_t i = 1; i < moves.size(); ++i) { + const Slic3r::GCodeProcessorResult::MoveVertex& curr = moves[i]; + const Slic3r::GCodeProcessorResult::MoveVertex& prev = moves[i - 1]; + const EMoveType curr_type = convert(curr.type); + + EGCodeExtrusionRole extrusion_role; + if (curr_type == EMoveType::Travel) { + // for travel moves set the extrusion role + // which will be used later to select the proper color + if (curr.delta_extruder == 0.0f) + extrusion_role = static_cast(0); // Move + else if (curr.delta_extruder > 0.0f) + extrusion_role = static_cast(1); // Extrude + else + extrusion_role = static_cast(2); // Retract + } + else + extrusion_role = convert(curr.extrusion_role); + + float width; + float height; + switch (curr_type) + { + case EMoveType::Travel: + { + width = Default_Travel_Radius; + height = Default_Travel_Radius; + break; + } + case EMoveType::Wipe: + { + width = Default_Wipe_Radius; + height = Default_Wipe_Radius; + break; + } + default: + { + width = curr.width; + height = curr.height; + break; + } + } + + if (type_to_option(curr_type) == libvgcode::EOptionType::COUNT) { + if (ret.vertices.empty() || prev.type != curr.type || prev.extrusion_role != curr.extrusion_role) { + // to allow libvgcode to properly detect the start/end of a path we need to add a 'phantom' vertex + // equal to the current one with the exception of the position, which should match the previous move position, + // and the times, which are set to zero +#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, curr.fan_speed, + curr.temperature, curr.volumetric_rate(), extrusion_role, curr_type, + static_cast(curr.gcode_id), static_cast(curr.layer_id), + static_cast(curr.extruder_id), static_cast(curr.cp_color_id), { 0.0f, 0.0f } }; +#else + const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, curr.fan_speed, + curr.temperature, curr.volumetric_rate(), 0.0f, extrusion_role, curr_type, + static_cast(curr.gcode_id), static_cast(curr.layer_id), + static_cast(curr.extruder_id), static_cast(curr.cp_color_id), { 0.0f, 0.0f } }; +#endif // ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + ret.vertices.emplace_back(vertex); + } + } + +#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.fan_speed, + curr.temperature, curr.volumetric_rate(), extrusion_role, curr_type, static_cast(curr.gcode_id), + static_cast(curr.layer_id), static_cast(curr.extruder_id), static_cast(curr.cp_color_id), curr.time }; +#else + const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.fan_speed, + curr.temperature, curr.volumetric_rate(), curr.mm3_per_mm * (curr.position - prev.position).norm(), + extrusion_role, curr_type, static_cast(curr.gcode_id), static_cast(curr.layer_id), + static_cast(curr.extruder_id), static_cast(curr.cp_color_id), curr.time }; +#endif // ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS + ret.vertices.emplace_back(vertex); + } + ret.vertices.shrink_to_fit(); + + ret.extruders_count = static_cast(result.extruders_count); + + return ret; +} + +} // namespace libvgcode diff --git a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp index 248cd9fa6c..dda51410e8 100644 --- a/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp +++ b/src/slic3r/GUI/LibVGCode/LibVGCodeWrapper.hpp @@ -19,240 +19,40 @@ namespace libvgcode { // mapping from Slic3r::Vec3f to libvgcode::Vec3 -static Vec3 convert(const Slic3r::Vec3f& v) -{ - return { v.x(), v.y(), v.z() }; -} +extern Vec3 convert(const Slic3r::Vec3f& v); // mapping from libvgcode::Vec3 to Slic3r::Vec3f -static Slic3r::Vec3f convert(const Vec3& v) -{ - return { v[0], v[1], v[2] }; -} +extern Slic3r::Vec3f convert(const Vec3& v); // mapping from Slic3r::Matrix4f to libvgcode::Mat4x4 -static Mat4x4 convert(const Slic3r::Matrix4f& m) -{ - Mat4x4 ret; - std::memcpy(ret.data(), m.data(), 16 * sizeof(float)); - return ret; -} +extern Mat4x4 convert(const Slic3r::Matrix4f& m); // mapping from libvgcode::Color to Slic3r::ColorRGBA -static Slic3r::ColorRGBA convert(const Color& c) -{ - static const float inv_255 = 1.0f / 255.0f; - return { c[0] * inv_255, c[1] * inv_255, c[2] * inv_255, 1.0f }; -} +extern Slic3r::ColorRGBA convert(const Color& c); // mapping from Slic3r::ColorRGBA to libvgcode::Color -static Color convert(const Slic3r::ColorRGBA& c) -{ - return { static_cast(c.r() * 255.0f), static_cast(c.g() * 255.0f), static_cast(c.b() * 255.0f) }; -} +extern Color convert(const Slic3r::ColorRGBA& c); // mapping from libvgcode::EGCodeExtrusionRole to Slic3r::GCodeExtrusionRole -static Slic3r::GCodeExtrusionRole convert(EGCodeExtrusionRole role) -{ - switch (role) - { - case EGCodeExtrusionRole::None: { return Slic3r::GCodeExtrusionRole::None; } - case EGCodeExtrusionRole::Perimeter: { return Slic3r::GCodeExtrusionRole::Perimeter; } - case EGCodeExtrusionRole::ExternalPerimeter: { return Slic3r::GCodeExtrusionRole::ExternalPerimeter; } - case EGCodeExtrusionRole::OverhangPerimeter: { return Slic3r::GCodeExtrusionRole::OverhangPerimeter; } - case EGCodeExtrusionRole::InternalInfill: { return Slic3r::GCodeExtrusionRole::InternalInfill; } - case EGCodeExtrusionRole::SolidInfill: { return Slic3r::GCodeExtrusionRole::SolidInfill; } - case EGCodeExtrusionRole::TopSolidInfill: { return Slic3r::GCodeExtrusionRole::TopSolidInfill; } - case EGCodeExtrusionRole::Ironing: { return Slic3r::GCodeExtrusionRole::Ironing; } - case EGCodeExtrusionRole::BridgeInfill: { return Slic3r::GCodeExtrusionRole::BridgeInfill; } - case EGCodeExtrusionRole::GapFill: { return Slic3r::GCodeExtrusionRole::GapFill; } - case EGCodeExtrusionRole::Skirt: { return Slic3r::GCodeExtrusionRole::Skirt; } - case EGCodeExtrusionRole::SupportMaterial: { return Slic3r::GCodeExtrusionRole::SupportMaterial; } - case EGCodeExtrusionRole::SupportMaterialInterface: { return Slic3r::GCodeExtrusionRole::SupportMaterialInterface; } - case EGCodeExtrusionRole::WipeTower: { return Slic3r::GCodeExtrusionRole::WipeTower; } - case EGCodeExtrusionRole::Custom: { return Slic3r::GCodeExtrusionRole::Custom; } - default: { return Slic3r::GCodeExtrusionRole::None; } - } -} +extern Slic3r::GCodeExtrusionRole convert(EGCodeExtrusionRole role); // mapping from Slic3r::GCodeExtrusionRole to libvgcode::EGCodeExtrusionRole -static EGCodeExtrusionRole convert(Slic3r::GCodeExtrusionRole role) -{ - switch (role) - { - case Slic3r::GCodeExtrusionRole::None: { return EGCodeExtrusionRole::None; } - case Slic3r::GCodeExtrusionRole::Perimeter: { return EGCodeExtrusionRole::Perimeter; } - case Slic3r::GCodeExtrusionRole::ExternalPerimeter: { return EGCodeExtrusionRole::ExternalPerimeter; } - case Slic3r::GCodeExtrusionRole::OverhangPerimeter: { return EGCodeExtrusionRole::OverhangPerimeter; } - case Slic3r::GCodeExtrusionRole::InternalInfill: { return EGCodeExtrusionRole::InternalInfill; } - case Slic3r::GCodeExtrusionRole::SolidInfill: { return EGCodeExtrusionRole::SolidInfill; } - case Slic3r::GCodeExtrusionRole::TopSolidInfill: { return EGCodeExtrusionRole::TopSolidInfill; } - case Slic3r::GCodeExtrusionRole::Ironing: { return EGCodeExtrusionRole::Ironing; } - case Slic3r::GCodeExtrusionRole::BridgeInfill: { return EGCodeExtrusionRole::BridgeInfill; } - case Slic3r::GCodeExtrusionRole::GapFill: { return EGCodeExtrusionRole::GapFill; } - case Slic3r::GCodeExtrusionRole::Skirt: { return EGCodeExtrusionRole::Skirt; } - case Slic3r::GCodeExtrusionRole::SupportMaterial: { return EGCodeExtrusionRole::SupportMaterial; } - case Slic3r::GCodeExtrusionRole::SupportMaterialInterface: { return EGCodeExtrusionRole::SupportMaterialInterface; } - case Slic3r::GCodeExtrusionRole::WipeTower: { return EGCodeExtrusionRole::WipeTower; } - case Slic3r::GCodeExtrusionRole::Custom: { return EGCodeExtrusionRole::Custom; } - default: { return EGCodeExtrusionRole::None; } - } -} +extern EGCodeExtrusionRole convert(Slic3r::GCodeExtrusionRole role); // mapping from Slic3r::EMoveType to libvgcode::EMoveType -static EMoveType convert(Slic3r::EMoveType type) -{ - switch (type) - { - case Slic3r::EMoveType::Noop: { return EMoveType::Noop; } - case Slic3r::EMoveType::Retract: { return EMoveType::Retract; } - case Slic3r::EMoveType::Unretract: { return EMoveType::Unretract; } - case Slic3r::EMoveType::Seam: { return EMoveType::Seam; } - case Slic3r::EMoveType::Tool_change: { return EMoveType::ToolChange; } - case Slic3r::EMoveType::Color_change: { return EMoveType::ColorChange; } - case Slic3r::EMoveType::Pause_Print: { return EMoveType::PausePrint; } - case Slic3r::EMoveType::Custom_GCode: { return EMoveType::CustomGCode; } - case Slic3r::EMoveType::Travel: { return EMoveType::Travel; } - case Slic3r::EMoveType::Wipe: { return EMoveType::Wipe; } - case Slic3r::EMoveType::Extrude: { return EMoveType::Extrude; } - default: { return EMoveType::COUNT; } - } -} +extern EMoveType convert(Slic3r::EMoveType type); // mapping from Slic3r::GUI::Preview::OptionType to libvgcode::EOptionType -static EOptionType convert(const Slic3r::GUI::Preview::OptionType& type) -{ - switch (type) - { - case Slic3r::GUI::Preview::OptionType::Travel: { return EOptionType::Travels; } - case Slic3r::GUI::Preview::OptionType::Wipe: { return EOptionType::Wipes; } - case Slic3r::GUI::Preview::OptionType::Retractions: { return EOptionType::Retractions; } - case Slic3r::GUI::Preview::OptionType::Unretractions: { return EOptionType::Unretractions; } - case Slic3r::GUI::Preview::OptionType::Seams: { return EOptionType::Seams; } - case Slic3r::GUI::Preview::OptionType::ToolChanges: { return EOptionType::ToolChanges; } - case Slic3r::GUI::Preview::OptionType::ColorChanges: { return EOptionType::ColorChanges; } - case Slic3r::GUI::Preview::OptionType::PausePrints: { return EOptionType::PausePrints; } - case Slic3r::GUI::Preview::OptionType::CustomGCodes: { return EOptionType::CustomGCodes; } -#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - case Slic3r::GUI::Preview::OptionType::CenterOfGravity: { return EOptionType::COUNT; } - case Slic3r::GUI::Preview::OptionType::ToolMarker: { return EOptionType::COUNT; } -#else - case Slic3r::GUI::Preview::OptionType::CenterOfGravity: { return EOptionType::CenterOfGravity; } - case Slic3r::GUI::Preview::OptionType::ToolMarker: { return EOptionType::ToolMarker; } -#endif // !ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - default: { return EOptionType::COUNT; } - } -} +extern EOptionType convert(const Slic3r::GUI::Preview::OptionType& type); // mapping from Slic3r::PrintEstimatedStatistics::ETimeMode to libvgcode::ETimeMode -static ETimeMode convert(const Slic3r::PrintEstimatedStatistics::ETimeMode& mode) -{ - switch (mode) - { - case Slic3r::PrintEstimatedStatistics::ETimeMode::Normal: { return ETimeMode::Normal; } - case Slic3r::PrintEstimatedStatistics::ETimeMode::Stealth: { return ETimeMode::Stealth; } - default: { return ETimeMode::COUNT; } - } -} +extern ETimeMode convert(const Slic3r::PrintEstimatedStatistics::ETimeMode& mode); // mapping from libvgcode::ETimeMode to Slic3r::PrintEstimatedStatistics::ETimeMode -static Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode) -{ - switch (mode) - { - case ETimeMode::Normal: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Normal; } - case ETimeMode::Stealth: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Stealth; } - default: { return Slic3r::PrintEstimatedStatistics::ETimeMode::Count; } - } -} +extern Slic3r::PrintEstimatedStatistics::ETimeMode convert(const ETimeMode& mode); // mapping from Slic3r::GCodeProcessorResult to libvgcode::GCodeInputData -static GCodeInputData convert(const Slic3r::GCodeProcessorResult& result) -{ - const std::vector& moves = result.moves; - GCodeInputData ret; - ret.vertices.reserve(2 * moves.size()); - for (size_t i = 1; i < moves.size(); ++i) { - const Slic3r::GCodeProcessorResult::MoveVertex& curr = moves[i]; - const Slic3r::GCodeProcessorResult::MoveVertex& prev = moves[i - 1]; - const EMoveType curr_type = convert(curr.type); - - EGCodeExtrusionRole extrusion_role; - if (curr_type == EMoveType::Travel) { - // for travel moves set the extrusion role - // which will be used later to select the proper color - if (curr.delta_extruder == 0.0f) - extrusion_role = static_cast(0); // Move - else if (curr.delta_extruder > 0.0f) - extrusion_role = static_cast(1); // Extrude - else - extrusion_role = static_cast(2); // Retract - } - else - extrusion_role = convert(curr.extrusion_role); - - float width; - float height; - switch (curr_type) - { - case EMoveType::Travel: - { - width = Default_Travel_Radius; - height = Default_Travel_Radius; - break; - } - case EMoveType::Wipe: - { - width = Default_Wipe_Radius; - height = Default_Wipe_Radius; - break; - } - default: - { - width = curr.width; - height = curr.height; - break; - } - } - - if (type_to_option(curr_type) == libvgcode::EOptionType::COUNT) { - if (ret.vertices.empty() || prev.type != curr.type || prev.extrusion_role != curr.extrusion_role) { - // to allow libvgcode to properly detect the start/end of a path we need to add a 'phantom' vertex - // equal to the current one with the exception of the position, which should match the previous move position, - // and the times, which are set to zero -#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, curr.fan_speed, - curr.temperature, curr.volumetric_rate(), extrusion_role, curr_type, - static_cast(curr.gcode_id), static_cast(curr.layer_id), - static_cast(curr.extruder_id), static_cast(curr.cp_color_id), { 0.0f, 0.0f } }; -#else - const libvgcode::PathVertex vertex = { convert(prev.position), height, width, curr.feedrate, curr.fan_speed, - curr.temperature, curr.volumetric_rate(), 0.0f, extrusion_role, curr_type, - static_cast(curr.gcode_id), static_cast(curr.layer_id), - static_cast(curr.extruder_id), static_cast(curr.cp_color_id), { 0.0f, 0.0f } }; -#endif // ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - ret.vertices.emplace_back(vertex); - } - } - -#if ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.fan_speed, - curr.temperature, curr.volumetric_rate(), extrusion_role, curr_type, static_cast(curr.gcode_id), - static_cast(curr.layer_id), static_cast(curr.extruder_id), static_cast(curr.cp_color_id), curr.time }; -#else - const libvgcode::PathVertex vertex = { convert(curr.position), height, width, curr.feedrate, curr.fan_speed, - curr.temperature, curr.volumetric_rate(), curr.mm3_per_mm * (curr.position - prev.position).norm(), - extrusion_role, curr_type, static_cast(curr.gcode_id), static_cast(curr.layer_id), - static_cast(curr.extruder_id), static_cast(curr.cp_color_id), curr.time }; -#endif // ENABLE_NEW_GCODE_VIEWER_NO_COG_AND_TOOL_MARKERS - ret.vertices.emplace_back(vertex); - } - ret.vertices.shrink_to_fit(); - - ret.extruders_count = static_cast(result.extruders_count); - - return ret; -} +extern GCodeInputData convert(const Slic3r::GCodeProcessorResult& result); } // namespace libvgcode