From acd225cee288f00a7c5f31ab545a49316bec5b66 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 11 Jan 2022 09:09:09 +0100 Subject: [PATCH 001/149] Techs ENABLE_NEW_CAMERA_MOVEMENTS_XXXX - 1st installment - Modified camera manipulation and selection by mouse --- src/libslic3r/Technologies.hpp | 4 + src/slic3r/GUI/GLCanvas3D.cpp | 127 +++++++++++++++---- src/slic3r/GUI/GLSelectionRectangle.cpp | 12 +- src/slic3r/GUI/GLSelectionRectangle.hpp | 22 ++-- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 +- 6 files changed, 126 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 8f372e7c58..957a060eda 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -65,6 +65,10 @@ // Enable detection of layers for spiral vase prints #define ENABLE_SPIRAL_VASE_LAYERS (1 && ENABLE_2_4_1_RC) +// Enable modified camera control and selection using mouse +#define ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE (1 && ENABLE_2_4_1_RC) +#define ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE (1 && ENABLE_2_4_1_RC) +#define ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION (1 && ENABLE_2_4_1_RC) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6d5bc3eb42..7a8c13e5d8 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1460,7 +1460,11 @@ void GLCanvas3D::render() wxGetApp().imgui()->new_frame(); if (m_picking_enabled) { +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (m_rectangle_selection.is_dragging() && !m_rectangle_selection.is_empty()) +#else if (m_rectangle_selection.is_dragging()) +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION // picking pass using rectangle selection _rectangular_selection_picking_pass(); else if (!m_volumes.empty()) @@ -2635,8 +2639,13 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); m_mouse.ignore_left_up = true; +#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_dirty = true; +#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION } +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + m_dirty = true; +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION // set_cursor(Standard); } else if (keyCode == WXK_ALT) { @@ -2680,15 +2689,16 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (keyCode == WXK_SHIFT) { translationProcessor.process(evt); - if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) - { + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; // set_cursor(Cross); } +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + m_dirty = true; +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION } else if (keyCode == WXK_ALT) { - if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) - { + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; // set_cursor(Cross); } @@ -3085,6 +3095,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.state = LayersEditing::Editing; _perform_layer_editing_action(&evt); } +#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports @@ -3094,23 +3105,52 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } +#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION else { +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { + if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports + && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports + && m_gizmos.get_current_type() != GLGizmosManager::Seam + && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { + m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); + m_dirty = true; + } + } +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + // Select volume in this 3D canvas. // Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected // during the scene manipulation. +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (m_picking_enabled && (!any_gizmo_active || !evt.ShiftDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { +#else if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION if (evt.LeftDown() && !m_hover_volume_idxs.empty()) { int volume_idx = get_first_hover_volume_idx(); bool already_selected = m_selection.contains_volume(volume_idx); +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + bool shift_down = evt.ShiftDown(); +#else bool ctrl_down = evt.CmdDown(); +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (already_selected && shift_down) +#else if (already_selected && ctrl_down) +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_selection.remove(volume_idx); else { +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + m_selection.add(volume_idx, !shift_down, true); +#else m_selection.add(volume_idx, !ctrl_down, true); +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_mouse.drag.move_requires_threshold = !already_selected; if (already_selected) m_mouse.set_move_start_threshold_position_2D_as_invalid(); @@ -3135,7 +3175,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!m_hover_volume_idxs.empty()) { if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) { // Only accept the initial position, if it is inside the volume bounding box. - int volume_idx = get_first_hover_volume_idx(); + const int volume_idx = get_first_hover_volume_idx(); BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box(); volume_bbox.offset(1.0); if ((!any_gizmo_active || !evt.CmdDown()) && volume_bbox.contains(m_mouse.scene_position)) { @@ -3143,6 +3183,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // The dragging operation is initiated. m_mouse.drag.move_volume_idx = volume_idx; m_selection.start_dragging(); +#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + if (!evt.CmdDown()) +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; m_moving = true; @@ -3151,31 +3194,35 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } } +#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + else if (evt.Dragging() && evt.LeftIsDown() && !evt.CmdDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { +#else else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { - if (!m_mouse.drag.move_requires_threshold) { +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + if (!m_mouse.drag.move_requires_threshold) { m_mouse.dragging = true; Vec3d cur_pos = m_mouse.drag.start_position_3D; // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag if (m_selection.contains_volume(get_first_hover_volume_idx())) { const Camera& camera = wxGetApp().plater()->get_camera(); - if (std::abs(camera.get_dir_forward()(2)) < EPSILON) { + if (std::abs(camera.get_dir_forward().z()) < EPSILON) { // side view -> move selected volumes orthogonally to camera view direction - Linef3 ray = mouse_ray(pos); - Vec3d dir = ray.unit_vector(); + const Linef3 ray = mouse_ray(pos); + const Vec3d dir = ray.unit_vector(); // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form // in our case plane normal and ray direction are the same (orthogonal view) // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = ray.a + (m_mouse.drag.start_position_3D - ray.a).dot(dir) / dir.squaredNorm() * dir; + const Vec3d inters = ray.a + (m_mouse.drag.start_position_3D - ray.a).dot(dir) / dir.squaredNorm() * dir; // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_mouse.drag.start_position_3D; + const Vec3d inters_vec = inters - m_mouse.drag.start_position_3D; - Vec3d camera_right = camera.get_dir_right(); - Vec3d camera_up = camera.get_dir_up(); + const Vec3d camera_right = camera.get_dir_right(); + const Vec3d camera_up = camera.get_dir_up(); // finds projection of the vector along the camera axes - double projection_x = inters_vec.dot(camera_right); - double projection_z = inters_vec.dot(camera_up); + const double projection_x = inters_vec.dot(camera_right); + const double projection_z = inters_vec.dot(camera_up); // apply offset cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up; @@ -3185,7 +3232,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Get new position at the same Z of the initial click point. float z0 = 0.0f; float z1 = 1.0f; - cur_pos = Linef3(_mouse_to_3d(pos, &z0), _mouse_to_3d(pos, &z1)).intersect_plane(m_mouse.drag.start_position_3D(2)); + cur_pos = Linef3(_mouse_to_3d(pos, &z0), _mouse_to_3d(pos, &z1)).intersect_plane(m_mouse.drag.start_position_3D.z()); } } @@ -3210,13 +3257,21 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } // do not process the dragging if the left mouse was set down in another canvas +#if ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE + else if (evt.LeftIsDown() || evt.MiddleIsDown()) { +#else else if (evt.LeftIsDown()) { +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE // if dragging over blank area with left button, rotate +#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + if ((any_gizmo_active || evt.CmdDown() || evt.MiddleIsDown() || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { +#else if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { - const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.); +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.0) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.0); if (wxGetApp().app_config->get("use_free_camera") == "1") // Virtual track ball (similar to the 3DConnexion mouse). - wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.)); + wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.0)); else { // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(), @@ -3229,15 +3284,20 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } - m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); + m_mouse.drag.start_position_3D = Vec3d((double)pos.x(), (double)pos.y(), 0.0); } +#if ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE + else if (evt.RightIsDown()) { + // If dragging with right button, pan. +#else else if (evt.MiddleIsDown() || evt.RightIsDown()) { // If dragging over blank area with right button, pan. +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE if (m_mouse.is_start_position_2D_defined()) { // get point in model space at Z = 0 float z = 0.0f; const Vec3d& cur_pos = _mouse_to_3d(pos, &z); - Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); + const Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); Camera& camera = wxGetApp().plater()->get_camera(); if (wxGetApp().app_config->get("use_free_camera") != "1") // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation. @@ -3254,7 +3314,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) { - if (evt.LeftUp()) + if (evt.LeftUp() && m_selection.is_dragging()) m_selection.stop_dragging(); if (m_layers_editing.state != LayersEditing::Unknown) { @@ -3313,7 +3373,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!m_mouse.dragging) { // do not post the event if the user is panning the scene // or if right click was done over the wipe tower - bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower; + const bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower; if (post_right_click_event) post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() })); } @@ -5675,9 +5735,14 @@ void GLCanvas3D::_update_volumes_hover_state() if (volume.hover != GLVolume::HS_None) continue; +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + bool deselect = volume.selected && ((shift_pressed && m_rectangle_selection.is_empty()) || (alt_pressed && !m_rectangle_selection.is_empty())); + bool select = !volume.selected && (m_rectangle_selection.is_empty() || (shift_pressed && !m_rectangle_selection.is_empty())); +#else bool deselect = volume.selected && ((ctrl_pressed && !shift_pressed) || alt_pressed); // (volume->is_modifier && !selection_modifiers_only && !is_ctrl_pressed) -> allows hovering on selected modifiers belonging to selection of type Instance bool select = (!volume.selected || (volume.is_modifier && !selection_modifiers_only && !ctrl_pressed)) && !alt_pressed; +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION if (select || deselect) { bool as_volume = @@ -6436,7 +6501,7 @@ void GLCanvas3D::_update_selection_from_hover() bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); if (m_hover_volume_idxs.empty()) { - if (!ctrl_pressed && (m_rectangle_selection.get_state() == GLSelectionRectangle::Select)) + if (!ctrl_pressed && m_rectangle_selection.get_state() == GLSelectionRectangle::EState::Select) m_selection.remove_all(); return; @@ -6453,7 +6518,10 @@ void GLCanvas3D::_update_selection_from_hover() } bool selection_changed = false; - if (state == GLSelectionRectangle::Select) { +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (!m_rectangle_selection.is_empty()) { +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (state == GLSelectionRectangle::EState::Select) { bool contains_all = true; for (int i : m_hover_volume_idxs) { if (!m_selection.contains_volume((unsigned int)i)) { @@ -6464,7 +6532,7 @@ void GLCanvas3D::_update_selection_from_hover() // the selection is going to be modified (Add) if (!contains_all) { - wxGetApp().plater()->take_snapshot(_(L("Selection-Add from rectangle")), UndoRedo::SnapshotType::Selection); + wxGetApp().plater()->take_snapshot(_L("Selection-Add from rectangle"), UndoRedo::SnapshotType::Selection); selection_changed = true; } } @@ -6479,21 +6547,24 @@ void GLCanvas3D::_update_selection_from_hover() // the selection is going to be modified (Remove) if (contains_any) { - wxGetApp().plater()->take_snapshot(_(L("Selection-Remove from rectangle")), UndoRedo::SnapshotType::Selection); + wxGetApp().plater()->take_snapshot(_L("Selection-Remove from rectangle"), UndoRedo::SnapshotType::Selection); selection_changed = true; } } +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + } +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION if (!selection_changed) return; Plater::SuppressSnapshots suppress(wxGetApp().plater()); - if ((state == GLSelectionRectangle::Select) && !ctrl_pressed) + if (state == GLSelectionRectangle::EState::Select && !ctrl_pressed) m_selection.clear(); for (int i : m_hover_volume_idxs) { - if (state == GLSelectionRectangle::Select) { + if (state == GLSelectionRectangle::EState::Select) { if (hover_modifiers_only) { const GLVolume& v = *m_volumes.volumes[i]; m_selection.add_volume(v.object_idx(), v.volume_idx(), v.instance_idx(), false); diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 13467499a1..f3d032fc31 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -13,12 +13,12 @@ namespace GUI { void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, EState state) { - if (is_dragging() || (state == Off)) + if (is_dragging() || state == EState::Off) return; m_state = state; m_start_corner = mouse_position; - m_end_corner = mouse_position; + m_end_corner = mouse_position; } void GLSelectionRectangle::dragging(const Vec2d& mouse_position) @@ -36,7 +36,7 @@ namespace GUI { if (!is_dragging()) return out; - m_state = Off; + m_state = EState::Off; const Camera& camera = wxGetApp().plater()->get_camera(); Matrix4d modelview = camera.get_view_matrix().matrix(); @@ -66,7 +66,7 @@ namespace GUI { void GLSelectionRectangle::stop_dragging() { if (is_dragging()) - m_state = Off; + m_state = EState::Off; } void GLSelectionRectangle::render(const GLCanvas3D& canvas) const @@ -93,8 +93,8 @@ namespace GUI { glsafe(::glLineWidth(1.5f)); float color[3]; - color[0] = (m_state == Select) ? 0.3f : 1.0f; - color[1] = (m_state == Select) ? 1.0f : 0.3f; + color[0] = (m_state == EState::Select) ? 0.3f : 1.0f; + color[1] = (m_state == EState::Select) ? 1.0f : 0.3f; color[2] = 0.3f; glsafe(::glColor3fv(color)); diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index d9869771ef..dbbb056a94 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -11,7 +11,7 @@ class GLCanvas3D; class GLSelectionRectangle { public: - enum EState { + enum class EState { Off, Select, Deselect @@ -32,18 +32,22 @@ public: void render(const GLCanvas3D& canvas) const; - bool is_dragging() const { return m_state != Off; } + bool is_dragging() const { return m_state != EState::Off; } +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + bool is_empty() const { return m_state == EState::Off || m_start_corner.isApprox(m_end_corner); } +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + EState get_state() const { return m_state; } - float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } - float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); } - float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); } - float get_right() const { return std::max(m_start_corner(0), m_end_corner(0)); } - float get_top() const { return std::max(m_start_corner(1), m_end_corner(1)); } - float get_bottom() const { return std::min(m_start_corner(1), m_end_corner(1)); } + float get_width() const { return std::abs(m_start_corner.x() - m_end_corner.x()); } + float get_height() const { return std::abs(m_start_corner.y() - m_end_corner.y()); } + float get_left() const { return std::min(m_start_corner.x(), m_end_corner.x()); } + float get_right() const { return std::max(m_start_corner.x(), m_end_corner.x()); } + float get_top() const { return std::max(m_start_corner.y(), m_end_corner.y()); } + float get_bottom() const { return std::min(m_start_corner.y(), m_end_corner.y()); } private: - EState m_state = Off; + EState m_state{ EState::Off }; Vec2d m_start_corner; Vec2d m_end_corner; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 691a867063..e5dee5248f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -258,7 +258,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { if (shift_down || alt_down) { - m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); } } else { @@ -324,7 +324,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos trafo, wxGetApp().plater()->get_camera(), points_inside, m_c->object_clipper()->get_clipping_plane())) { - if (rectangle_status == GLSelectionRectangle::Deselect) + if (rectangle_status == GLSelectionRectangle::EState::Deselect) unselect_point(points_idxs[idx]); else select_point(points_idxs[idx]); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 29e1fd2f30..8395adadf2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -344,7 +344,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { if (m_hover_id == -1) { if (shift_down || alt_down) { - m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); } } else { @@ -415,7 +415,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous { if (idx >= orig_pts_num) // this is a cone-base, get index of point it belongs to idx -= orig_pts_num; - if (rectangle_status == GLSelectionRectangle::Deselect) + if (rectangle_status == GLSelectionRectangle::EState::Deselect) unselect_point(points_idxs[idx]); else select_point(points_idxs[idx]); From 7274d2bb6e7009a0bfbd0f5a281a8b6037ca7ad5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 11 Jan 2022 09:43:43 +0100 Subject: [PATCH 002/149] Fixed warning --- src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7a8c13e5d8..955287f0f6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5706,7 +5706,9 @@ void GLCanvas3D::_update_volumes_hover_state() return; } +#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION bool selection_modifiers_only = m_selection.is_empty() || m_selection.is_any_modifier(); +#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION bool hover_modifiers_only = true; for (int i : m_hover_volume_idxs) { From f09c3e111803bc30d4cb007b898770869d93f730 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 14 Jan 2022 11:28:20 +0100 Subject: [PATCH 003/149] Techs ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE, ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE and ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION moved to 2.5.1.alpha1 --- src/libslic3r/Technologies.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index f267d4f55f..1641e5804a 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -43,10 +43,6 @@ // Enable detection of layers for spiral vase prints #define ENABLE_SPIRAL_VASE_LAYERS (1 && ENABLE_2_4_1_RC) -// Enable modified camera control and selection using mouse -#define ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE (1 && ENABLE_2_4_1_RC) -#define ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE (1 && ENABLE_2_4_1_RC) -#define ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION (1 && ENABLE_2_4_1_RC) //==================== @@ -62,6 +58,10 @@ #define ENABLE_PREVIEW_LAYER_TIME (1 && ENABLE_2_5_0_ALPHA1) // Enable showing time estimate for travel moves in legend #define ENABLE_TRAVEL_TIME (1 && ENABLE_2_5_0_ALPHA1) +// Enable modified camera control and selection using mouse +#define ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE (1 && ENABLE_2_5_0_ALPHA1) +#define ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE (1 && ENABLE_2_5_0_ALPHA1) +#define ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION (1 && ENABLE_2_5_0_ALPHA1) #endif // _prusaslicer_technologies_h_ From 5b5fdfba012aecb79429638d0ea514b060dea6a9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 24 Feb 2022 14:49:53 +0100 Subject: [PATCH 004/149] Follow-up of 3cd15ac005287f1d12aa63c6fb072fb8acc3170b - Fixed update of dragging state of selection --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index c24a2372db..daced16eea 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -203,6 +203,8 @@ bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { on_stop_dragging(); + m_parent.get_selection().stop_dragging(); + // There is prediction that after draggign, data are changed // Data are updated twice also by canvas3D::reload_scene. // Should be fixed. From 1e9951dec514578136a2bc9ce99bb88bae88c54e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 25 Feb 2022 11:42:42 +0100 Subject: [PATCH 005/149] Follow-up of 5b5fdfba012aecb79429638d0ea514b060dea6a9 - Removed member variable Selection::m_dragging It was used only in ObjectManipulation::update_if_dirty() to avoid the update the sidebar reset and mirror button, which results in a slow down of the GUI, while dragging objects/gizmos in the 3D scene A call to GLCanvas3D::is_dragging() is used instead --- src/slic3r/GUI/GLCanvas3D.cpp | 11 +++-------- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 13 +++++-------- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 5 +---- src/slic3r/GUI/Selection.cpp | 8 +++----- src/slic3r/GUI/Selection.hpp | 5 +---- 5 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 76fae46645..1aca383714 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2774,7 +2774,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_dirty = true; }, [this](const Vec3d& direction, bool slow, bool camera_space) { - m_selection.start_dragging(); + m_selection.setup_cache(); double multiplier = slow ? 1.0 : 10.0; Vec3d displacement; @@ -2787,7 +2787,6 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) displacement = multiplier * direction; m_selection.translate(displacement); - m_selection.stop_dragging(); m_dirty = true; } ); @@ -2884,9 +2883,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_dirty = true; else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { auto do_rotate = [this](double angle_z_rad) { - m_selection.start_dragging(); + m_selection.setup_cache(); m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); - m_selection.stop_dragging(); m_dirty = true; // wxGetApp().obj_manipul()->set_dirty(); }; @@ -3352,7 +3350,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None; // The dragging operation is initiated. m_mouse.drag.move_volume_idx = volume_idx; - m_selection.start_dragging(); + m_selection.setup_cache(); m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; m_moving = true; @@ -3464,9 +3462,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) { - if (evt.LeftUp()) - m_selection.stop_dragging(); - if (m_layers_editing.state != LayersEditing::Unknown) { m_layers_editing.state = LayersEditing::Unknown; _stop_timer(); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 98012fa2dd..6ab87150ba 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -657,9 +657,9 @@ void ObjectManipulation::update_if_dirty() else m_og->disable(); - if (!selection.is_dragging()) { + if (!wxGetApp().plater()->canvas3D()->is_dragging()) { update_reset_buttons_visibility(); - update_mirror_buttons_visibility(); + update_mirror_buttons_visibility(); } m_dirty = false; @@ -814,9 +814,8 @@ void ObjectManipulation::change_position_value(int axis, double value) auto canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - selection.start_dragging(); + selection.setup_cache(); selection.translate(position - m_cache.position, selection.requires_local_axes()); - selection.stop_dragging(); canvas->do_move(L("Set Position")); m_cache.position = position; @@ -844,11 +843,10 @@ void ObjectManipulation::change_rotation_value(int axis, double value) transformation_type.set_local(); } - selection.start_dragging(); + selection.setup_cache(); selection.rotate( (M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation), transformation_type); - selection.stop_dragging(); canvas->do_rotate(L("Set Orientation")); m_cache.rotation = rotation; @@ -925,9 +923,8 @@ void ObjectManipulation::do_scale(int axis, const Vec3d &scale) const if (m_uniform_scale || selection.requires_uniform_scale()) scaling_factor = scale(axis) * Vec3d::Ones(); - selection.start_dragging(); + selection.setup_cache(); selection.scale(scaling_factor, transformation_type); - selection.stop_dragging(); wxGetApp().plater()->canvas3D()->do_scale(L("Set Scale")); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index daced16eea..82702f212b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -162,8 +162,7 @@ bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { Selection &selection = m_parent.get_selection(); if (!selection.is_empty() && m_hover_id != -1 && (m_grabbers.empty() || m_hover_id < static_cast(m_grabbers.size()))) { - // TODO: investigate if it is neccessary -> there was no stop dragging - selection.start_dragging(); + selection.setup_cache(); m_dragging = true; for (auto &grabber : m_grabbers) grabber.dragging = false; @@ -203,8 +202,6 @@ bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { on_stop_dragging(); - m_parent.get_selection().stop_dragging(); - // There is prediction that after draggign, data are changed // Data are updated twice also by canvas3D::reload_scene. // Should be fixed. diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 89fd43acbf..585616c116 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -115,7 +115,6 @@ Selection::Selection() , m_type(Empty) , m_valid(false) , m_scale_factor(1.0f) - , m_dragging(false) { this->set_bounding_boxes_dirty(); } @@ -679,12 +678,11 @@ const BoundingBoxf3& Selection::get_scaled_instance_bounding_box() const return *m_scaled_instance_bounding_box; } -void Selection::start_dragging() +void Selection::setup_cache() { if (!m_valid) return; - m_dragging = true; set_caches(); } @@ -955,12 +953,12 @@ void Selection::scale_to_fit_print_volume(const BuildVolume& volume) type.set_joint(); // apply scale - start_dragging(); + setup_cache(); scale(s * Vec3d::Ones(), type); wxGetApp().plater()->canvas3D()->do_scale(""); // avoid storing another snapshot // center selection on print bed - start_dragging(); + setup_cache(); offset.z() = -get_bounding_box().min.z(); translate(offset); wxGetApp().plater()->canvas3D()->do_move(""); // avoid storing another snapshot diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 72865f4086..f9e18b036d 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -229,7 +229,6 @@ private: #endif // ENABLE_GLBEGIN_GLEND_REMOVAL float m_scale_factor; - bool m_dragging; public: Selection(); @@ -322,9 +321,7 @@ public: const BoundingBoxf3& get_unscaled_instance_bounding_box() const; const BoundingBoxf3& get_scaled_instance_bounding_box() const; - void start_dragging(); - void stop_dragging() { m_dragging = false; } - bool is_dragging() const { return m_dragging; } + void setup_cache(); void translate(const Vec3d& displacement, bool local = false); void rotate(const Vec3d& rotation, TransformationType transformation_type); From 97fb6d22dd02785cf3f3a05ef9925f8d558a5490 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 25 Feb 2022 12:20:23 +0100 Subject: [PATCH 006/149] Follow-up to 8aefe3fc90687aaa96a0f0fce59d073ad334eb75 Suppress the G-code find / replace substitutions for the non-G-code sections (comment blocks) at the start and at the end of the G-code file. This commit extends the suppressed blocks for G-code find / replace to placeholders for initial / final M73 commands and over the trailing G-code comments. Fixes gcode substitution: replacing comments removes initial and final M73 commands --- src/libslic3r/GCode.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 28d28f71d6..07af48d867 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1202,13 +1202,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato } print.throw_if_canceled(); - // Starting now, the G-code find / replace post-processor will be enabled. - file.find_replace_enable(); - // adds tags for time estimators if (print.config().remaining_times.value) file.write_format(";%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::First_Line_M73_Placeholder).c_str()); + // Starting now, the G-code find / replace post-processor will be enabled. + file.find_replace_enable(); + // Prepare the helper object for replacing placeholders in custom G-code and output filename. m_placeholder_parser = print.placeholder_parser(); m_placeholder_parser.update_timestamp(); @@ -1498,6 +1498,10 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write(m_writer.update_progress(m_layer_count, m_layer_count, true)); // 100% file.write(m_writer.postamble()); + // From now to the end of G-code, the G-code find / replace post-processor will be disabled. + // Thus the PrusaSlicer generated config will NOT be processed by the G-code post-processor, see GH issue #7952. + file.find_replace_supress(); + // adds tags for time estimators if (print.config().remaining_times.value) file.write_format(";%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Last_Line_M73_Placeholder).c_str()); @@ -1520,10 +1524,6 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write_format("; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); file.write_format(";%s\n", GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Estimated_Printing_Time_Placeholder).c_str()); - // From now to the end of G-code, the G-code find / replace post-processor will be disabled. - // Thus the PrusaSlicer generated config will NOT be processed by the G-code post-processor, see GH issue #7952. - file.find_replace_supress(); - // Append full config, delimited by two 'phony' configuration keys prusaslicer_config = begin and prusaslicer_config = end. // The delimiters are structured as configuration key / value pairs to be parsable by older versions of PrusaSlicer G-code viewer. { From b4c11dfc8355ba0b14715415ff283a896802c0d1 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 23 Feb 2022 14:56:16 +0100 Subject: [PATCH 007/149] SPE-1202 - Fixed project name after loading a 3mf file whose path contains diacritics by double clicking (might be a fix of #7681, #7173 and #7845) --- src/slic3r/GUI/GUI_App.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index be2cfb601b..6a05cfa767 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -752,7 +752,7 @@ void GUI_App::post_init() if (boost::algorithm::iends_with(filename, ".amf") || boost::algorithm::iends_with(filename, ".amf.xml") || boost::algorithm::iends_with(filename, ".3mf")) - this->plater()->set_project_filename(filename); + this->plater()->set_project_filename(from_u8(filename)); } } if (! this->init_params->extra_config.empty()) From 1ad8460a3cfbd840d374fe32c0e01749effcb39e Mon Sep 17 00:00:00 2001 From: Nick Berardi Date: Sun, 27 Feb 2022 09:58:07 -0500 Subject: [PATCH 008/149] creality.ini: add Ender-3 Pro Added missing profile for Creality Ender-3 Pro --- resources/profiles/Creality.ini | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 381efbe2ff..1ebcb8ebcb 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -32,6 +32,15 @@ bed_model = ender3_bed.stl bed_texture = ender3.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY +[printer_model:ENDER3PRO] +name = Creality Ender-3 Pro +variants = 0.4 +technology = FFF +family = ENDER +bed_model = ender3_bed.stl +bed_texture = ender3.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY + [printer_model:ENDER3V2] name = Creality Ender-3 V2 variants = 0.4 @@ -960,6 +969,14 @@ inherits = Creality Ender-3; *fastabl* renamed_from = "Creality ENDER-3 BLTouch" printer_model = ENDER3BLTOUCH +[printer:Creality Ender-3 Pro] +inherits = *common* +renamed_from = "Creality Ender-3 Pro" +bed_shape = 5x0,215x0,215x220,5x220 +max_print_height = 250 +printer_model = ENDER3PRO +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3PRO\nPRINTER_HAS_BOWDEN + [printer:Creality Ender-3 V2] inherits = *common* renamed_from = "Creality Ender-3V2" From 537fa118df7cd16ac1b265056f7cbdb5d280c768 Mon Sep 17 00:00:00 2001 From: Nick Berardi Date: Sun, 27 Feb 2022 10:32:58 -0500 Subject: [PATCH 009/149] Added support for `*pauseprint*` to Ender-3 models Added support for `*pauseprint*` to Ender-3 models, as they do support `M25` out of the box from at least the Ender-3 line forward. --- resources/profiles/Creality.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 1ebcb8ebcb..b3d8507093 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -970,7 +970,7 @@ renamed_from = "Creality ENDER-3 BLTouch" printer_model = ENDER3BLTOUCH [printer:Creality Ender-3 Pro] -inherits = *common* +inherits = *common*; *pauseprint* renamed_from = "Creality Ender-3 Pro" bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 250 @@ -978,7 +978,7 @@ printer_model = ENDER3PRO printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3PRO\nPRINTER_HAS_BOWDEN [printer:Creality Ender-3 V2] -inherits = *common* +inherits = *common*; *pauseprint* renamed_from = "Creality Ender-3V2" bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 250 @@ -986,7 +986,7 @@ printer_model = ENDER3V2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3V2\nPRINTER_HAS_BOWDEN [printer:Creality Ender-3 S1] -inherits = *common*; *spriteextruder* +inherits = *common*; *pauseprint*; *spriteextruder* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 270 printer_model = ENDER3S1 From a1846e38d2439854d17a0985de7277849204cc1d Mon Sep 17 00:00:00 2001 From: Nick Berardi Date: Sun, 27 Feb 2022 10:37:08 -0500 Subject: [PATCH 010/149] Reved Creality.ini version Reved Creality.ini version, and included `*pauseprint*` for Ender-3 Max as well. --- resources/profiles/Creality.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index b3d8507093..0fa14d8a8b 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.1.3 +config_version = 0.1.4 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -993,7 +993,7 @@ printer_model = ENDER3S1 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3S1 [printer:Creality Ender-3 Max] -inherits = *common* +inherits = *common*; *pauseprint* retract_length = 6 bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 340 From 237958819644c62e5e4e09b48a49d15f2e77cf3d Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 10:21:03 +0100 Subject: [PATCH 011/149] Tech ENABLE_GLBEGIN_GLEND_REMOVAL - Fix in GLGizmoRotate::render_angle_arc(): Tech ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL - Fix in GLModel::render() --- src/slic3r/GUI/GLModel.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 28 ++++++++++++++----------- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 1 + 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 8620c7eaf8..f0eac9a24e 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -998,7 +998,7 @@ void GLModel::render(const std::pair& range) shader->set_uniform("uniform_color", data.color); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); - glsafe(::glDrawElements(mode, range.second - range.first + 1, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format)))); + glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format)))); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); if (tex_coord) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index c97a4a788e..a09ac80578 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -461,22 +461,26 @@ void GLGizmoRotate::render_angle() const const float ex_radius = m_radius * (1.0f + GrabberOffset); #if ENABLE_GLBEGIN_GLEND_REMOVAL - if (!m_angle_arc.is_initialized() || radius_changed) { + const bool angle_changed = std::abs(m_old_angle - m_angle) > EPSILON; + m_old_angle = m_angle; + + if (!m_angle_arc.is_initialized() || radius_changed || angle_changed) { m_angle_arc.reset(); + if (m_angle > 0.0f) { + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.reserve_vertices(1 + AngleResolution); + init_data.reserve_indices(1 + AngleResolution); - GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; - init_data.reserve_vertices(1 + AngleResolution); - init_data.reserve_indices(1 + AngleResolution); + // vertices + indices + for (unsigned short i = 0; i <= AngleResolution; ++i) { + const float angle = float(i) * step_angle; + init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f)); + init_data.add_ushort_index(i); + } - // vertices + indices - for (unsigned short i = 0; i <= AngleResolution; ++i) { - const float angle = float(i) * step_angle; - init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f)); - init_data.add_ushort_index(i); + m_angle_arc.init_from(std::move(init_data)); } - - m_angle_arc.init_from(std::move(init_data)); } m_angle_arc.set_color(color); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 02dd84e68f..d0474df0ef 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -50,6 +50,7 @@ private: GrabberConnection m_grabber_connection; float m_old_radius{ 0.0f }; float m_old_hover_radius{ 0.0f }; + float m_old_angle{ 0.0f }; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL ColorRGBA m_drag_color; From a5ff37013bcab8e5ab999e236e4531e3963ca377 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 10:41:01 +0100 Subject: [PATCH 012/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. 1st installment. Shader: flat - Default bed --- resources/shaders/flat_attr.vs | 10 ++++ src/libslic3r/Technologies.hpp | 2 + src/slic3r/GUI/3DBed.cpp | 15 ++++- src/slic3r/GUI/Camera.hpp | 3 + src/slic3r/GUI/GLModel.cpp | 85 +++++++++++++++++++++++++---- src/slic3r/GUI/GLShadersManager.cpp | 3 + 6 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 resources/shaders/flat_attr.vs diff --git a/resources/shaders/flat_attr.vs b/resources/shaders/flat_attr.vs new file mode 100644 index 0000000000..1b00886757 --- /dev/null +++ b/resources/shaders/flat_attr.vs @@ -0,0 +1,10 @@ +#version 110 + +attribute vec3 v_position; + +uniform mat4 projection_view_model_matrix; + +void main() +{ + gl_Position = projection_view_model_matrix * vec4(v_position, 1.0); +} diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 8e7fba1264..ac4dace80b 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -70,6 +70,8 @@ #define ENABLE_GLBEGIN_GLEND_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable replace GLIndexedVertexArray with GLModel #define ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL (1 && ENABLE_GLBEGIN_GLEND_REMOVAL) +// Enable using vertex attributes and matrices in shaders +#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_GLBEGIN_GLEND_REMOVAL) // Enable show non-manifold edges #define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 244a802dbc..b0b6fcd426 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -11,6 +11,10 @@ #include "GUI_App.hpp" #include "GLCanvas3D.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "Plater.hpp" +#include "Camera.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include @@ -384,7 +388,7 @@ void Bed3D::init_gridlines() init_data.reserve_vertices(2 * gridlines.size()); init_data.reserve_indices(2 * gridlines.size()); - for (const Line& l : gridlines) { + for (const Slic3r::Line& l : gridlines) { init_data.add_vertex(Vec3f(unscale(l.a.x()), unscale(l.a.y()), GROUND_Z)); init_data.add_vertex(Vec3f(unscale(l.b.x()), unscale(l.b.y()), GROUND_Z)); const unsigned int vertices_counter = (unsigned int)init_data.vertices_count(); @@ -694,10 +698,19 @@ void Bed3D::render_default(bool bottom, bool picking) init_gridlines(); init_triangles(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index a61eb44ec5..6a0158e6df 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -78,6 +78,9 @@ public: const std::array& get_viewport() const { return m_viewport; } const Transform3d& get_view_matrix() const { return m_view_matrix; } const Transform3d& get_projection_matrix() const { return m_projection_matrix; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + Transform3d get_projection_view_matrix() const { return m_projection_matrix * m_view_matrix; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Vec3d get_dir_right() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(0); } Vec3d get_dir_up() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(1); } diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index f0eac9a24e..6eeeda7d9e 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -982,17 +982,64 @@ void GLModel::render(const std::pair& range) glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); + + int position_id = -1; + int normal_id = -1; + int tex_coord_id = -1; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (position) { - glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); + } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (normal) { - glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + normal_id = shader->get_attrib_location("v_normal"); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (tex_coord) { - glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + tex_coord_id = shader->get_attrib_location("v_tex_coord"); + if (tex_coord_id != -1) { + glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(tex_coord_id)); + } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } shader->set_uniform("uniform_color", data.color); @@ -1001,12 +1048,26 @@ void GLModel::render(const std::pair& range) glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format)))); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - if (tex_coord) - glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); - if (normal) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - if (position) - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (tex_coord_id != -1) + glsafe(::glDisableVertexAttribArray(tex_coord_id)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (tex_coord) + glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); + if (normal) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (position) + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 33ac9b6bcd..70b1b6c316 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -36,6 +36,9 @@ std::pair GLShadersManager::init() #if ENABLE_GLBEGIN_GLEND_REMOVAL // basic shader, used to render all what was previously rendered using the immediate mode valid &= append_shader("flat", { "flat.vs", "flat.fs" }); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // basic shader for textures, used to render textures valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); // used to render 3D scene background From df7be964e09f3e6107b6a072dd624f97586b8141 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 11:10:03 +0100 Subject: [PATCH 013/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Model sinking contour --- src/slic3r/GUI/3DScene.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 2405f39bca..4f3adf9dbf 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -13,6 +13,9 @@ #include "GUI_App.hpp" #include "Plater.hpp" #include "BitmapCache.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "Camera.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include "libslic3r/BuildVolume.hpp" #include "libslic3r/ExtrusionEntity.hpp" @@ -298,10 +301,21 @@ void GLVolume::SinkingContours::render() { update(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); + if (shader == nullptr) + return; + + const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_shift); + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } void GLVolume::SinkingContours::update() @@ -1045,7 +1059,11 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab return; #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL From b766902fe20ed48ab5e1550825269fdc891281f3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 11:14:07 +0100 Subject: [PATCH 014/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Model non-manifold edges --- src/slic3r/GUI/3DScene.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 4f3adf9dbf..91c82de3fd 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -389,15 +389,26 @@ void GLVolume::NonManifoldEdges::render() update(); glsafe(::glLineWidth(2.0f)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); + if (shader == nullptr) + return; + + const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_parent.world_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL m_model.set_color(complementary(m_parent.render_color)); #else m_model.set_color(-1, complementary(m_parent.render_color)); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL m_model.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } void GLVolume::NonManifoldEdges::update() @@ -1061,10 +1072,11 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); + GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_GLBEGIN_GLEND_REMOVAL if (type == ERenderType::Transparent) { From 507dda6641de019d6425be483515c669939355d6 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 11:23:46 +0100 Subject: [PATCH 015/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Model sequential print clearance --- src/slic3r/GUI/GLCanvas3D.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1aca383714..1b15deb427 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -14,19 +14,16 @@ #include "libslic3r/Technologies.hpp" #include "libslic3r/Tesselate.hpp" #include "libslic3r/PresetBundle.hpp" -#include "slic3r/GUI/3DBed.hpp" -#include "slic3r/GUI/3DScene.hpp" -#include "slic3r/GUI/BackgroundSlicingProcess.hpp" -#include "slic3r/GUI/GLShader.hpp" -#include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/Tab.hpp" -#include "slic3r/GUI/GUI_Preview.hpp" -#include "slic3r/GUI/OpenGLManager.hpp" -#include "slic3r/GUI/Plater.hpp" -#include "slic3r/GUI/MainFrame.hpp" -#include "slic3r/Utils/UndoRedo.hpp" -#include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" - +#include "3DBed.hpp" +#include "3DScene.hpp" +#include "BackgroundSlicingProcess.hpp" +#include "GLShader.hpp" +#include "GUI.hpp" +#include "Tab.hpp" +#include "GUI_Preview.hpp" +#include "OpenGLManager.hpp" +#include "Plater.hpp" +#include "MainFrame.hpp" #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" #include "GUI_ObjectManipulation.hpp" @@ -35,6 +32,9 @@ #include "NotificationManager.hpp" #include "format.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + #if ENABLE_RETINA_GL #include "slic3r/Utils/RetinaHelper.hpp" #endif @@ -969,7 +969,11 @@ void GLCanvas3D::SequentialPrintClearance::render() const ColorRGBA NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL @@ -978,6 +982,11 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glDisable(GL_CULL_FACE)); glsafe(::glEnable(GL_BLEND)); From 5b1c9a34d6e849f0ff0b9e47b124033cebea902c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 12:05:08 +0100 Subject: [PATCH 016/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Volumes picking pass --- src/libslic3r/Technologies.hpp | 2 +- src/slic3r/GUI/3DScene.cpp | 23 ++++++++++++++++++++--- src/slic3r/GUI/GLCanvas3D.cpp | 12 ++++++++++++ src/slic3r/GUI/GLModel.cpp | 1 - 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index ac4dace80b..88ca571781 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -71,7 +71,7 @@ // Enable replace GLIndexedVertexArray with GLModel #define ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL (1 && ENABLE_GLBEGIN_GLEND_REMOVAL) // Enable using vertex attributes and matrices in shaders -#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_GLBEGIN_GLEND_REMOVAL) +#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL) // Enable show non-manifold edges #define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 91c82de3fd..8093cb0de4 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -703,11 +703,24 @@ void GLVolume::render() if (!is_active) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); + if (shader == nullptr) + return; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (this->is_left_handed()) glFrontFace(GL_CW); glsafe(::glCullFace(GL_BACK)); - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(world_matrix().data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(world_matrix().data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL if (tverts_range == std::make_pair(0, -1)) @@ -718,7 +731,11 @@ void GLVolume::render() this->indexed_vertex_array.render(this->tverts_range, this->qverts_range); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); + if (this->is_left_handed()) glFrontFace(GL_CCW); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1b15deb427..4279df64f6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5612,7 +5612,11 @@ void GLCanvas3D::_render_overlays() void GLCanvas3D::_render_volumes_for_picking() const { #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL @@ -5620,8 +5624,10 @@ void GLCanvas3D::_render_volumes_for_picking() const // do not cull backfaces to show broken geometry, if any glsafe(::glDisable(GL_CULL_FACE)); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d& view_matrix = wxGetApp().plater()->get_camera().get_view_matrix(); for (size_t type = 0; type < 2; ++ type) { @@ -5638,6 +5644,10 @@ void GLCanvas3D::_render_volumes_for_picking() const #else glsafe(::glColor4fv(picking_decode(id).data())); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * volume.first->world_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL shader->stop_using(); @@ -5645,8 +5655,10 @@ void GLCanvas3D::_render_volumes_for_picking() const } } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_CULL_FACE)); } diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 6eeeda7d9e..c32a4e26ac 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -960,7 +960,6 @@ void GLModel::render(const std::pair& range) return; GLShaderProgram* shader = wxGetApp().get_current_shader(); - if (shader == nullptr) return; From d0511b332b7909796da5382d2bd0b1d4054a5aae Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 12:39:00 +0100 Subject: [PATCH 017/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Camera target --- src/slic3r/GUI/GLCanvas3D.cpp | 52 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4279df64f6..e747c76263 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5777,54 +5777,58 @@ void GLCanvas3D::_render_view_toolbar() const #if ENABLE_SHOW_CAMERA_TARGET void GLCanvas3D::_render_camera_target() { - static const double half_length = 5.0; + static const float half_length = 5.0f; glsafe(::glDisable(GL_DEPTH_TEST)); glsafe(::glLineWidth(2.0f)); #if ENABLE_GLBEGIN_GLEND_REMOVAL - const Vec3d& target = wxGetApp().plater()->get_camera().get_target(); - bool target_changed = !m_camera_target.target.isApprox(target); - m_camera_target.target = target; + const Vec3f& target = wxGetApp().plater()->get_camera().get_target().cast(); + bool target_changed = !m_camera_target.target.isApprox(target.cast()); + m_camera_target.target = target.cast(); for (int i = 0; i < 3; ++i) { if (!m_camera_target.axis[i].is_initialized() || target_changed) { m_camera_target.axis[i].reset(); - GLModel::InitializationData init_data; - GLModel::InitializationData::Entity entity; - entity.type = GLModel::PrimitiveType::Lines; - entity.positions.reserve(2); + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.color = (i == X) ? ColorRGBA::X() : ((i == Y) ? ColorRGBA::Y() : ColorRGBA::Z()); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices if (i == X) { - entity.positions.emplace_back(target.x() - half_length, target.y(), target.z()); - entity.positions.emplace_back(target.x() + half_length, target.y(), target.z()); + init_data.add_vertex(Vec3f(target.x() - half_length, target.y(), target.z())); + init_data.add_vertex(Vec3f(target.x() + half_length, target.y(), target.z())); } else if (i == Y) { - entity.positions.emplace_back(target.x(), target.y() - half_length, target.z()); - entity.positions.emplace_back(target.x(), target.y() + half_length, target.z()); + init_data.add_vertex(Vec3f(target.x(), target.y() - half_length, target.z())); + init_data.add_vertex(Vec3f(target.x(), target.y() + half_length, target.z())); } else { - entity.positions.emplace_back(target.x(), target.y(), target.z() - half_length); - entity.positions.emplace_back(target.x(), target.y(), target.z() + half_length); - } - entity.normals.reserve(2); - for (size_t j = 0; j < 2; ++j) { - entity.normals.emplace_back(Vec3f::UnitZ()); + init_data.add_vertex(Vec3f(target.x(), target.y(), target.z() - half_length)); + init_data.add_vertex(Vec3f(target.x(), target.y(), target.z() + half_length)); } - entity.indices.reserve(2); - entity.indices.emplace_back(0); - entity.indices.emplace_back(1); + // indices + init_data.add_ushort_line(0, 1); - init_data.entities.emplace_back(entity); - m_camera_target.axis[i].init_from(init_data); - m_camera_target.axis[i].set_color(-1, (i == X) ? ColorRGBA::X() : (i == Y) ? ColorRGBA::Y() : ColorRGBA::Z()); + m_camera_target.axis[i].init_from(std::move(init_data)); } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); } From 78a93acb5b74e16965f718bec9cd69aeaaf652fe Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 12:50:43 +0100 Subject: [PATCH 018/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - SLA caps --- src/slic3r/GUI/GLCanvas3D.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e747c76263..d880e6adef 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6006,24 +6006,39 @@ void GLCanvas3D::_render_sla_slices() } #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); for (const SLAPrintObject::Instance& inst : obj->instances()) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * + Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), + Vec3d(0.0, 0.0, inst.rotation), + Vec3d::Ones(), + obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslated(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0)); glsafe(::glRotatef(Geometry::rad2deg(inst.rotation), 0.0f, 0.0f, 1.0f)); if (obj->is_left_handed()) // The polygons are mirrored by X. glsafe(::glScalef(-1.0f, 1.0f, 1.0f)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bottom_obj_triangles.render(); top_obj_triangles.render(); bottom_sup_triangles.render(); top_sup_triangles.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } shader->stop_using(); From 8c8f0b32a74a5fc491d7f16bd89e3e21523b1643 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 14:33:49 +0100 Subject: [PATCH 019/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Picking for base gizmo grabbers and gizmo rotate grabber extensions --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 46 ++++++++--- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 3 + src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 102 ++++++++++++++++++++---- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 4 + 4 files changed, 131 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 82702f212b..a45ea7a4a5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -4,8 +4,10 @@ #include #include "slic3r/GUI/GUI_App.hpp" - #include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // TODO: Display tooltips quicker on Linux @@ -33,11 +35,19 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; + + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_cube.is_initialized()) { // This cannot be done in constructor, OpenGL is not yet // initialized at that point (on Linux at least). indexed_triangle_set its = its_make_cube(1., 1., 1.); - its_translate(its, Vec3f(-0.5, -0.5, -0.5)); + its_translate(its, -0.5f * Vec3f::Ones()); #if ENABLE_GLBEGIN_GLEND_REMOVAL m_cube.init_from(its); #else @@ -53,14 +63,28 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo m_cube.set_color(-1, render_color); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); - glsafe(::glScaled(fullsize, fullsize, fullsize)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * matrix * + Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); + shader->set_uniform("projection_view_model_matrix", trafo); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); + glsafe(::glScaled(fullsize, fullsize, fullsize)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cube.render(); - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) @@ -129,7 +153,11 @@ void GLGizmoBase::render_grabbers(float size) const void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const { #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 6f62382e17..c4adccf440 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -49,6 +49,9 @@ protected: bool dragging{ false }; Vec3d center{ Vec3d::Zero() }; Vec3d angles{ Vec3d::Zero() }; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + Transform3d matrix{ Transform3d::Identity() }; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ColorRGBA color{ ColorRGBA::WHITE() }; Grabber() = default; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index a09ac80578..cf69864dbb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -219,15 +219,20 @@ void GLGizmoRotate::on_render_for_picking() glsafe(::glDisable(GL_DEPTH_TEST)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_grabbers.front().matrix = local_transform(selection); +#else glsafe(::glPushMatrix()); - transform_to_local(selection); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const BoundingBoxf3& box = selection.get_bounding_box(); render_grabbers_for_picking(box); render_grabber_extension(box, true); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit) @@ -550,10 +555,18 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const double size = m_dragging ? double(m_grabbers.front().get_dragging_half_size(mean_size)) : double(m_grabbers.front().get_half_size(mean_size)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light"); +#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers.front().color) : m_grabbers.front().color); shader->start_using(); @@ -572,22 +585,49 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const Vec3d& center = m_grabbers.front().center; - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * + Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + shader->set_uniform("projection_view_model_matrix", trafo); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); + glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); - glsafe(::glPopMatrix()); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * + Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + shader->set_uniform("projection_view_model_matrix", trafo); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); + glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (! picking) @@ -595,6 +635,38 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick shader->stop_using(); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +Transform3d GLGizmoRotate::local_transform(const Selection& selection) const +{ + Transform3d ret; + + switch (m_axis) + { + case X: + { + ret = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.5 * PI, 0.0)) * Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, -0.5 * PI)); + break; + } + case Y: + { + ret = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, -0.5 * PI)) * Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, -0.5 * PI, 0.0)); + break; + } + default: + case Z: + { + ret = Transform3d::Identity(); + break; + } + } + + if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) + ret = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true) * ret; + + return Geometry::assemble_transform(m_center) * ret; +} +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void GLGizmoRotate::transform_to_local(const Selection& selection) const { glsafe(::glTranslated(m_center.x(), m_center.y(), m_center.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index d0474df0ef..59a06524a4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -106,6 +106,10 @@ private: void render_grabber(const BoundingBoxf3& box); void render_grabber_extension(const BoundingBoxf3& box, bool picking); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + Transform3d local_transform(const Selection& selection) const; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void transform_to_local(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; From 7c9ac342def121870167c50bd7baccd673d0d856 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 14:55:08 +0100 Subject: [PATCH 020/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Cut --- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 095f1e7a50..099f6110c6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -107,15 +107,19 @@ void GLGizmoCut::on_render() glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); - Vec3d diff = plane_center - m_old_center; + const Vec3d diff = plane_center - m_old_center; // Z changed when move with cut plane // X and Y changed when move with cutted object bool is_changed = std::abs(diff.x()) > EPSILON || - std::abs(diff.y()) > EPSILON || - std::abs(diff.z()) > EPSILON; + std::abs(diff.y()) > EPSILON || + std::abs(diff.z()) > EPSILON; m_old_center = plane_center; if (!m_plane.is_initialized() || is_changed) { @@ -140,6 +144,11 @@ void GLGizmoCut::on_render() m_plane.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_plane.render(); #else // Draw the cutting plane @@ -208,15 +217,26 @@ void GLGizmoCut::on_render() } #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("flat_attr"); +#else shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_cut_contours.shift); + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth(2.0f)); m_cut_contours.contours.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL shader->stop_using(); } From d7666270993913ad931629b0d3e919f84b437b39 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 15:11:14 +0100 Subject: [PATCH 021/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Place on face --- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index e0a583f0b3..c071a491a9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -4,6 +4,10 @@ #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #include "slic3r/GUI/GUI_App.hpp" #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" @@ -101,7 +105,11 @@ void GLGizmoFlatten::on_render() const Selection& selection = m_parent.get_selection(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -115,9 +123,15 @@ void GLGizmoFlatten::on_render() if (selection.is_single_full_instance()) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * + Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); glsafe(::glMultMatrixd(m.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { @@ -130,7 +144,9 @@ void GLGizmoFlatten::on_render() m_planes[i].vbo.render(); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } glsafe(::glEnable(GL_CULL_FACE)); @@ -146,7 +162,11 @@ void GLGizmoFlatten::on_render_for_picking() const Selection& selection = m_parent.get_selection(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -158,9 +178,15 @@ void GLGizmoFlatten::on_render_for_picking() if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * + Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); glsafe(::glMultMatrixd(m.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { @@ -171,7 +197,9 @@ void GLGizmoFlatten::on_render_for_picking() #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL m_planes[i].vbo.render(); } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } glsafe(::glEnable(GL_CULL_FACE)); From 5377e4c43b0bfc5c8b8078ff113a2362980c446a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 28 Feb 2022 15:53:12 +0100 Subject: [PATCH 022/149] Removed empty DoubleSliderUtils.hpp --- src/slic3r/CMakeLists.txt | 1 - src/slic3r/GUI/DoubleSlider_Utils.hpp | 8 -------- 2 files changed, 9 deletions(-) delete mode 100644 src/slic3r/GUI/DoubleSlider_Utils.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 022bba2a8a..aa6268d885 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -193,7 +193,6 @@ set(SLIC3R_GUI_SOURCES GUI/Mouse3DController.hpp GUI/DoubleSlider.cpp GUI/DoubleSlider.hpp - GUI/DoubleSlider_Utils.hpp GUI/Notebook.cpp GUI/Notebook.hpp GUI/ObjectDataViewModel.cpp diff --git a/src/slic3r/GUI/DoubleSlider_Utils.hpp b/src/slic3r/GUI/DoubleSlider_Utils.hpp deleted file mode 100644 index 283d527fa4..0000000000 --- a/src/slic3r/GUI/DoubleSlider_Utils.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef slic3r_GUI_DoubleSlider_Utils_hpp_ -#define slic3r_GUI_DoubleSlider_Utils_hpp_ - -#include -#include - - -#endif // slic3r_GUI_DoubleSlider_Utils_hpp_ From 3b53ba78659e34ee3a753b8591ec386dfc72c217 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 09:56:00 +0100 Subject: [PATCH 023/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Move --- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index c90c721cd1..433f00789a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -2,6 +2,9 @@ #include "GLGizmoMove.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include @@ -151,11 +154,20 @@ void GLGizmoMove3D::on_render() if (m_hover_id == -1) { #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + // draw axes for (unsigned int i = 0; i < 3; ++i) { #if ENABLE_GLBEGIN_GLEND_REMOVAL @@ -186,9 +198,19 @@ void GLGizmoMove3D::on_render() else { // draw axis #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_grabber_connection(m_hover_id); shader->stop_using(); } @@ -207,7 +229,7 @@ void GLGizmoMove3D::on_render() shader->start_using(); shader->set_uniform("emission_factor", 0.1f); // draw grabber - float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); + const float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); m_grabbers[m_hover_id].render(true, mean_size); shader->stop_using(); } From 0376571a93709ea1e6641318218c24ec3632e57e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 10:10:04 +0100 Subject: [PATCH 024/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Move grabber extension --- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 46 +++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 433f00789a..f4729c8257 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -276,17 +276,25 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) { - float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); - double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); + const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); + const double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light"); +#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL if (shader == nullptr) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + #if ENABLE_GLBEGIN_GLEND_REMOVAL m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color); shader->start_using(); @@ -299,16 +307,34 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box } #endif // ENABLE_GLBEGIN_GLEND_REMOVAL - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); - if (axis == X) - glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); - else if (axis == Y) - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); + if (axis == X) + matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); + else if (axis == Y) + matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); + matrix = matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + shader->set_uniform("projection_view_model_matrix", matrix); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); + if (axis == X) + glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); + else if (axis == Y) + glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); #if !ENABLE_GLBEGIN_GLEND_REMOVAL From 76f3829ecb12e42865a6ba0b9984fa67e26a77c8 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 10:48:38 +0100 Subject: [PATCH 025/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Rotate --- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index cf69864dbb..81dfeff3fd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -163,15 +163,28 @@ void GLGizmoRotate::on_render() glsafe(::glEnable(GL_DEPTH_TEST)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_grabbers.front().matrix = local_transform(selection); +#else glsafe(::glPushMatrix()); transform_to_local(selection); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix; + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; m_old_radius = m_radius; @@ -207,6 +220,11 @@ void GLGizmoRotate::on_render() render_angle(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + transform_to_local(selection); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_grabber(box); render_grabber_extension(box, false); From a5ef78b8fd2a8639ab10f979729154cb2a218404 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 11:01:12 +0100 Subject: [PATCH 026/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Scale --- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 53 +++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index f7565a483d..06d0622be3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -2,6 +2,9 @@ #include "GLGizmoScale.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include @@ -215,11 +218,11 @@ void GLGizmoScale3D::on_render() m_box = selection.get_bounding_box(); const Vec3d& center = m_box.center(); - Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); - Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); - Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); + const Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); + const Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); + const Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); - bool ctrl_down = (m_dragging && m_starting.ctrl_down) || (!m_dragging && wxGetKeyState(WXK_CONTROL)); + const bool ctrl_down = (m_dragging && m_starting.ctrl_down) || (!m_dragging && wxGetKeyState(WXK_CONTROL)); // x axis m_grabbers[0].center = m_transform * Vec3d(m_box.min.x(), center.y(), center.z()) - offset_x; @@ -257,14 +260,22 @@ void GLGizmoScale3D::on_render() const BoundingBoxf3& selection_box = selection.get_bounding_box(); - float grabber_mean_size = (float)((selection_box.size().x() + selection_box.size().y() + selection_box.size().z()) / 3.0); + const float grabber_mean_size = (float)((selection_box.size().x() + selection_box.size().y() + selection_box.size().z()) / 3.0); if (m_hover_id == -1) { #if ENABLE_GLBEGIN_GLEND_REMOVAL // draw connections +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); if (m_grabbers[2].enabled && m_grabbers[3].enabled) @@ -304,9 +315,17 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 0 || m_hover_id == 1) { #if ENABLE_GLBEGIN_GLEND_REMOVAL // draw connections +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); } @@ -332,9 +351,17 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 2 || m_hover_id == 3) { #if ENABLE_GLBEGIN_GLEND_REMOVAL // draw connections +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); } @@ -360,9 +387,17 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 4 || m_hover_id == 5) { #if ENABLE_GLBEGIN_GLEND_REMOVAL // draw connections +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); } @@ -388,9 +423,17 @@ void GLGizmoScale3D::on_render() else if (m_hover_id >= 6) { #if ENABLE_GLBEGIN_GLEND_REMOVAL // draw connections +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); render_grabbers_connection(8, 9, m_drag_color); From 282b3d2d6b1a52e23f528a96451f19e33866990b Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 11:13:44 +0100 Subject: [PATCH 027/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - MeshClipper --- src/slic3r/GUI/MeshUtils.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 3787abb2f7..479d32711d 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -10,6 +10,9 @@ #include "slic3r/GUI/GUI_App.hpp" #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #include "slic3r/GUI/Camera.hpp" +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include @@ -79,13 +82,24 @@ void MeshClipper::render_cut() recalculate_triangles(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL + if (m_model.vertices_count() == 0 || m_model.indices_count() == 0) + return; + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); if (curr_shader != nullptr) curr_shader->stop_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); shader->stop_using(); From f4cf9494d0a0b4e956b86001dcd261c23fea68ee Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 12:00:29 +0100 Subject: [PATCH 028/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Some refactoring --- src/slic3r/GUI/3DBed.cpp | 3 +-- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++---- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 3 +-- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 6 ++---- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 15 +++++---------- src/slic3r/GUI/MeshUtils.cpp | 3 +-- 6 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index b0b6fcd426..0eb5b7bee2 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -707,8 +707,7 @@ void Bed3D::render_default(bool bottom, bool picking) shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d880e6adef..1821d36eea 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -983,8 +983,7 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); @@ -5826,8 +5825,7 @@ void GLCanvas3D::_render_camera_target() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 099f6110c6..3ce8681d7a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -145,8 +145,7 @@ void GLGizmoCut::on_render() } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_plane.render(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index f4729c8257..1538fc229b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -164,8 +164,7 @@ void GLGizmoMove3D::on_render() #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // draw axes @@ -207,8 +206,7 @@ void GLGizmoMove3D::on_render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabber_connection(m_hover_id); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 06d0622be3..915b76a200 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -273,8 +273,7 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); @@ -323,8 +322,7 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); @@ -359,8 +357,7 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); @@ -395,8 +392,7 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); @@ -431,8 +427,7 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 479d32711d..787110ad78 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -97,8 +97,7 @@ void MeshClipper::render_cut() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); From cc1d3b738d31bb77e8f8f199b48680e563daa813 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 13:03:49 +0100 Subject: [PATCH 029/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Selection --- src/slic3r/GUI/Selection.cpp | 53 ++++++++++++++++++++++++++++++++---- src/slic3r/GUI/Selection.hpp | 4 +++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 585616c116..1ea0cf2a17 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1275,7 +1275,11 @@ void Selection::render_center(bool gizmo_is_dragging) return; #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1286,8 +1290,13 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glDisable(GL_DEPTH_TEST)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(center); + shader->set_uniform("projection_view_model_matrix", matrix); +#else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL m_vbo_sphere.set_color(ColorRGBA::WHITE()); @@ -1296,7 +1305,9 @@ void Selection::render_center(bool gizmo_is_dragging) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL m_vbo_sphere.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL shader->stop_using(); @@ -1310,7 +1321,11 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) return; #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light"); +#else GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat" : "gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1330,11 +1345,13 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glPushMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!boost::starts_with(sidebar_field, "layer")) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); if (!boost::starts_with(sidebar_field, "layer")) { const Vec3d& center = get_bounding_box().center(); - if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { glsafe(::glTranslated(center.x(), center.y(), center.z())); if (!boost::starts_with(sidebar_field, "position")) { @@ -1355,15 +1372,17 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glMultMatrixd(orient_matrix.data())); } - } else if (is_single_volume() || is_single_modifier()) { + } + else if (is_single_volume() || is_single_modifier()) { glsafe(::glTranslated(center.x(), center.y(), center.z())); Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); if (!boost::starts_with(sidebar_field, "position")) orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); - } else { - glsafe(::glTranslated(center(0), center(1), center(2))); + } + else { + glsafe(::glTranslated(center.x(), center.y(), center.z())); if (requires_local_axes()) { const Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); @@ -1383,9 +1402,16 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) else if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size")) render_sidebar_scale_hints(sidebar_field); else if (boost::starts_with(sidebar_field, "layer")) +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_layers_hints(sidebar_field, shader); +#else render_sidebar_layers_hints(sidebar_field); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!boost::starts_with(sidebar_field, "layer")) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) @@ -1970,11 +1996,18 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con glsafe(::glLineWidth(2.0f * m_scale_factor)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_box.set_color(to_rgba(color)); m_box.render(); shader->stop_using(); @@ -2147,7 +2180,11 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram* shader) +#else void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { static const float Margin = 10.0f; @@ -2245,6 +2282,10 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) m_planes.models[1].init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); m_planes.models[0].render(); m_planes.models[1].set_color((camera_on_top && type == 2) || (!camera_on_top && type == 1) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index f9e18b036d..ac18c31bdb 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -379,7 +379,11 @@ private: void render_sidebar_position_hints(const std::string& sidebar_field); void render_sidebar_rotation_hints(const std::string& sidebar_field); void render_sidebar_scale_hints(const std::string& sidebar_field); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram* shader); +#else void render_sidebar_layers_hints(const std::string& sidebar_field); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES public: enum SyncRotationType { From 0d001ce84fdac788c9267fd4d20613465ee29716 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 1 Mar 2022 15:39:00 +0100 Subject: [PATCH 030/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Rectangle selection --- src/slic3r/GUI/GLSelectionRectangle.cpp | 58 ++++++++++++++++++------- src/slic3r/GUI/GLSelectionRectangle.hpp | 12 ++--- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 8cf3247cb7..828c7c6a4d 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -74,23 +74,41 @@ namespace GUI { if (!is_dragging()) return; +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); - float inv_zoom = (float)camera.get_inv_zoom(); + const float inv_zoom = (float)camera.get_inv_zoom(); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Size cnv_size = canvas.get_canvas_size(); - float cnv_half_width = 0.5f * (float)cnv_size.get_width(); - float cnv_half_height = 0.5f * (float)cnv_size.get_height(); + const Size cnv_size = canvas.get_canvas_size(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; +#else + const float cnv_half_width = 0.5f * (float)cnv_size.get_width(); + const float cnv_half_height = 0.5f * (float)cnv_size.get_height(); if (cnv_half_width == 0.0f || cnv_half_height == 0.0f) return; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Vec2d start(m_start_corner(0) - cnv_half_width, cnv_half_height - m_start_corner(1)); - Vec2d end(m_end_corner(0) - cnv_half_width, cnv_half_height - m_end_corner(1)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + const float left = 2.0f * (get_left() * cnv_inv_width - 0.5f); + const float right = 2.0f * (get_right() * cnv_inv_width - 0.5f); + const float top = -2.0f * (get_top() * cnv_inv_height - 0.5f); + const float bottom = -2.0f * (get_bottom() * cnv_inv_height - 0.5f); +#else + const Vec2d start(m_start_corner.x() - cnv_half_width, cnv_half_height - m_start_corner.y()); + const Vec2d end(m_end_corner.x() - cnv_half_width, cnv_half_height - m_end_corner.y()); + + const float left = (float)std::min(start.x(), end.x()) * inv_zoom; + const float top = (float)std::max(start.y(), end.y()) * inv_zoom; + const float right = (float)std::max(start.x(), end.x()) * inv_zoom; + const float bottom = (float)std::min(start.y(), end.y()) * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const float left = (float)std::min(start(0), end(0)) * inv_zoom; - const float top = (float)std::max(start(1), end(1)) * inv_zoom; - const float right = (float)std::max(start(0), end(0)) * inv_zoom; - const float bottom = (float)std::min(start(1), end(1)) * inv_zoom; - glsafe(::glLineWidth(1.5f)); #if !ENABLE_GLBEGIN_GLEND_REMOVAL float color[3]; @@ -102,6 +120,7 @@ namespace GUI { glsafe(::glDisable(GL_DEPTH_TEST)); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the rectangle is renderered inside the frustrum @@ -109,13 +128,18 @@ namespace GUI { // ensure that the overlay fits the frustrum near z plane const double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -144,11 +168,11 @@ namespace GUI { m_rectangle.init_from(std::move(init_data)); } - const ColorRGBA color( - (m_state == Select) ? 0.3f : 1.0f, - (m_state == Select) ? 1.0f : 0.3f, - 0.3f, 1.0f); - m_rectangle.set_color(color); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + + m_rectangle.set_color(ColorRGBA((m_state == Select) ? 0.3f : 1.0f, (m_state == Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); m_rectangle.render(); shader->stop_using(); } @@ -163,7 +187,9 @@ namespace GUI { glsafe(::glPopAttrib()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } // namespace GUI diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index ae0b7a097e..39989166ed 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -38,12 +38,12 @@ public: bool is_dragging() const { return m_state != Off; } EState get_state() const { return m_state; } - float get_width() const { return std::abs(m_start_corner(0) - m_end_corner(0)); } - float get_height() const { return std::abs(m_start_corner(1) - m_end_corner(1)); } - float get_left() const { return std::min(m_start_corner(0), m_end_corner(0)); } - float get_right() const { return std::max(m_start_corner(0), m_end_corner(0)); } - float get_top() const { return std::max(m_start_corner(1), m_end_corner(1)); } - float get_bottom() const { return std::min(m_start_corner(1), m_end_corner(1)); } + float get_width() const { return std::abs(m_start_corner.x() - m_end_corner.x()); } + float get_height() const { return std::abs(m_start_corner.y() - m_end_corner.y()); } + float get_left() const { return std::min(m_start_corner.x(), m_end_corner.x()); } + float get_right() const { return std::max(m_start_corner.x(), m_end_corner.x()); } + float get_top() const { return std::max(m_start_corner.y(), m_end_corner.y()); } + float get_bottom() const { return std::min(m_start_corner.y(), m_end_corner.y()); } private: EState m_state{ Off }; From 5f9aeb1e3840cc9f9d00a4e2dd6cc5699e00699a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 08:30:00 +0100 Subject: [PATCH 031/149] Removed unneeded pairs glPushMatrix()/glPopMatrix() --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 2 -- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 11 +++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index f3ea526a09..bc0056fa66 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -170,11 +170,9 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glPushMatrix()); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); m_cylinder.render(); - glsafe(::glPopMatrix()); if (vol->is_left_handed()) glFrontFace(GL_CCW); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 3a503407ce..47254e4b3a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -220,17 +220,14 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const double cone_height = 0.75; glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); - glsafe(::glPushMatrix()); glsafe(::glRotated(180., 1., 0., 0.)); glsafe(::glScaled(cone_radius, cone_radius, cone_height)); m_cone.render(); glsafe(::glPopMatrix()); - glsafe(::glTranslatef(0.f, 0.f, cone_height)); - glsafe(::glPopMatrix()); } glsafe(::glPushMatrix()); - double radius = (double)support_point.head_front_radius * RenderPointScale; + const double radius = (double)support_point.head_front_radius * RenderPointScale; glsafe(::glScaled(radius, radius, radius)); m_sphere.render(); glsafe(::glPopMatrix()); @@ -257,7 +254,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); + glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); if (vol->is_left_handed()) @@ -268,12 +265,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - glsafe(::glPushMatrix()); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); m_cylinder.render(); - glsafe(::glPopMatrix()); if (vol->is_left_handed()) glFrontFace(GL_CCW); From b2fba940fe219eb306476d32126a8edc3c8c80c2 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Wed, 2 Mar 2022 09:47:29 +0100 Subject: [PATCH 032/149] Sync with PrusaSlicer-settings --- resources/profiles/PrusaResearch.idx | 1 + resources/profiles/PrusaResearch.ini | 708 ++++++++++++++++++++++++++- 2 files changed, 700 insertions(+), 9 deletions(-) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index f90ba82799..9ee9035631 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.4.0-rc +1.4.3 Added new filament profiles and SLA materials. 1.4.2 Added SLA material profiles. 1.4.1 Updated firmware version. 1.4.0 Updated for the PrusaSlicer 2.4.0-rc release. Updated SLA material colors. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 71a86dde8e..3182eba6bb 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.4.2 +config_version = 1.4.3 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -477,7 +477,7 @@ perimeter_acceleration = 800 perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 -top_solid_layers = 7 +top_solid_layers = 8 bridge_flow_ratio = 1 bridge_speed = 25 @@ -1543,6 +1543,7 @@ filament_max_volumetric_speed = 13 [filament:*ABSMINI*] # inherits = *ABS* bed_temperature = 100 +first_layer_bed_temperature = 100 filament_retract_length = 2.7 filament_retract_speed = nil filament_deretract_speed = nil @@ -2914,6 +2915,7 @@ inherits = *PET* filament_vendor = BASF filament_cost = filament_density = 1.33 +filament_colour = #F7F7F7 first_layer_temperature = 220 first_layer_bed_temperature = 70 temperature = 215 @@ -2925,7 +2927,7 @@ bridge_fan_speed = 100 filament_type = PET disable_fan_first_layers = 1 full_fan_speed_layer = 3 -filament_notes = "BASF Forward AM Ultrafuse PET\nMaterial profile version 1.0\n\nMaterial Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion.\n" +filament_notes = "Material Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." filament_retract_length = 2 filament_retract_speed = 40 filament_retract_before_travel = 2 @@ -2943,7 +2945,7 @@ filament_cost = filament_density = 1.25 filament_spool_weight = 0 filament_colour = #FFFFFF -filament_notes = "BASF Forward AM Ultrafuse PLA PRO1\nMaterial profile version 1.0\n\nMaterial Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% – 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate.\n" +filament_notes = "Material Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% – 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate." filament_retract_length = 2 filament_retract_lift = 0 filament_retract_speed = 40 @@ -2969,15 +2971,303 @@ max_fan_speed = 20 bed_temperature = 100 disable_fan_first_layers = 3 filament_colour = #FFFFFF -filament_notes = "BASF Forward AM Ultrafuse ABS\nMaterial profile version 1.0\n\nMaterial Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion.\n" -filament_retract_length = 2 -filament_retract_speed = 40 +filament_notes = "Material Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion." filament_retract_before_travel = 2 filament_wipe = 0 filament_retract_layer_change = 0 [filament:Ultrafuse ABS @MINI] inherits = Ultrafuse ABS; *ABSMINI* +filament_retract_layer_change = nil + +[filament:Ultrafuse ABS Fusion+] +inherits = Ultrafuse ABS +filament_density = 1.08 +first_layer_bed_temperature = 105 +temperature = 250 +filament_colour = #FFF8D9 +filament_notes = "Material Description\nABS Fusion+ made with Polyscope XILOYâ„¢ 3D is an engineering filament which has been optimized for 3D-printing. This special grade has been developed in collaboration with Polyscope Polymers - renowned for its material solutions in the automotive industry. ABS is a thermoplastic which is used in many applications. Although ABS has been classified as a standard material in 3D-printing it is known to be quite challenging to process. ABS Fusion+ combines the properties of ABS with an improved processability. The filament is based on an ABS grade which can be directly printed on glass without any adhesives or tape and has a higher success rate of prints due to extreme low warping." +filament_retract_before_travel = 2 +filament_wipe = nil +filament_retract_layer_change = 0 +filament_retract_lift = 0 + +[filament:Ultrafuse ABS Fusion+ @MINI] +inherits = Ultrafuse ABS Fusion+; *ABSMINI* +first_layer_bed_temperature = 100 +filament_retract_layer_change = nil + +[filament:Ultrafuse ASA] +inherits = Ultrafuse ABS Fusion+ +filament_density = 1.07 +filament_colour = #FFF4CA +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 110 +bed_temperature = 105 +filament_type = ASA +min_fan_speed = 25 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 4 +filament_max_volumetric_speed = 5 +filament_notes = "Material Description\nUltrafuse ASA is a high-performance thermoplastic with similar mechanical properties as ABS. ASA offers additional benefits such as high outdoor weather resistance. The UV resistance, toughness, and rigidity make it an ideal material to 3D-print outdoor fixtures and appliances without losing its properties or color. When also taking into account the high heat resistance and high chemical resistance, this filament is a good choice for many types of applications.\n\nPrinting Recommendations:\nApply Magigoo PC, 3D lac or Dimafix to a clean build plate to improve adhesion." + +[filament:Ultrafuse ASA @MINI] +inherits = Ultrafuse ASA; *ABSMINI* +filament_type = ASA + +[filament:Ultrafuse HIPS] +inherits = Ultrafuse ABS +temperature = 250 +filament_density = 1.02 +filament_type = HIPS +min_fan_speed = 20 +max_fan_speed = 20 +filament_soluble = 1 +filament_notes = "Material Description\nUltrafuse HIPS is a high-quality engineering thermoplastic, which is well known in the 3D-printing industry as a support material for ABS. But this material has additional properties to offer like good impact resistance, good dimensional stability, and easy post-processing. HiPS is a great material to use as a support for ABS because there is a good compatibility between the two materials, and HIPS is an easy breakaway support. Now you have the opportunity to create ABS models with complex geometry. HIPS is easy to post process with glue or with sanding paper." + +[filament:Ultrafuse HIPS @MINI] +inherits = Ultrafuse HIPS; *ABSMINI* +filament_type = HIPS +min_fan_speed = 20 +max_fan_speed = 20 + +[filament:Ultrafuse PA] +inherits = Fillamentum Nylon FX256 +filament_vendor = BASF +filament_density = 1.12 +filament_colour = #ECFAFF +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 0 +max_fan_speed = 0 +bridge_fan_speed = 0 +fan_below_layer_time = 30 +slowdown_below_layer_time = 20 +min_print_speed = 15 +filament_max_volumetric_speed = 11 +filament_retract_length = 1 +filament_retract_lift = 0 +filament_retract_before_travel = 2 +filament_retract_layer_change = 0 +filament_cost = 0 +filament_spool_weight = 0 +compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0" +filament_notes = "Material Description\nThe key features of Ultrafuse PA are the high strength and high modulus. Furthermore, Ultrafuse PA shows a good thermal distortion stability.\n\nPrinting Recommendations:\nApply PVA glue, Kapton tape or PA adhesive to a clean buildplate to improve adhesion." + +[filament:Ultrafuse PA6 GF30] +inherits = Ultrafuse PA +filament_density = 1.17 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_colour = #404040 +fan_always_on = 1 +min_fan_speed = 0 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +filament_max_volumetric_speed = 10 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +filament_notes = "Material Description\nUltrafuse® PA6 GF30 is a unique compound specifically developed for FFF printing. Due to the glass fiber content of 30%, parts tend to warp less. In addition the excellent layer adhesion and its compatibility with the water soluble support Ultrafuse® BVOH make this material the perfect solution to develop industrial applications on an FFF printer.\n\nWith its high wear and chemical resistance, high stiffness and strength, Ultrafuse® PA6 GF30 is perfect for a wide variety of applications in automotive, electronics or transportation.\n\nUltrafuse PA6 GF30 is designed for functional prototyping and demanding applications such as industrial tooling, transportation, electronics, small appliances, sports & leisure\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PA6 GF30 can be printed directly onto a clean build plate. For challenging prints, use Magigoo PA gluestick to improve adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PAHT-CF15] +inherits = Ultrafuse PA6 GF30 +filament_density = 1.23 +filament_notes = "Material Description\nPAHT CF15 is a high-performance 3D printing filament that opens new application fields in FFF printing. In parallel to its advanced mechanical properties, dimensional stability, and chemical resistance, it has very good processability. It works in any FFF printer with a hardened nozzle. In addition to that, it is compatible with water-soluble support material and HiPS, which allow printing complex geometries that work in challenging environments. PAHT CF15 has high heat resistance up to 130 °C and low moisture absorption.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PAHT-CF can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." + +[filament:Ultrafuse PC-ABS-FR] +inherits = Ultrafuse ABS +filament_colour = #505050 +filament_density = 1.17 +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 110 +bed_temperature = 105 +filament_type = PC +filament_max_volumetric_speed = 8 +filament_wipe = nil +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +disable_fan_first_layers = 4 +compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +filament_notes = "Material Description\nUltrafuse® PC/ABS FR Black is a V-0 flame retardant blend of Polycarbonate and ABS – two of the most used thermoplastics for engineering & electrical applications. The combination of these two materials results in a premium material with a mix of the excellent mechanical properties of PC and the comparably low printing temperature of ABS. Combined with a halogen free flame retardant, parts printed with Ultrafuse® PC/ABS FR Black feature great tensile and impact strength, higher thermal resistance than ABS and can fulfill the requirements of the UL94 V-0 standard.\n\nPrinting Recommendations:\nApply Magigoo PC to a clean build plate to improve adhesion." +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" + +[filament:Ultrafuse PET-CF15] +inherits = Ultrafuse PET +filament_density = 1.36 +filament_colour = #404040 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 75 +bed_temperature = 75 +min_fan_speed = 60 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +fan_below_layer_time = 30 +filament_max_volumetric_speed = 10 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_notes = "Material Description\nPET CF15 is a Carbon Fiber reinforced PET which has precisely tuned material properties, for a wide range of technical applications. The filament is very strong and stiff and has high heat resistance. With its high dimensional stability and low abrasiveness, the filament offers an easy to print experience which allows direct printing on glass or a PEI sheet. It is compatible with HiPS for breakaway support and water soluble support and has an excellent surface finish.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PET-CF15 can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PLA] +inherits = *PLA* +filament_vendor = BASF +filament_density = 1.25 +full_fan_speed_layer = 3 +filament_notes = "Material Description\nPLA is one of the most used materials for 3D printing. Ultrafuse PLA is available in a wide range of colors. The glossy feel often attracts those who print display models or items for household use. Many appreciate the plant-based origin of this material. When properly cooled, PLA has a high maximum printing speed and sharp printed corners. Combining this with low warping of the print makes it a popular plastic for home printers, hobbyists, prototyping and schools.\n\nPrinting Recommendations:\nUltrafuse PLA can be printed directly onto a clean build plate." + +[filament:Ultrafuse PP] +inherits = Ultrafuse ABS +filament_density = 0.91 +filament_colour = #F0F0F0 +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 100 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +fan_below_layer_time = 60 +slowdown_below_layer_time = 20 +min_print_speed = 10 +filament_type = PP +filament_max_volumetric_speed = 2.5 +filament_retract_speed = 25 +filament_deretract_speed = 25 +filament_retract_layer_change = 0 +filament_wipe = nil +filament_notes = "Material Description\nUltrafuse PP is high-performance thermoplastic with low density, high elasticity and high resistance to fatigue. The mechanical properties make it an ideal material for 3D-printing applications which have to endure high stress or strain. The filament has high chemical resistance and a high isolation value. PP is one of the most used materials in the world, due to its versatility and ability to engineer lightweight tough parts.\n\nPrinting Recommendations:\nApply PP tape or Magigoo PP adhesive to the buildplate for optimal adhesion." +compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PP-GF30] +inherits = Ultrafuse PP +filament_density = 1.07 +filament_colour = #404040 +first_layer_temperature = 260 +temperature = 250 +first_layer_bed_temperature = 90 +bed_temperature = 40 +min_fan_speed = 40 +max_fan_speed = 75 +fan_always_on = 1 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +filament_notes = "Ultrafuse PP GF30 is polypropylene, reinforced with 30% glass fiber content. The fibers in this compound are specially designed for 3D-printing filaments and are compatible with a wide range of standard FFF 3D-printers. The extreme stiffness makes this material highly suitable for demanding applications. Other key properties of PPGF30 are high heat resistance and improved UV-resistance. All these excellent properties make this filament highly suitable in an industrial environment.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nApply PP strapping tape or PPGF adhesive to a clean build plate for optimal adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse TPC-45D] +inherits = *FLEX* +filament_vendor = BASF +extrusion_multiplier = 1 +filament_density = 1.15 +filament_colour = #0035EC +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 60 +bed_temperature = 60 +min_fan_speed = 10 +max_fan_speed = 50 +bridge_fan_speed = 80 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +fan_always_on = 1 +cooling = 1 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 1.2 +filament_retract_speed = 25 +filament_deretract_speed = 25 +filament_retract_lift = 0 +filament_wipe = nil +filament_retract_before_wipe = nil +filament_retract_before_travel = 2 +filament_retract_layer_change = 0 +filament_notes = "Material Description\nTPC 45D is a flexible, shore 45D, rubber-like Thermoplastic Copolyester Elastomer (TPE-C), which is derived from rapeseed oil and combines the best properties of elastomers (rubbers) and polyesters. The material delivers excellent adhesion in the Z-direction, meaning that the printed layers do not detach - even with extreme deformation.\n\nPrinting Recommendations:\nApply Magigoo Flex to a clean build plate to improve adhesion." + +## [filament:Ultrafuse TPS-90A] +## inherits = Ultrafuse TPC-45D +## filament_density = 1.04 +## extrusion_multiplier = 1.02 +## filament_colour = #FFFFFF +## first_layer_temperature = 270 +## temperature = 265 +## first_layer_bed_temperature = 30 +## bed_temperature = 30 +## min_fan_speed = 20 +## max_fan_speed = 75 +## filament_notes = "Material Description\nUltrafuse® TPS 90A is an elastomer based on the raw material SEBS. The combination of durable and flexible building blocks leads to a very versatile material. Compared to other flexible 3D printing materials it shows more rubber-like soft touch haptics and better non-slip properties. Furthermore, the material shows a reduced moisture uptake, which allows for printing without pre-drying. Parts printed with Ultrafuse® TPS 90A show almost no visible layers or warpage, which makes it an excellent material choice for end-use parts. Producing multi-material parts is possible by printing it together with ABS.\n\nPrinting Recommendations:\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion." + +[filament:Ultrafuse TPU-64D] +inherits = Ultrafuse TPC-45D +filament_density = 1.16 +first_layer_temperature = 230 +temperature = 225 +first_layer_bed_temperature = 40 +bed_temperature = 40 +min_fan_speed = 20 +max_fan_speed = 100 +filament_notes = "Material Description\nUltrafuse® TPU 64D is the hardest elastomer in BASF Forward AM’s flexible productline. The material shows a relatively high rigidity while maintaining a certain flexibility. This filament is the perfect match for industrial applications requiring rigid parts being resistant to impact, wear and tear. Due to its property profile, the material can be used as an alternative for parts made from ABS and rubbers. Ultrafuse® TPU 64D is easy to print on direct drive and bowden style printers and is compatible with soluble BVOH support to realize the most complex geometries.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-85A] +inherits = Ultrafuse TPU-64D +filament_density = 1.11 +first_layer_temperature = 225 +temperature = 220 +filament_notes = "Material Description\nUltrafuse® TPU 85A comes in its natural white color. Chemical properties (e.g. resistance against particular substances) and tolerance for solvents can be made available, if these factors are relevant for a specific application. Generally, these properties correspond to publicly available data on polyether based TPUs. This material is not FDA conform. Good flexibility at low temperature, good wear performance and good damping behavior are the key features of Ultrafuse® TPU 85A.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-95A] +inherits = Ultrafuse TPU-85A +filament_density = 1.14 +first_layer_temperature = 230 +temperature = 225 +filament_notes = "Material Description\nUltrafuse® TPU 95A comes with a well-balanced profile of flexibility and durability. On top of that, it allows for easier and faster printing then softer TPU grades. Parts printed with Ultrafuse® TPU 95A show a high elongation, good impact resistance, excellent layer adhesion and a good resistance to oils and common industrially used chemicals. Due to its good printing behavior, Ultrafuse® TPU 95A is a good choice for starting printing flexible materials on both direct drive and bowden style printers.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse rPET] +inherits = Ultrafuse PET +filament_density = 1.27 +filament_colour = #9DC5FF +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 80 +bed_temperature = 75 +min_fan_speed = 50 +max_fan_speed = 100 +fan_below_layer_time = 15 +filament_notes = "Material Description\nPET is mainly known by the well-known PET bottle material. This recycled has a natural transparent blueish look. It has excellent 3D printing properties and good mechanical characteristics." +filament_retract_length = 1.2 +filament_retract_lift = 0.6 +filament_wipe = nil [filament:Ultrafuse Metal] inherits = *ABSC* @@ -4629,7 +4919,7 @@ material_colour = #FF8040 inherits = *common 0.025* exposure_time = 12 initial_exposure_time = 30 -material_type = Tough +material_type = Casting material_vendor = 3DM material_colour = #B0B000 @@ -5084,6 +5374,38 @@ material_type = Tough material_vendor = Ameralabs material_colour = #C0C0C0 +[sla_material:PrimaCreator Tough Light Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.025] +inherits = *common 0.025* +exposure_time = 4.5 +initial_exposure_time = 30 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + [sla_material:Siraya Tech Simple Clear @0.025] inherits = *common 0.025* exposure_time = 8 @@ -5371,7 +5693,7 @@ inherits = *common 0.05* exposure_time = 12 initial_exposure_time = 45 material_type = Tough -material_vendor = Monocure +material_vendor = 3DM material_colour = #EC0000 [sla_material:Esun Bio-Photopolymer Resin White @0.05] @@ -5550,6 +5872,38 @@ material_type = Tough material_vendor = Photocentric material_colour = #C0C0C0 +[sla_material:PrimaCreator Tough Light Grey @0.05] +inherits = *common 0.05* +exposure_time = 8.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.05] +inherits = *common 0.05* +exposure_time = 7.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.05] +inherits = *common 0.05* +exposure_time = 6.5 +initial_exposure_time = 30 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + [sla_material:Siraya Tech Simple Clear @0.05] inherits = *common 0.05* exposure_time = 10 @@ -6270,6 +6624,38 @@ material_type = Tough material_vendor = Made for Prusa material_colour = #FF8040 +[sla_material:PrimaCreator Tough Light Grey @0.1] +inherits = *common 0.1* +exposure_time = 14 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.1] +inherits = *common 0.1* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + ## SL1S materials ## ## 0.025 SL1S @@ -6916,6 +7302,310 @@ material_type = Tough material_vendor = Peopoly material_colour = #F8F8F8 +[sla_material:3DM-ABS @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.6 +initial_exposure_time = 25 +material_type = Tough +material_vendor = 3DM +material_colour = #FF8040 + +[sla_material:3DM-DENT @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 36 +material_type = Dental +material_vendor = 3DM +material_colour = #FFEEE6 + +[sla_material:3DM-HR Green @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 28 +material_type = Tough +material_vendor = 3DM +material_colour = #00B900 + +[sla_material:3DM-HR Red Wine @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 6 +initial_exposure_time = 32 +material_type = Tough +material_vendor = 3DM +material_colour = #EC0000 + +[sla_material:3DM-Vulcan Gold @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Casting +material_vendor = 3DM +material_colour = #B0B000 + +[sla_material:3DM-XPRO White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = 3DM +material_colour = #FFFFFF + +[sla_material:Asiga Denta Model @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Dental +material_vendor = Asiga +material_colour = #FFEEE6 + +[sla_material:Asiga PlasGRAY @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 9.7 +initial_exposure_time = 48 +material_type = Tough +material_vendor = Asiga +material_colour = #C0C0C0 + +[sla_material:BlueCast EcoGray @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = BlueCast +material_colour = #808080 + +[sla_material:BlueCast Phrozen Wax @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5.3 +initial_exposure_time = 40 +material_type = Tough +material_vendor = BlueCast +material_colour = #007EFD + +[sla_material:NextDent Model 2.0 Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4 +initial_exposure_time = 28 +material_type = Dental +material_vendor = NextDent +material_colour = #C0C0C0 + +[sla_material:NextDent Cast Purple @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 16 +material_type = Casting +material_vendor = NextDent +material_colour = #E800E8 + +[sla_material:Siraya Tech Tenacious @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Blu Clear V2 @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Blu Blue @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #007EFD + +[sla_material:Siraya Tech Fast Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #595959 + +[sla_material:Siraya Tech Fast Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #C0C0C0 + +[sla_material:Siraya Tech Simple Clear @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Sculpt @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #C0C0C0 + +[sla_material:Harz Labs Model Resin Cherry @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #EC0000 + +[sla_material:Harz Labs Model Resin Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #595959 + +[sla_material:Harz Labs Basic Resin Red @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #EC0000 + +[sla_material:Resinworks 3D Violet @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Resinworks 3D +material_colour = #E800E8 + +[sla_material:FunToDo Industrial Blend Unpigmented @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 1.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = FunToDo +material_colour = #F8F8F8 + +[sla_material:FunToDo Snow White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = FunToDo +material_colour = #FFFFFF + +[sla_material:FunToDo Ash Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 32 +material_type = Tough +material_vendor = FunToDo +material_colour = #808080 + +[sla_material:Ameralabs AMD 3 LED @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 1.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Ameralabs +material_colour = #808080 + +[sla_material:Dragon Resin Metalshine Metal Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #808080 + +[sla_material:Dragon Resin Metalshine Dark Brass @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #B0B000 + +[sla_material:Dragon Resin Metalshine Brass @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #B0B000 + +[sla_material:Esun Bio-Photopolymer Resin White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Esun +material_colour = #FFFFFF + +[sla_material:Esun Standard Resin Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Esun +material_colour = #595959 + +[sla_material:Monocure 3D Black Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #595959 + +[sla_material:Monocure 3D Blue Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #007EFD + +[sla_material:Monocure 3D Clear Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 32 +material_type = Tough +material_vendor = Monocure +material_colour = #F8F8F8 + +[sla_material:Monocure 3D Grey Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Monocure +material_colour = #C0C0C0 + +[sla_material:Monocure 3D White Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #FFFFFF + +[sla_material:Photocentric Hard Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Photocentric +material_colour = #808080 + ## 0.1 SL1S ## Prusa Polymers 0.1 From 867a38fdb61a224b50e05fd3db5a95eb045a28af Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Wed, 2 Mar 2022 09:50:11 +0100 Subject: [PATCH 033/149] Sync with PrusaSlicer-settings --- resources/profiles/PrusaResearch.idx | 1 + resources/profiles/PrusaResearch.ini | 708 ++++++++++++++++++++++++++- 2 files changed, 700 insertions(+), 9 deletions(-) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index f90ba82799..9ee9035631 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.4.0-rc +1.4.3 Added new filament profiles and SLA materials. 1.4.2 Added SLA material profiles. 1.4.1 Updated firmware version. 1.4.0 Updated for the PrusaSlicer 2.4.0-rc release. Updated SLA material colors. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 71a86dde8e..3182eba6bb 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.4.2 +config_version = 1.4.3 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -477,7 +477,7 @@ perimeter_acceleration = 800 perimeter_speed = 50 solid_infill_speed = 50 top_infill_extrusion_width = 0.4 -top_solid_layers = 7 +top_solid_layers = 8 bridge_flow_ratio = 1 bridge_speed = 25 @@ -1543,6 +1543,7 @@ filament_max_volumetric_speed = 13 [filament:*ABSMINI*] # inherits = *ABS* bed_temperature = 100 +first_layer_bed_temperature = 100 filament_retract_length = 2.7 filament_retract_speed = nil filament_deretract_speed = nil @@ -2914,6 +2915,7 @@ inherits = *PET* filament_vendor = BASF filament_cost = filament_density = 1.33 +filament_colour = #F7F7F7 first_layer_temperature = 220 first_layer_bed_temperature = 70 temperature = 215 @@ -2925,7 +2927,7 @@ bridge_fan_speed = 100 filament_type = PET disable_fan_first_layers = 1 full_fan_speed_layer = 3 -filament_notes = "BASF Forward AM Ultrafuse PET\nMaterial profile version 1.0\n\nMaterial Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion.\n" +filament_notes = "Material Description\nUltrafuse PET is made from a premium PET and prints as easy as PLA, but is much stronger. The filament has a large operating window for printing (temperature vs. speed), so it can be used on every 3D-printer. PET will give you outstanding printing results: a good layer adhesion, a high resolution and it is easy to handle. Ultrafuse PET can be 100% recycled, is watertight and has great colors and finish.\n\nPrinting Recommendations:\nUltrafuse PET can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." filament_retract_length = 2 filament_retract_speed = 40 filament_retract_before_travel = 2 @@ -2943,7 +2945,7 @@ filament_cost = filament_density = 1.25 filament_spool_weight = 0 filament_colour = #FFFFFF -filament_notes = "BASF Forward AM Ultrafuse PLA PRO1\nMaterial profile version 1.0\n\nMaterial Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% – 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate.\n" +filament_notes = "Material Description\nPLA PRO1 is an extremely versatile tough PLA filament made for professionals. It reduces your printing time by 30% – 80%, (subject to printer and object limitations) and the strength exceeds overall mechanical properties of printed ABS parts. Printer settings can be tuned to achieve blazing fast speeds or an unrivaled surface finish. The excellent quality control ensures the highest levels of consistency between colors and batches, it will perform as expected, every time.\n\nPrinting Recommendations:\nUltrafuse PLA PRO1 can be printed directly onto a clean build plate." filament_retract_length = 2 filament_retract_lift = 0 filament_retract_speed = 40 @@ -2969,15 +2971,303 @@ max_fan_speed = 20 bed_temperature = 100 disable_fan_first_layers = 3 filament_colour = #FFFFFF -filament_notes = "BASF Forward AM Ultrafuse ABS\nMaterial profile version 1.0\n\nMaterial Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion.\n" -filament_retract_length = 2 -filament_retract_speed = 40 +filament_notes = "Material Description\nABS is the second most used 3D printing material. It is strong, flexible and has a high heat resistance. ABS is a preferred plastic for engineers and professional applications. ABS can be smoothened with acetone. To make a proper 3D print with ABS you will need a heated print bed. The filament is available in 9 colors.\n\nPrinting Recommendations:\n\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion." filament_retract_before_travel = 2 filament_wipe = 0 filament_retract_layer_change = 0 [filament:Ultrafuse ABS @MINI] inherits = Ultrafuse ABS; *ABSMINI* +filament_retract_layer_change = nil + +[filament:Ultrafuse ABS Fusion+] +inherits = Ultrafuse ABS +filament_density = 1.08 +first_layer_bed_temperature = 105 +temperature = 250 +filament_colour = #FFF8D9 +filament_notes = "Material Description\nABS Fusion+ made with Polyscope XILOYâ„¢ 3D is an engineering filament which has been optimized for 3D-printing. This special grade has been developed in collaboration with Polyscope Polymers - renowned for its material solutions in the automotive industry. ABS is a thermoplastic which is used in many applications. Although ABS has been classified as a standard material in 3D-printing it is known to be quite challenging to process. ABS Fusion+ combines the properties of ABS with an improved processability. The filament is based on an ABS grade which can be directly printed on glass without any adhesives or tape and has a higher success rate of prints due to extreme low warping." +filament_retract_before_travel = 2 +filament_wipe = nil +filament_retract_layer_change = 0 +filament_retract_lift = 0 + +[filament:Ultrafuse ABS Fusion+ @MINI] +inherits = Ultrafuse ABS Fusion+; *ABSMINI* +first_layer_bed_temperature = 100 +filament_retract_layer_change = nil + +[filament:Ultrafuse ASA] +inherits = Ultrafuse ABS Fusion+ +filament_density = 1.07 +filament_colour = #FFF4CA +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 110 +bed_temperature = 105 +filament_type = ASA +min_fan_speed = 25 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 4 +filament_max_volumetric_speed = 5 +filament_notes = "Material Description\nUltrafuse ASA is a high-performance thermoplastic with similar mechanical properties as ABS. ASA offers additional benefits such as high outdoor weather resistance. The UV resistance, toughness, and rigidity make it an ideal material to 3D-print outdoor fixtures and appliances without losing its properties or color. When also taking into account the high heat resistance and high chemical resistance, this filament is a good choice for many types of applications.\n\nPrinting Recommendations:\nApply Magigoo PC, 3D lac or Dimafix to a clean build plate to improve adhesion." + +[filament:Ultrafuse ASA @MINI] +inherits = Ultrafuse ASA; *ABSMINI* +filament_type = ASA + +[filament:Ultrafuse HIPS] +inherits = Ultrafuse ABS +temperature = 250 +filament_density = 1.02 +filament_type = HIPS +min_fan_speed = 20 +max_fan_speed = 20 +filament_soluble = 1 +filament_notes = "Material Description\nUltrafuse HIPS is a high-quality engineering thermoplastic, which is well known in the 3D-printing industry as a support material for ABS. But this material has additional properties to offer like good impact resistance, good dimensional stability, and easy post-processing. HiPS is a great material to use as a support for ABS because there is a good compatibility between the two materials, and HIPS is an easy breakaway support. Now you have the opportunity to create ABS models with complex geometry. HIPS is easy to post process with glue or with sanding paper." + +[filament:Ultrafuse HIPS @MINI] +inherits = Ultrafuse HIPS; *ABSMINI* +filament_type = HIPS +min_fan_speed = 20 +max_fan_speed = 20 + +[filament:Ultrafuse PA] +inherits = Fillamentum Nylon FX256 +filament_vendor = BASF +filament_density = 1.12 +filament_colour = #ECFAFF +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 0 +max_fan_speed = 0 +bridge_fan_speed = 0 +fan_below_layer_time = 30 +slowdown_below_layer_time = 20 +min_print_speed = 15 +filament_max_volumetric_speed = 11 +filament_retract_length = 1 +filament_retract_lift = 0 +filament_retract_before_travel = 2 +filament_retract_layer_change = 0 +filament_cost = 0 +filament_spool_weight = 0 +compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0" +filament_notes = "Material Description\nThe key features of Ultrafuse PA are the high strength and high modulus. Furthermore, Ultrafuse PA shows a good thermal distortion stability.\n\nPrinting Recommendations:\nApply PVA glue, Kapton tape or PA adhesive to a clean buildplate to improve adhesion." + +[filament:Ultrafuse PA6 GF30] +inherits = Ultrafuse PA +filament_density = 1.17 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 100 +bed_temperature = 100 +filament_colour = #404040 +fan_always_on = 1 +min_fan_speed = 0 +max_fan_speed = 50 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +filament_max_volumetric_speed = 10 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +filament_notes = "Material Description\nUltrafuse® PA6 GF30 is a unique compound specifically developed for FFF printing. Due to the glass fiber content of 30%, parts tend to warp less. In addition the excellent layer adhesion and its compatibility with the water soluble support Ultrafuse® BVOH make this material the perfect solution to develop industrial applications on an FFF printer.\n\nWith its high wear and chemical resistance, high stiffness and strength, Ultrafuse® PA6 GF30 is perfect for a wide variety of applications in automotive, electronics or transportation.\n\nUltrafuse PA6 GF30 is designed for functional prototyping and demanding applications such as industrial tooling, transportation, electronics, small appliances, sports & leisure\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PA6 GF30 can be printed directly onto a clean build plate. For challenging prints, use Magigoo PA gluestick to improve adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PAHT-CF15] +inherits = Ultrafuse PA6 GF30 +filament_density = 1.23 +filament_notes = "Material Description\nPAHT CF15 is a high-performance 3D printing filament that opens new application fields in FFF printing. In parallel to its advanced mechanical properties, dimensional stability, and chemical resistance, it has very good processability. It works in any FFF printer with a hardened nozzle. In addition to that, it is compatible with water-soluble support material and HiPS, which allow printing complex geometries that work in challenging environments. PAHT CF15 has high heat resistance up to 130 °C and low moisture absorption.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PAHT-CF can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." + +[filament:Ultrafuse PC-ABS-FR] +inherits = Ultrafuse ABS +filament_colour = #505050 +filament_density = 1.17 +first_layer_temperature = 275 +temperature = 275 +first_layer_bed_temperature = 110 +bed_temperature = 105 +filament_type = PC +filament_max_volumetric_speed = 8 +filament_wipe = nil +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +disable_fan_first_layers = 4 +compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +filament_notes = "Material Description\nUltrafuse® PC/ABS FR Black is a V-0 flame retardant blend of Polycarbonate and ABS – two of the most used thermoplastics for engineering & electrical applications. The combination of these two materials results in a premium material with a mix of the excellent mechanical properties of PC and the comparably low printing temperature of ABS. Combined with a halogen free flame retardant, parts printed with Ultrafuse® PC/ABS FR Black feature great tensile and impact strength, higher thermal resistance than ABS and can fulfill the requirements of the UL94 V-0 standard.\n\nPrinting Recommendations:\nApply Magigoo PC to a clean build plate to improve adhesion." +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" + +[filament:Ultrafuse PET-CF15] +inherits = Ultrafuse PET +filament_density = 1.36 +filament_colour = #404040 +first_layer_temperature = 270 +temperature = 270 +first_layer_bed_temperature = 75 +bed_temperature = 75 +min_fan_speed = 60 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +slowdown_below_layer_time = 15 +fan_below_layer_time = 30 +filament_max_volumetric_speed = 10 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" +filament_notes = "Material Description\nPET CF15 is a Carbon Fiber reinforced PET which has precisely tuned material properties, for a wide range of technical applications. The filament is very strong and stiff and has high heat resistance. With its high dimensional stability and low abrasiveness, the filament offers an easy to print experience which allows direct printing on glass or a PEI sheet. It is compatible with HiPS for breakaway support and water soluble support and has an excellent surface finish.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nUltrafuse PET-CF15 can be printed directly onto a clean build plate. For challenging prints, use 3dLac to improve adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PLA] +inherits = *PLA* +filament_vendor = BASF +filament_density = 1.25 +full_fan_speed_layer = 3 +filament_notes = "Material Description\nPLA is one of the most used materials for 3D printing. Ultrafuse PLA is available in a wide range of colors. The glossy feel often attracts those who print display models or items for household use. Many appreciate the plant-based origin of this material. When properly cooled, PLA has a high maximum printing speed and sharp printed corners. Combining this with low warping of the print makes it a popular plastic for home printers, hobbyists, prototyping and schools.\n\nPrinting Recommendations:\nUltrafuse PLA can be printed directly onto a clean build plate." + +[filament:Ultrafuse PP] +inherits = Ultrafuse ABS +filament_density = 0.91 +filament_colour = #F0F0F0 +first_layer_temperature = 240 +temperature = 240 +first_layer_bed_temperature = 80 +bed_temperature = 70 +min_fan_speed = 100 +max_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +full_fan_speed_layer = 3 +fan_below_layer_time = 60 +slowdown_below_layer_time = 20 +min_print_speed = 10 +filament_type = PP +filament_max_volumetric_speed = 2.5 +filament_retract_speed = 25 +filament_deretract_speed = 25 +filament_retract_layer_change = 0 +filament_wipe = nil +filament_notes = "Material Description\nUltrafuse PP is high-performance thermoplastic with low density, high elasticity and high resistance to fatigue. The mechanical properties make it an ideal material for 3D-printing applications which have to endure high stress or strain. The filament has high chemical resistance and a high isolation value. PP is one of the most used materials in the world, due to its versatility and ability to engineer lightweight tough parts.\n\nPrinting Recommendations:\nApply PP tape or Magigoo PP adhesive to the buildplate for optimal adhesion." +compatible_printers_condition = printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse PP-GF30] +inherits = Ultrafuse PP +filament_density = 1.07 +filament_colour = #404040 +first_layer_temperature = 260 +temperature = 250 +first_layer_bed_temperature = 90 +bed_temperature = 40 +min_fan_speed = 40 +max_fan_speed = 75 +fan_always_on = 1 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +filament_retract_length = 1.2 +filament_retract_speed = 40 +filament_deretract_speed = 30 +filament_retract_lift = nil +filament_wipe = 0 +filament_notes = "Ultrafuse PP GF30 is polypropylene, reinforced with 30% glass fiber content. The fibers in this compound are specially designed for 3D-printing filaments and are compatible with a wide range of standard FFF 3D-printers. The extreme stiffness makes this material highly suitable for demanding applications. Other key properties of PPGF30 are high heat resistance and improved UV-resistance. All these excellent properties make this filament highly suitable in an industrial environment.\n\nPrinting Recommendations:\nThis material contains fibers that have an abrasive effect on printer components. Use a hardened or Ruby nozzle with a diameter of 0.6 or larger for optimal performance and avoid damage to the nozzle.\n\nApply PP strapping tape or PPGF adhesive to a clean build plate for optimal adhesion." +compatible_printers_condition = nozzle_diameter[0]>=0.6 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Ultrafuse TPC-45D] +inherits = *FLEX* +filament_vendor = BASF +extrusion_multiplier = 1 +filament_density = 1.15 +filament_colour = #0035EC +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 60 +bed_temperature = 60 +min_fan_speed = 10 +max_fan_speed = 50 +bridge_fan_speed = 80 +fan_below_layer_time = 30 +slowdown_below_layer_time = 15 +min_print_speed = 15 +fan_always_on = 1 +cooling = 1 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 1.2 +filament_retract_speed = 25 +filament_deretract_speed = 25 +filament_retract_lift = 0 +filament_wipe = nil +filament_retract_before_wipe = nil +filament_retract_before_travel = 2 +filament_retract_layer_change = 0 +filament_notes = "Material Description\nTPC 45D is a flexible, shore 45D, rubber-like Thermoplastic Copolyester Elastomer (TPE-C), which is derived from rapeseed oil and combines the best properties of elastomers (rubbers) and polyesters. The material delivers excellent adhesion in the Z-direction, meaning that the printed layers do not detach - even with extreme deformation.\n\nPrinting Recommendations:\nApply Magigoo Flex to a clean build plate to improve adhesion." + +## [filament:Ultrafuse TPS-90A] +## inherits = Ultrafuse TPC-45D +## filament_density = 1.04 +## extrusion_multiplier = 1.02 +## filament_colour = #FFFFFF +## first_layer_temperature = 270 +## temperature = 265 +## first_layer_bed_temperature = 30 +## bed_temperature = 30 +## min_fan_speed = 20 +## max_fan_speed = 75 +## filament_notes = "Material Description\nUltrafuse® TPS 90A is an elastomer based on the raw material SEBS. The combination of durable and flexible building blocks leads to a very versatile material. Compared to other flexible 3D printing materials it shows more rubber-like soft touch haptics and better non-slip properties. Furthermore, the material shows a reduced moisture uptake, which allows for printing without pre-drying. Parts printed with Ultrafuse® TPS 90A show almost no visible layers or warpage, which makes it an excellent material choice for end-use parts. Producing multi-material parts is possible by printing it together with ABS.\n\nPrinting Recommendations:\nApply Tape, adhesion spray or glue to a clean build plate to improve adhesion." + +[filament:Ultrafuse TPU-64D] +inherits = Ultrafuse TPC-45D +filament_density = 1.16 +first_layer_temperature = 230 +temperature = 225 +first_layer_bed_temperature = 40 +bed_temperature = 40 +min_fan_speed = 20 +max_fan_speed = 100 +filament_notes = "Material Description\nUltrafuse® TPU 64D is the hardest elastomer in BASF Forward AM’s flexible productline. The material shows a relatively high rigidity while maintaining a certain flexibility. This filament is the perfect match for industrial applications requiring rigid parts being resistant to impact, wear and tear. Due to its property profile, the material can be used as an alternative for parts made from ABS and rubbers. Ultrafuse® TPU 64D is easy to print on direct drive and bowden style printers and is compatible with soluble BVOH support to realize the most complex geometries.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-85A] +inherits = Ultrafuse TPU-64D +filament_density = 1.11 +first_layer_temperature = 225 +temperature = 220 +filament_notes = "Material Description\nUltrafuse® TPU 85A comes in its natural white color. Chemical properties (e.g. resistance against particular substances) and tolerance for solvents can be made available, if these factors are relevant for a specific application. Generally, these properties correspond to publicly available data on polyether based TPUs. This material is not FDA conform. Good flexibility at low temperature, good wear performance and good damping behavior are the key features of Ultrafuse® TPU 85A.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse TPU-95A] +inherits = Ultrafuse TPU-85A +filament_density = 1.14 +first_layer_temperature = 230 +temperature = 225 +filament_notes = "Material Description\nUltrafuse® TPU 95A comes with a well-balanced profile of flexibility and durability. On top of that, it allows for easier and faster printing then softer TPU grades. Parts printed with Ultrafuse® TPU 95A show a high elongation, good impact resistance, excellent layer adhesion and a good resistance to oils and common industrially used chemicals. Due to its good printing behavior, Ultrafuse® TPU 95A is a good choice for starting printing flexible materials on both direct drive and bowden style printers.\n\nPrinting Recommendations:\nUltrafuse TPU can be printed directly onto a clean build plate. A small amount of 3Dlac can make removal easier after printing." + +[filament:Ultrafuse rPET] +inherits = Ultrafuse PET +filament_density = 1.27 +filament_colour = #9DC5FF +first_layer_temperature = 235 +temperature = 235 +first_layer_bed_temperature = 80 +bed_temperature = 75 +min_fan_speed = 50 +max_fan_speed = 100 +fan_below_layer_time = 15 +filament_notes = "Material Description\nPET is mainly known by the well-known PET bottle material. This recycled has a natural transparent blueish look. It has excellent 3D printing properties and good mechanical characteristics." +filament_retract_length = 1.2 +filament_retract_lift = 0.6 +filament_wipe = nil [filament:Ultrafuse Metal] inherits = *ABSC* @@ -4629,7 +4919,7 @@ material_colour = #FF8040 inherits = *common 0.025* exposure_time = 12 initial_exposure_time = 30 -material_type = Tough +material_type = Casting material_vendor = 3DM material_colour = #B0B000 @@ -5084,6 +5374,38 @@ material_type = Tough material_vendor = Ameralabs material_colour = #C0C0C0 +[sla_material:PrimaCreator Tough Light Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.025] +inherits = *common 0.025* +exposure_time = 4.5 +initial_exposure_time = 30 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + [sla_material:Siraya Tech Simple Clear @0.025] inherits = *common 0.025* exposure_time = 8 @@ -5371,7 +5693,7 @@ inherits = *common 0.05* exposure_time = 12 initial_exposure_time = 45 material_type = Tough -material_vendor = Monocure +material_vendor = 3DM material_colour = #EC0000 [sla_material:Esun Bio-Photopolymer Resin White @0.05] @@ -5550,6 +5872,38 @@ material_type = Tough material_vendor = Photocentric material_colour = #C0C0C0 +[sla_material:PrimaCreator Tough Light Grey @0.05] +inherits = *common 0.05* +exposure_time = 8.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.05] +inherits = *common 0.05* +exposure_time = 7.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.05] +inherits = *common 0.05* +exposure_time = 6.5 +initial_exposure_time = 30 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + [sla_material:Siraya Tech Simple Clear @0.05] inherits = *common 0.05* exposure_time = 10 @@ -6270,6 +6624,38 @@ material_type = Tough material_vendor = Made for Prusa material_colour = #FF8040 +[sla_material:PrimaCreator Tough Light Grey @0.1] +inherits = *common 0.1* +exposure_time = 14 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #C0C0C0 + +[sla_material:PrimaCreator Tough Clear @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #F8F8F8 + +[sla_material:PrimaCreator Tough White @0.1] +inherits = *common 0.1* +exposure_time = 13 +initial_exposure_time = 45 +material_type = Tough +material_vendor = PrimaCreator +material_colour = #FFFFFF + +[sla_material:PrimaCreator Flex Clear @0.1] +inherits = *common 0.1* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Flexible +material_vendor = PrimaCreator +material_colour = #F8F8F8 + ## SL1S materials ## ## 0.025 SL1S @@ -6916,6 +7302,310 @@ material_type = Tough material_vendor = Peopoly material_colour = #F8F8F8 +[sla_material:3DM-ABS @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.6 +initial_exposure_time = 25 +material_type = Tough +material_vendor = 3DM +material_colour = #FF8040 + +[sla_material:3DM-DENT @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 36 +material_type = Dental +material_vendor = 3DM +material_colour = #FFEEE6 + +[sla_material:3DM-HR Green @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 28 +material_type = Tough +material_vendor = 3DM +material_colour = #00B900 + +[sla_material:3DM-HR Red Wine @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 6 +initial_exposure_time = 32 +material_type = Tough +material_vendor = 3DM +material_colour = #EC0000 + +[sla_material:3DM-Vulcan Gold @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Casting +material_vendor = 3DM +material_colour = #B0B000 + +[sla_material:3DM-XPRO White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = 3DM +material_colour = #FFFFFF + +[sla_material:Asiga Denta Model @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Dental +material_vendor = Asiga +material_colour = #FFEEE6 + +[sla_material:Asiga PlasGRAY @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 9.7 +initial_exposure_time = 48 +material_type = Tough +material_vendor = Asiga +material_colour = #C0C0C0 + +[sla_material:BlueCast EcoGray @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = BlueCast +material_colour = #808080 + +[sla_material:BlueCast Phrozen Wax @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5.3 +initial_exposure_time = 40 +material_type = Tough +material_vendor = BlueCast +material_colour = #007EFD + +[sla_material:NextDent Model 2.0 Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4 +initial_exposure_time = 28 +material_type = Dental +material_vendor = NextDent +material_colour = #C0C0C0 + +[sla_material:NextDent Cast Purple @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 16 +material_type = Casting +material_vendor = NextDent +material_colour = #E800E8 + +[sla_material:Siraya Tech Tenacious @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Blu Clear V2 @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Blu Blue @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #007EFD + +[sla_material:Siraya Tech Fast Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #595959 + +[sla_material:Siraya Tech Fast Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #C0C0C0 + +[sla_material:Siraya Tech Simple Clear @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #F8F8F8 + +[sla_material:Siraya Tech Sculpt @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Siraya Tech +material_colour = #C0C0C0 + +[sla_material:Harz Labs Model Resin Cherry @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #EC0000 + +[sla_material:Harz Labs Model Resin Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #595959 + +[sla_material:Harz Labs Basic Resin Red @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 4.3 +initial_exposure_time = 16 +material_type = Tough +material_vendor = Harz Labs +material_colour = #EC0000 + +[sla_material:Resinworks 3D Violet @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Resinworks 3D +material_colour = #E800E8 + +[sla_material:FunToDo Industrial Blend Unpigmented @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 1.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = FunToDo +material_colour = #F8F8F8 + +[sla_material:FunToDo Snow White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = FunToDo +material_colour = #FFFFFF + +[sla_material:FunToDo Ash Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3 +initial_exposure_time = 32 +material_type = Tough +material_vendor = FunToDo +material_colour = #808080 + +[sla_material:Ameralabs AMD 3 LED @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 1.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Ameralabs +material_colour = #808080 + +[sla_material:Dragon Resin Metalshine Metal Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #808080 + +[sla_material:Dragon Resin Metalshine Dark Brass @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #B0B000 + +[sla_material:Dragon Resin Metalshine Brass @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 10 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Dragon Resin +material_colour = #B0B000 + +[sla_material:Esun Bio-Photopolymer Resin White @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Esun +material_colour = #FFFFFF + +[sla_material:Esun Standard Resin Black @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Esun +material_colour = #595959 + +[sla_material:Monocure 3D Black Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #595959 + +[sla_material:Monocure 3D Blue Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #007EFD + +[sla_material:Monocure 3D Clear Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 2.7 +initial_exposure_time = 32 +material_type = Tough +material_vendor = Monocure +material_colour = #F8F8F8 + +[sla_material:Monocure 3D Grey Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 25 +material_type = Tough +material_vendor = Monocure +material_colour = #C0C0C0 + +[sla_material:Monocure 3D White Rapid Resin @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 3.3 +initial_exposure_time = 28 +material_type = Tough +material_vendor = Monocure +material_colour = #FFFFFF + +[sla_material:Photocentric Hard Grey @0.05 SL1S] +inherits = *0.05_sl1s* +exposure_time = 5 +initial_exposure_time = 24 +material_type = Tough +material_vendor = Photocentric +material_colour = #808080 + ## 0.1 SL1S ## Prusa Polymers 0.1 From 278ec6fe937ab836efc9c033834581022ad9482c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 10:12:44 +0100 Subject: [PATCH 034/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Layers editing --- src/slic3r/GUI/GLCanvas3D.cpp | 41 +++++++++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 4 ++++ 2 files changed, 45 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1821d36eea..10deca2b47 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -268,7 +268,11 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) m_profile.dirty = m_profile.old_bar_rect != bar_rect; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL render_active_object_annotations(canvas, bar_rect); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_profile(canvas); +#else render_profile(bar_rect); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL m_profile.old_bar_rect = bar_rect; m_profile.dirty = false; @@ -411,16 +415,35 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 shader->stop_using(); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLCanvas3D::LayersEditing::render_profile(const GLCanvas3D& canvas) +#else void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { //FIXME show some kind of legend. if (!m_slicing_parameters) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Size cnv_size = canvas.get_canvas_size(); + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. + const float scale_x = THICKNESS_BAR_WIDTH / float(1.12 * m_slicing_parameters->max_layer_height); + const float scale_y = cnv_height / m_object_max_z; + + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; +#else // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. const float scale_x = bar_rect.get_width() / float(1.12 * m_slicing_parameters->max_layer_height); const float scale_y = bar_rect.get_height() / m_object_max_z; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL // Baseline @@ -434,9 +457,15 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) init_data.reserve_indices(2); // vertices +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float axis_x = 2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_slicing_parameters->layer_height) * scale_x) * cnv_inv_width - 0.5f); + init_data.add_vertex(Vec2f(axis_x, -1.0f)); + init_data.add_vertex(Vec2f(axis_x, 1.0f)); +#else const float x = bar_rect.get_left() + float(m_slicing_parameters->layer_height) * scale_x; init_data.add_vertex(Vec2f(x, bar_rect.get_bottom())); init_data.add_vertex(Vec2f(x, bar_rect.get_top())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // indices init_data.add_ushort_line(0, 1); @@ -456,8 +485,13 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) // vertices + indices for (unsigned int i = 0; i < (unsigned int)m_layer_height_profile.size(); i += 2) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + init_data.add_vertex(Vec2f(2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_layer_height_profile[i + 1]) * scale_x) * cnv_inv_width - 0.5f), + 2.0f * (float(m_layer_height_profile[i]) * scale_y * cnv_inv_height - 0.5))); +#else init_data.add_vertex(Vec2f(bar_rect.get_left() + float(m_layer_height_profile[i + 1]) * scale_x, bar_rect.get_bottom() + float(m_layer_height_profile[i]) * scale_y)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) init_data.add_ushort_index((unsigned short)i / 2); else @@ -467,9 +501,16 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.profile.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.baseline.render(); m_profile.profile.render(); shader->stop_using(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 48fef56110..1f230bc9cf 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -288,7 +288,11 @@ class GLCanvas3D bool is_initialized() const; void generate_layer_height_texture(); void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_profile(const GLCanvas3D& canvas); +#else void render_profile(const Rect& bar_rect); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void update_slicing_parameters(); static float thickness_bar_width(const GLCanvas3D &canvas); From 93afbd551bc37a8f3a9996aaca96eedae99177d9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 11:56:09 +0100 Subject: [PATCH 035/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo Hollow picking --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 67 +++++++++++++++++++++---- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index bc0056fa66..ab8c4552ef 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -104,10 +104,18 @@ void GLGizmoHollow::on_render_for_picking() void GLGizmoHollow::render_points(const Selection& selection, bool picking) { #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light"); +#else GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->start_using(); ScopeGuard guard([shader]() { shader->stop_using(); }); #else @@ -118,12 +126,23 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); +#else const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); - glsafe(::glMultMatrixd(instance_matrix.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); + glsafe(::glMultMatrixd(instance_matrix.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ColorRGBA render_color; const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; @@ -158,9 +177,16 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); @@ -169,17 +195,36 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * + hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + shader->set_uniform("projection_view_model_matrix", matrix); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cylinder.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const From 5193a158528a81c654bf3d474515017b41543dfd Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 12:10:02 +0100 Subject: [PATCH 036/149] Tech ENABLE_GLBEGIN_GLEND_REMOVAL - Use 2D vertices to render GLGizmoPainterBase circle --- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index d3fd294b3e..76e73ab97c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -192,7 +192,7 @@ void GLGizmoPainterBase::render_cursor_circle() GLModel::Geometry init_data; static const unsigned int StepsCount = 32; static const float StepSize = 2.0f * float(PI) / float(StepsCount); - init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::EIndexType::USHORT }; init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f }; init_data.reserve_vertices(StepsCount); init_data.reserve_indices(StepsCount); @@ -200,7 +200,7 @@ void GLGizmoPainterBase::render_cursor_circle() // vertices + indices for (unsigned short i = 0; i < StepsCount; ++i) { const float angle = float(i * StepSize); - init_data.add_vertex(Vec3f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius, 0.0f)); + init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius)); init_data.add_ushort_index(i); } From 5cf6219f3eecea3ee0133b365abaa12694a6c108 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 12:21:59 +0100 Subject: [PATCH 037/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - GLGizmoPainterBase::s_sphere --- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 76e73ab97c..236ab389b6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -239,19 +239,25 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo.data())); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glTranslatef(m_rr.hit.x(), m_rr.hit.y(), m_rr.hit.z())); glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data())); glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (is_left_handed) glFrontFace(GL_CW); @@ -264,6 +270,13 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * trafo * + Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * + Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones()); + shader->set_uniform("projection_view_model_matrix", matrix); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + assert(s_sphere != nullptr); s_sphere->set_color(render_color); #else @@ -280,7 +293,9 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const if (is_left_handed) glFrontFace(GL_CCW); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } From b4f9d91b73013d5d7dc3714693b394fc63fda98c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 13:07:36 +0100 Subject: [PATCH 038/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - debug tech PRUSASLICER_TRIANGLE_SELECTOR_DEBUG --- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 236ab389b6..29f220c527 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1222,9 +1222,17 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) if (curr_shader != nullptr) curr_shader->stop_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); From 4990558dee1817ce5061d1f6fdb24b012e96f42a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 13:28:20 +0100 Subject: [PATCH 039/149] Tech ENABLE_GLBEGIN_GLEND_REMOVAL - Fixed a few bugs when the tech is disabled --- src/slic3r/GUI/3DBed.cpp | 25 +++++++------------- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 10 ++++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 244a802dbc..4ed054fb93 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -593,10 +593,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) if (bottom) glsafe(::glFrontFace(GL_CW)); - unsigned int stride = m_triangles.get_vertex_data_size(); - - GLint position_id = shader->get_attrib_location("v_position"); - GLint tex_coords_id = shader->get_attrib_location("v_tex_coords"); + const unsigned int stride = m_triangles.get_vertex_data_size(); // show the temporary texture while no compressed data is available GLuint tex_id = (GLuint)m_temp_texture.get_id(); @@ -606,22 +603,16 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id)); - if (position_id != -1) { - glsafe(::glEnableVertexAttribArray(position_id)); - glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_position_offset())); - } - if (tex_coords_id != -1) { - glsafe(::glEnableVertexAttribArray(tex_coords_id)); - glsafe(::glVertexAttribPointer(tex_coords_id, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_tex_coords_offset())); - } + glsafe(::glVertexPointer(3, GL_FLOAT, stride, (const void*)(intptr_t)m_triangles.get_position_offset())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + + glsafe(::glTexCoordPointer(2, GL_FLOAT, stride, (const void*)(intptr_t)m_triangles.get_tex_coords_offset())); + glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)m_triangles.get_vertices_count())); - if (tex_coords_id != -1) - glsafe(::glDisableVertexAttribArray(tex_coords_id)); - - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); + glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 76e73ab97c..768bdec250 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1195,11 +1195,11 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) m_varrays[i].init_from(std::move(varrays_data[i])); } #else - for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) - iva->finalize_geometry(true); - - for (auto& iva : m_iva_seed_fills) - iva.finalize_geometry(true); +// for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) +// iva->finalize_geometry(true); +// +// for (auto& iva : m_iva_seed_fills) +// iva.finalize_geometry(true); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 47254e4b3a..55fc52de7c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -245,7 +245,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) m_cylinder.set_color(render_color); #else m_cylinder.set_color(-1, render_color); - if (shader != nu) + if (shader != nullptr) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL shader->set_uniform("emission_factor", 0.5f); for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { From 5621f00ee694e6aaedb83b190c855395a0df2dc6 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 14:31:24 +0100 Subject: [PATCH 040/149] Some refactoring into GLGizmoSlaSupports::render_points() --- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 25 +++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 55fc52de7c..3cdc4e33a4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -120,10 +120,10 @@ void GLGizmoSlaSupports::on_render_for_picking() void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) { - size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + const size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); - bool has_points = (cache_size != 0); - bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() + const bool has_points = (cache_size != 0); + const bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() && ! m_c->selection_info()->model_object()->sla_drain_holes.empty()); if (! has_points && ! has_holes) @@ -147,9 +147,9 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); - float z_shift = m_c->selection_info()->get_sla_shift(); + const float z_shift = m_c->selection_info()->get_sla_shift(); glsafe(::glPushMatrix()); glsafe(::glTranslated(0.0, 0.0, z_shift)); @@ -158,7 +158,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) ColorRGBA render_color; for (size_t i = 0; i < cache_size; ++i) { const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; - const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + const bool point_selected = m_editing_mode ? m_editing_cache[i].selected : false; if (is_mesh_point_clipped(support_point.pos.cast())) continue; @@ -198,7 +198,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2))); + glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); if (vol->is_left_handed()) @@ -213,12 +213,11 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - + const Eigen::AngleAxisd aa(q); + glsafe(::glPushMatrix()); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); const double cone_radius = 0.25; // mm const double cone_height = 0.75; - glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); glsafe(::glRotated(180., 1., 0., 0.)); glsafe(::glScaled(cone_radius, cone_radius, cone_height)); @@ -226,11 +225,9 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glPopMatrix()); } - glsafe(::glPushMatrix()); const double radius = (double)support_point.head_front_radius * RenderPointScale; glsafe(::glScaled(radius, radius, radius)); m_sphere.render(); - glsafe(::glPopMatrix()); if (vol->is_left_handed()) glFrontFace(GL_CCW); @@ -264,7 +261,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - Eigen::AngleAxisd aa(q); + const Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); From a6e84aec20f8c5b5c029126a2e94d401ba570a4e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 2 Mar 2022 15:10:34 +0100 Subject: [PATCH 041/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Gizmo SLA Supports points --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 95 ++++++++++++++++---- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index ab8c4552ef..c0eefaace1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -146,11 +146,11 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) ColorRGBA render_color; const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - size_t cache_size = drain_holes.size(); + const size_t cache_size = drain_holes.size(); for (size_t i = 0; i < cache_size; ++i) { const sla::DrainHole& drain_hole = drain_holes[i]; - const bool& point_selected = m_selected[i]; + const bool point_selected = m_selected[i]; if (is_mesh_point_clipped(drain_hole.pos.cast())) continue; @@ -194,7 +194,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) // Matrices set, we can render the point mark now. Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - Eigen::AngleAxisd aa(q); + const Eigen::AngleAxisd aa(q); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 3cdc4e33a4..853d9a2724 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -130,10 +130,18 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) return; #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light"); +#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->start_using(); ScopeGuard guard([shader]() { shader->stop_using(); }); #else @@ -148,12 +156,22 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); +#else const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); - const float z_shift = m_c->selection_info()->get_sla_shift(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, z_shift)); - glsafe(::glMultMatrixd(instance_matrix.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float z_shift = m_c->selection_info()->get_sla_shift(); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, z_shift)); + glsafe(::glMultMatrixd(instance_matrix.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ColorRGBA render_color; for (size_t i = 0; i < cache_size; ++i) { @@ -197,9 +215,16 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) shader->set_uniform("emission_factor", 0.5f); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d support_matrix = Geometry::assemble_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); @@ -214,25 +239,60 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); const Eigen::AngleAxisd aa(q); - glsafe(::glPushMatrix()); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); const double cone_radius = 0.25; // mm const double cone_height = 0.75; - glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); - glsafe(::glRotated(180., 1., 0., 0.)); - glsafe(::glScaled(cone_radius, cone_radius, cone_height)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * + support_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); + shader->set_uniform("projection_view_model_matrix", matrix); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); + glsafe(::glRotated(180., 1., 0., 0.)); + glsafe(::glScaled(cone_radius, cone_radius, cone_height)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } const double radius = (double)support_point.head_front_radius * RenderPointScale; - glsafe(::glScaled(radius, radius, radius)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * + support_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); + shader->set_uniform("projection_view_model_matrix", matrix); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPushMatrix()); + glsafe(::glScaled(radius, radius, radius)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_sphere.render(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); if (vol->is_left_handed()) glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } // Now render the drain holes: @@ -273,7 +333,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } } - glsafe(::glPopMatrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); } From abb5f5f99a4f4831834a65b1b3d031674020e79f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 08:40:12 +0100 Subject: [PATCH 042/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - GLGizmoPainterBase::m_circle --- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 40 +++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 584372b77d..b849617a3e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -151,11 +151,25 @@ void GLGizmoPainterBase::render_cursor() void GLGizmoPainterBase::render_cursor_circle() { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera &camera = wxGetApp().plater()->get_camera(); const float zoom = float(camera.get_zoom()); const float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Size cnv_size = m_parent.get_canvas_size(); + const Size cnv_size = m_parent.get_canvas_size(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float cnv_width = float(cnv_size.get_width()); + const float cnv_height = float(cnv_size.get_height()); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + + const Vec2d center = m_parent.get_local_mouse_position(); + const float radius = m_cursor_radius * float(wxGetApp().plater()->get_camera().get_zoom()); +#else const float cnv_half_width = 0.5f * float(cnv_size.get_width()); const float cnv_half_height = 0.5f * float(cnv_size.get_height()); if (cnv_half_width == 0.0f || cnv_half_height == 0.0f) @@ -163,6 +177,7 @@ void GLGizmoPainterBase::render_cursor_circle() const Vec2d mouse_pos(m_parent.get_local_mouse_position().x(), m_parent.get_local_mouse_position().y()); Vec2d center(mouse_pos.x() - cnv_half_width, cnv_half_height - mouse_pos.y()); center = center * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.5f)); #if !ENABLE_GLBEGIN_GLEND_REMOVAL @@ -171,6 +186,7 @@ void GLGizmoPainterBase::render_cursor_circle() #endif // !ENABLE_GLBEGIN_GLEND_REMOVAL glsafe(::glDisable(GL_DEPTH_TEST)); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the circle is renderered inside the frustrum @@ -178,15 +194,21 @@ void GLGizmoPainterBase::render_cursor_circle() // ensure that the overlay fits the frustrum near z plane const double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { + m_old_cursor_radius = radius; +#else if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - m_cursor_radius) > EPSILON) { - m_old_center = center; m_old_cursor_radius = m_cursor_radius; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_old_center = center; m_circle.reset(); GLModel::Geometry init_data; @@ -200,16 +222,28 @@ void GLGizmoPainterBase::render_cursor_circle() // vertices + indices for (unsigned short i = 0; i < StepsCount; ++i) { const float angle = float(i * StepSize); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), + -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); +#else init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES init_data.add_ushort_index(i); } m_circle.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); +#else GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_circle.render(); shader->stop_using(); } @@ -221,7 +255,9 @@ void GLGizmoPainterBase::render_cursor_circle() #endif // ENABLE_GLBEGIN_GLEND_REMOVAL glsafe(::glPopAttrib()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); } From 8315f43ed02ae67e05d16337687a9e4246b9d9e9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 09:21:52 +0100 Subject: [PATCH 043/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Bed axes --- resources/shaders/gouraud_light_attr.vs | 45 +++++++++++++++++++++++++ src/slic3r/GUI/3DBed.cpp | 27 +++++++++++++++ src/slic3r/GUI/GLShader.cpp | 7 ++++ src/slic3r/GUI/GLShader.hpp | 6 ++++ src/slic3r/GUI/GLShadersManager.cpp | 3 ++ 5 files changed, 88 insertions(+) create mode 100644 resources/shaders/gouraud_light_attr.vs diff --git a/resources/shaders/gouraud_light_attr.vs b/resources/shaders/gouraud_light_attr.vs new file mode 100644 index 0000000000..2e1b5fb429 --- /dev/null +++ b/resources/shaders/gouraud_light_attr.vs @@ -0,0 +1,45 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +attribute vec3 v_position; +attribute vec3 v_normal; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * position; +} diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 16703ed077..f75dafc207 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -109,17 +109,32 @@ const float Bed3D::Axes::DefaultTipLength = 5.0f; void Bed3D::Axes::render() { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto render_axis = [this](GLShaderProgram* shader, const Transform3d& transform) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * transform; + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else auto render_axis = [this](const Transform3f& transform) { glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(transform.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES }; if (!m_arrow.is_initialized()) m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -134,7 +149,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::X()); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_axis(shader, Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); +#else render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // y axis #if ENABLE_GLBEGIN_GLEND_REMOVAL @@ -142,7 +161,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::Y()); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_axis(shader, Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); +#else render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // z axis #if ENABLE_GLBEGIN_GLEND_REMOVAL @@ -150,7 +173,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::Z()); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_axis(shader, Geometry::assemble_transform(m_origin)); +#else render_axis(Geometry::assemble_transform(m_origin).cast()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->stop_using(); diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 32b3d59601..7ee4bc1665 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -296,6 +296,13 @@ void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const +{ + set_uniform(id, (Matrix3f)value.cast()); +} +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void GLShaderProgram::set_uniform(int id, const Vec3f& value) const { if (id >= 0) diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index 06a5c00e5c..e5b934fca7 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -61,6 +61,9 @@ public: void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } @@ -80,6 +83,9 @@ public: void set_uniform(int id, const Transform3f& value) const; void set_uniform(int id, const Transform3d& value) const; void set_uniform(int id, const Matrix3f& value) const; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void set_uniform(int id, const Matrix3d& value) const; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void set_uniform(int id, const Vec3f& value) const; void set_uniform(int id, const Vec3d& value) const; void set_uniform(int id, const ColorRGB& value) const; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 70b1b6c316..eda9097202 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -49,6 +49,9 @@ std::pair GLShadersManager::init() valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); #endif // ENABLE_SHOW_TOOLPATHS_COG // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("gouraud_light_attr", { "gouraud_light_attr.vs", "gouraud_light.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); // used to render printbed valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); From a3753c9d9cbeefb8d1baa96f5138117965a13bff Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 09:29:54 +0100 Subject: [PATCH 044/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Bed model --- src/slic3r/GUI/3DBed.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index f75dafc207..ddd56c7a28 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -681,14 +681,28 @@ void Bed3D::render_model() } if (!m_model.get_filename().empty()) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.0f); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_model_offset); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_model_offset.x(), m_model_offset.y(), m_model_offset.z())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->stop_using(); } } From 8d43a854c60f9d186ce304e6d7f335deca3bf2ab Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 09:46:04 +0100 Subject: [PATCH 045/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Sequential view marker --- src/slic3r/GUI/GCodeViewer.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index cfe6fe418a..022283c387 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -315,7 +315,11 @@ void GCodeViewer::SequentialView::Marker::render() if (!m_visible) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -325,12 +329,22 @@ void GCodeViewer::SequentialView::Marker::render() shader->start_using(); shader->set_uniform("emission_factor", 0.0f); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * m_world_transform.cast(); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(m_world_transform.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.render(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->stop_using(); From 3003db411f87f477311078d2a194393b71b3ce3c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 09:56:13 +0100 Subject: [PATCH 046/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - GCodeViewer shells --- src/slic3r/GUI/3DScene.cpp | 9 ++++++++- src/slic3r/GUI/GCodeViewer.cpp | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 8093cb0de4..dad2f5ade9 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -714,7 +714,14 @@ void GLVolume::render() glsafe(::glCullFace(GL_BACK)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - if (!use_attributes) { + if (use_attributes) { + const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * world_matrix(); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + } + else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(world_matrix().data())); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 022283c387..86da8cf9a4 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3235,7 +3235,11 @@ void GCodeViewer::render_shells() if (!m_shells.visible || m_shells.volumes.empty()) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; From 34a0f6d970456940bb879878d646c77e77d68fb2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 3 Mar 2022 11:16:57 +0100 Subject: [PATCH 047/149] Bumped up version to 2.4.1-rc1 --- src/slic3r/GUI/GUI_App.cpp | 5 +++-- version.inc | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 6a05cfa767..53675bb364 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -868,9 +868,10 @@ static boost::optional parse_semver_from_ini(std::string path) void GUI_App::init_app_config() { // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release. -// SetAppName(SLIC3R_APP_KEY); + SetAppName(SLIC3R_APP_KEY); // SetAppName(SLIC3R_APP_KEY "-alpha"); - SetAppName(SLIC3R_APP_KEY "-beta"); +// SetAppName(SLIC3R_APP_KEY "-beta"); + // SetAppDisplayName(SLIC3R_APP_NAME); // Set the Slic3r data directory at the Slic3r XS module. diff --git a/version.inc b/version.inc index 26b4895b6d..d5ec2b3f26 100644 --- a/version.inc +++ b/version.inc @@ -3,7 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -set(SLIC3R_VERSION "2.4.1-beta3") +set(SLIC3R_VERSION "2.4.1-rc1") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,4,1,0") set(SLIC3R_RC_VERSION_DOTS "2.4.1.0") From a3b9d1d82fee94d74a5fa5e206487705027ca79b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 3 Mar 2022 11:47:16 +0100 Subject: [PATCH 048/149] Added a comment explaining activate_gizmo return value --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 7df2999f13..fba02963f3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -907,6 +907,10 @@ void GLGizmosManager::update_hover_state(const EType &type) m_tooltip = hovered_gizmo.get_name(); } + + +// Activate given gizmo. Returns true if successful, false in case that current +// gizmo vetoed its deactivation. bool GLGizmosManager::activate_gizmo(EType type) { assert(!m_gizmos.empty()); From 14f43453894b08e907155638a4ff8ace92f5fec5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 12:36:44 +0100 Subject: [PATCH 049/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Thumbnails render --- src/slic3r/GUI/3DBed.cpp | 51 ++++++++++++++++++++-- src/slic3r/GUI/3DBed.hpp | 19 ++++++++ src/slic3r/GUI/3DScene.cpp | 43 +++++++++++++----- src/slic3r/GUI/3DScene.hpp | 5 +++ src/slic3r/GUI/GCodeViewer.cpp | 5 +++ src/slic3r/GUI/GLCanvas3D.cpp | 80 +++++++++++++++++++++++++++++++++- src/slic3r/GUI/GLCanvas3D.hpp | 5 +++ 7 files changed, 191 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index ddd56c7a28..e0f0bc024e 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -270,6 +270,17 @@ Point Bed3D::point_projection(const Point& point) const return m_polygon.point_projection(point); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Bed3D::render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture) +{ + render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture, false); +} + +void Bed3D::render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor) +{ + render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, false, false, true); +} +#else void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture) { render_internal(canvas, bottom, scale_factor, show_axes, show_texture, false); @@ -279,9 +290,15 @@ void Bed3D::render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_fact { render_internal(canvas, bottom, scale_factor, false, false, true); } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Bed3D::render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, + bool show_axes, bool show_texture, bool picking) +#else void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { m_scale_factor = scale_factor; @@ -298,9 +315,15 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, switch (m_type) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + case Type::System: { render_system(canvas, view_matrix, projection_matrix, bottom, show_texture); break; } + default: + case Type::Custom: { render_custom(canvas, view_matrix, projection_matrix, bottom, show_texture, picking); break; } +#else case Type::System: { render_system(canvas, bottom, show_texture); break; } default: case Type::Custom: { render_custom(canvas, bottom, show_texture, picking); break; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } glsafe(::glDisable(GL_DEPTH_TEST)); @@ -492,6 +515,16 @@ void Bed3D::render_axes() m_axes.render(); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture) +{ + if (!bottom) + render_model(view_matrix, projection_matrix); + + if (show_texture) + render_texture(bottom, canvas); +} +#else void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) { if (!bottom) @@ -500,6 +533,7 @@ void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) if (show_texture) render_texture(bottom, canvas); } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) { @@ -661,7 +695,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Bed3D::render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix) +#else void Bed3D::render_model() +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { if (m_model_filename.empty()) return; @@ -690,10 +728,9 @@ void Bed3D::render_model() shader->start_using(); shader->set_uniform("emission_factor", 0.0f); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_model_offset); + const Transform3d matrix = view_matrix * Geometry::assemble_transform(m_model_offset); shader->set_uniform("view_model_matrix", matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glPushMatrix()); @@ -708,7 +745,11 @@ void Bed3D::render_model() } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking) +#else void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { if (m_texture_filename.empty() && m_model_filename.empty()) { render_default(bottom, picking); @@ -716,7 +757,11 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bo } if (!bottom) +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_model(view_matrix, projection_matrix); +#else render_model(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (show_texture) render_texture(bottom, canvas); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 350ae48f6a..d5ce0c511e 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -139,8 +139,13 @@ public: bool contains(const Point& point) const; Point point_projection(const Point& point) const; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture); + void render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor); +#else void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture); void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES private: // Calculate an extended bounding box from axes and current model for visualization purposes. @@ -153,13 +158,27 @@ private: void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL static std::tuple detect_type(const Pointfs& shape); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, + bool show_axes, bool show_texture, bool picking); +#else void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_axes(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture); +#else void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_texture(bool bottom, GLCanvas3D& canvas); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); + void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking); +#else void render_model(); void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_default(bool bottom, bool picking); #if !ENABLE_GLBEGIN_GLEND_REMOVAL void release_VBOs(); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index dad2f5ade9..330371e005 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -714,14 +714,7 @@ void GLVolume::render() glsafe(::glCullFace(GL_BACK)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - if (use_attributes) { - const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * world_matrix(); - shader->set_uniform("view_model_matrix", matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - } - else { + if (!use_attributes) { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(world_matrix().data())); @@ -1083,7 +1076,12 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo return list; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, + std::function filter_func) const +#else void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func) const +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) @@ -1097,6 +1095,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); + bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); #else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); @@ -1139,8 +1138,14 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL if (!volume.first->model.is_initialized()) @@ -1168,6 +1173,14 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL volume.first->model.set_color(volume.first->render_color); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + const Transform3d matrix = view_matrix * volume.first->world_matrix(); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", projection_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_ENVIRONMENT_MAP @@ -1178,8 +1191,14 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!use_attributes) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (m_show_sinking_contours) { diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index ed2aa804eb..83ff907c20 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -687,7 +687,12 @@ public: #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL // Render the volumes by OpenGL. +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, + std::function filter_func = std::function()) const; +#else void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL // Finalize the initialization of the geometry & indices, diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 86da8cf9a4..a2c846ddc2 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3256,7 +3256,12 @@ void GCodeViewer::render_shells() // glsafe(::glDepthMask(GL_FALSE)); shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, camera.get_view_matrix(), camera.get_projection_matrix()); +#else m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, wxGetApp().plater()->get_camera().get_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->stop_using(); // glsafe(::glDepthMask(GL_TRUE)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 10deca2b47..ab750cee45 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1645,7 +1645,11 @@ void GLCanvas3D::render() _render_gcode(); _render_sla_slices(); _render_selection(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward(), true); +#else _render_bed(!camera.is_looking_downward(), true); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES _render_objects(GLVolumeCollection::ERenderType::Transparent); _render_sequential_clearance(); @@ -4413,6 +4417,10 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const camera.zoom_to_box(volumes_box); camera.apply_view_matrix(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d& view_matrix = camera.get_view_matrix(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + double near_z = -1.0; double far_z = -1.0; @@ -4420,14 +4428,22 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const // extends the near and far z of the frustrum to avoid the bed being clipped // box in eye space - BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(camera.get_view_matrix()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(view_matrix); +#else + const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(camera.get_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES near_z = -t_bed_box.max.z(); far_z = -t_bed_box.min.z(); } camera.apply_projection(volumes_box, near_z, far_z); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -4440,6 +4456,10 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const shader->start_using(); shader->set_uniform("emission_factor", 0.0f); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d& projection_matrix = camera.get_projection_matrix(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + for (GLVolume* vol : visible_volumes) { #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL vol->model.set_color((vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : ColorRGBA::ORANGE()) : ColorRGBA::GRAY()); @@ -4447,8 +4467,14 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : ColorRGBA::ORANGE()) : ColorRGBA::GRAY()); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL // the volume may have been deactivated by an active gizmo - bool is_active = vol->is_active; + const bool is_active = vol->is_active; vol->is_active = true; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d matrix = view_matrix * vol->world_matrix(); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", projection_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES vol->render(); vol->is_active = is_active; } @@ -4458,7 +4484,11 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const glsafe(::glDisable(GL_DEPTH_TEST)); if (thumbnail_params.show_bed) +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + _render_bed(view_matrix, projection_matrix, !camera.is_looking_downward(), false); +#else _render_bed(!camera.is_looking_downward(), false); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // restore background color if (thumbnail_params.transparent_background) @@ -5180,7 +5210,12 @@ void GLCanvas3D::_picking_pass() if (m_camera_clipping_plane.is_active()) ::glDisable(GL_CLIP_PLANE0); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); +#else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_gizmos.render_current_gizmo_for_picking_pass(); @@ -5236,7 +5271,12 @@ void GLCanvas3D::_rectangular_selection_picking_pass() glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); _render_volumes_for_picking(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); +#else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (m_multisample_allowed) glsafe(::glEnable(GL_MULTISAMPLE)); @@ -5370,7 +5410,11 @@ void GLCanvas3D::_render_background() glsafe(::glPopMatrix()); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLCanvas3D::_render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes) +#else void GLCanvas3D::_render_bed(bool bottom, bool show_axes) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { float scale_factor = 1.0; #if ENABLE_RETINA_GL @@ -5384,17 +5428,29 @@ void GLCanvas3D::_render_bed(bool bottom, bool show_axes) && m_gizmos.get_current_type() != GLGizmosManager::Seam && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_bed.render(*this, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture); +#else m_bed.render(*this, bottom, scale_factor, show_axes, show_texture); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLCanvas3D::_render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) +#else void GLCanvas3D::_render_bed_for_picking(bool bottom) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_bed.render_for_picking(*this, view_matrix, projection_matrix, bottom, scale_factor); +#else m_bed.render_for_picking(*this, bottom, scale_factor); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) @@ -5462,18 +5518,33 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) { if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { int object_id = m_layers_editing.last_object_id; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [object_id](const GLVolume& volume) { + // Which volume to paint without the layer height profile shader? + return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); + }); +#else m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) { // Which volume to paint without the layer height profile shader? return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // Let LayersEditing handle rendering of the active object using the layer height profile shader. m_layers_editing.render_volumes(*this, m_volumes); } else { // do not cull backfaces to show broken geometry, if any +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, m_picking_enabled, camera.get_view_matrix(), camera.get_projection_matrix(), [this](const GLVolume& volume) { + return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); + }); +#else m_volumes.render(type, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) { return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } // In case a painting gizmo is open, it should render the painted triangles @@ -5492,7 +5563,12 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) } case GLVolumeCollection::ERenderType::Transparent: { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix()); +#else m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES break; } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 1f230bc9cf..a1dd213162 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -944,8 +944,13 @@ private: void _picking_pass(); void _rectangular_selection_picking_pass(); void _render_background(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void _render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes); + void _render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); +#else void _render_bed(bool bottom, bool show_axes); void _render_bed_for_picking(bool bottom); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void _render_objects(GLVolumeCollection::ERenderType type); void _render_gcode(); #if ENABLE_SHOW_TOOLPATHS_COG From 14c23a652638445f1b5feed99af6286566432333 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 13:04:00 +0100 Subject: [PATCH 050/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - GLGizmoBase grabbers --- src/slic3r/GUI/GCodeViewer.cpp | 1 - src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 21 +++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index a2c846ddc2..792412a008 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -328,7 +328,6 @@ void GCodeViewer::SequentialView::Marker::render() shader->start_using(); shader->set_uniform("emission_factor", 0.0f); - #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d matrix = camera.get_view_matrix() * m_world_transform.cast(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index a45ea7a4a5..2db5aeec84 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -41,6 +41,7 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo return; bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); +// assert(use_attributes); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!m_cube.is_initialized()) { @@ -64,12 +65,16 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * matrix * - Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", trafo); - } - else { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); + const Transform3d& projection_matrix = camera.get_projection_matrix(); + // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + // picking render + shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); + if (!use_attributes) { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); @@ -138,7 +143,11 @@ void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const void GLGizmoBase::render_grabbers(float size) const { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; shader->start_using(); From 661ecdc1426ef8f2fd89984d41a1ae0a1465bd74 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 13:10:47 +0100 Subject: [PATCH 051/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Cut --- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 3ce8681d7a..6051d8c098 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -195,7 +195,11 @@ void GLGizmoCut::on_render() shader->stop_using(); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else glsafe(::glColor3f(1.0, 1.0, 0.0)); ::glBegin(GL_LINES); From dccc8aea17f84fc7781c742e1ddb77ec39ba2d83 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 13:17:19 +0100 Subject: [PATCH 052/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Move hovered grabber --- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 1538fc229b..e8028f39f5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -213,7 +213,11 @@ void GLGizmoMove3D::on_render() shader->stop_using(); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else glsafe(::glColor4fv(AXES_COLOR[m_hover_id].data())); ::glBegin(GL_LINES); From 2d72931fac4d53d3759d6bcbf8962bb2bd5e89ba Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 13:30:22 +0100 Subject: [PATCH 053/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Scale hovered grabbers --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 27 ++++++++++---------------- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 16 +++++++++++++++ 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 2db5aeec84..afcebb9869 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -39,9 +39,6 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader == nullptr) return; - - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); -// assert(use_attributes); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!m_cube.is_initialized()) { @@ -74,22 +71,18 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); // picking render shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); - glsafe(::glScaled(fullsize, fullsize, fullsize)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); + glsafe(::glScaled(fullsize, fullsize, fullsize)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cube.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 915b76a200..15b59d5ea4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -329,7 +329,11 @@ void GLGizmoScale3D::on_render() } // draw grabbers +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[0].color.data())); @@ -364,7 +368,11 @@ void GLGizmoScale3D::on_render() } // draw grabbers +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[2].color.data())); @@ -399,7 +407,11 @@ void GLGizmoScale3D::on_render() } // draw grabbers +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[4].color.data())); @@ -437,7 +449,11 @@ void GLGizmoScale3D::on_render() } // draw grabbers +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader = wxGetApp().get_shader("gouraud_light_attr"); +#else shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_drag_color.data())); From 919730e9698d13df7879d61a322b0ece7a7266f9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 14:01:34 +0100 Subject: [PATCH 054/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Hollow --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 69 +++++++++++-------------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index c0eefaace1..ccc2b97e27 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -105,16 +105,12 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) { #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light"); + GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; - -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->start_using(); ScopeGuard guard([shader]() { shader->stop_using(); }); @@ -129,19 +125,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d& projection_matrix = camera.get_projection_matrix(); #else const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); - glsafe(::glMultMatrixd(instance_matrix.data())); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); + glsafe(::glMultMatrixd(instance_matrix.data())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ColorRGBA render_color; @@ -179,13 +173,10 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) @@ -196,35 +187,33 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); const Eigen::AngleAxisd aa(q); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * - hole_matrix * Transform3d(aa.toRotationMatrix()) * - Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - shader->set_uniform("projection_view_model_matrix", matrix); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + + // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + // picking render + shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); +#else + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cylinder.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const From f9cabee3828c6122041dfeba137c9b586703f072 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 3 Mar 2022 14:28:43 +0100 Subject: [PATCH 055/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo SLA Supports --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 137 ++++++++++--------- 2 files changed, 71 insertions(+), 69 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index ccc2b97e27..2bebbccd37 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -129,6 +129,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); const Transform3d& projection_matrix = camera.get_projection_matrix(); + + shader->set_uniform("projection_matrix", projection_matrix); #else const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); @@ -192,7 +194,6 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) // normal render shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); // picking render shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 853d9a2724..739796b0f4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -131,17 +131,13 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light"); + GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->start_using(); ScopeGuard guard([shader]() { shader->stop_using(); }); #else @@ -158,19 +154,19 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d& projection_matrix = camera.get_projection_matrix(); + + shader->set_uniform("projection_matrix", projection_matrix); #else const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const float z_shift = m_c->selection_info()->get_sla_shift(); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, z_shift)); - glsafe(::glMultMatrixd(instance_matrix.data())); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + const float z_shift = m_c->selection_info()->get_sla_shift(); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, z_shift)); + glsafe(::glMultMatrixd(instance_matrix.data())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ColorRGBA render_color; @@ -217,13 +213,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d support_matrix = Geometry::assemble_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) @@ -237,62 +230,58 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); const Eigen::AngleAxisd aa(q); const double cone_radius = 0.25; // mm const double cone_height = 0.75; #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * - support_matrix * Transform3d(aa.toRotationMatrix()) * - Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), - Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); - shader->set_uniform("projection_view_model_matrix", matrix); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); - glsafe(::glRotated(180., 1., 0., 0.)); - glsafe(::glScaled(cone_radius, cone_radius, cone_height)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); + + // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + // picking render + shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); + glsafe(::glRotated(180., 1., 0., 0.)); + glsafe(::glScaled(cone_radius, cone_radius, cone_height)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } const double radius = (double)support_point.head_front_radius * RenderPointScale; #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * instance_matrix * - support_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", matrix); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glScaled(radius, radius, radius)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * + Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); + + // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + // picking render + shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glScaled(radius, radius, radius)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_sphere.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CCW); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } // Now render the drain holes: @@ -309,34 +298,46 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (is_mesh_point_clipped(drain_hole.pos.cast())) continue; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; +#else // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); // Matrices set, we can render the point mark now. - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); const Eigen::AngleAxisd aa(q); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cylinder.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } From 4967b940b81f54703917cf32259897c15c48ea9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Thu, 3 Mar 2022 14:56:18 +0100 Subject: [PATCH 056/149] Fixed a compiler warning. --- src/libslic3r/Brim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 0fec89ced0..f48d7ff0a6 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -313,7 +313,7 @@ static std::vector inner_brim_area(const Print // After 7ff76d07684858fd937ef2f5d863f105a10f798e offset and shrink don't work with CW polygons (holes), so let's make it CCW. Polygons ex_poly_holes_reversed = ex_poly.holes; polygons_reverse(ex_poly_holes_reversed); - for (const PrintInstance &instance : object->instances()) { + for ([[maybe_unused]] const PrintInstance &instance : object->instances()) { ++polygon_idx; // Increase idx because of the contour of the ExPolygon. if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner) From 31013fb6df9f975a5255f35022dd5356a12b6039 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 08:54:23 +0100 Subject: [PATCH 057/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Refactoring of flat vertex shader --- resources/shaders/flat_attr.vs | 5 ++-- src/slic3r/GUI/3DBed.cpp | 4 ++- src/slic3r/GUI/3DScene.cpp | 10 ++++--- src/slic3r/GUI/Camera.hpp | 3 -- src/slic3r/GUI/GLCanvas3D.cpp | 30 +++++++++++++------- src/slic3r/GUI/GLSelectionRectangle.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 4 +-- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 9 ++++-- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 18 ++++++++---- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 3 -- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 21 +++++++++----- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 14 ++++++--- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 25 ++++++++++------ src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 20 +++++++++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 6 ---- src/slic3r/GUI/MeshUtils.cpp | 4 ++- src/slic3r/GUI/Selection.cpp | 15 +++++++--- 17 files changed, 122 insertions(+), 72 deletions(-) diff --git a/resources/shaders/flat_attr.vs b/resources/shaders/flat_attr.vs index 1b00886757..370eedb72d 100644 --- a/resources/shaders/flat_attr.vs +++ b/resources/shaders/flat_attr.vs @@ -2,9 +2,10 @@ attribute vec3 v_position; -uniform mat4 projection_view_model_matrix; +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; void main() { - gl_Position = projection_view_model_matrix * vec4(v_position, 1.0); + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); } diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index e0f0bc024e..2fb5752f62 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -784,7 +784,9 @@ void Bed3D::render_default(bool bottom, bool picking) shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 330371e005..31639c0653 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -306,8 +306,9 @@ void GLVolume::SinkingContours::render() if (shader == nullptr) return; - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_shift); - shader->set_uniform("projection_view_model_matrix", matrix); + const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::assemble_transform(m_shift)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z())); @@ -394,8 +395,9 @@ void GLVolume::NonManifoldEdges::render() if (shader == nullptr) return; - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_parent.world_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_parent.world_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 6a0158e6df..a61eb44ec5 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -78,9 +78,6 @@ public: const std::array& get_viewport() const { return m_viewport; } const Transform3d& get_view_matrix() const { return m_view_matrix; } const Transform3d& get_projection_matrix() const { return m_projection_matrix; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Transform3d get_projection_view_matrix() const { return m_projection_matrix * m_view_matrix; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Vec3d get_dir_right() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(0); } Vec3d get_dir_up() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(1); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ab750cee45..00ad99af62 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -509,7 +509,8 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.baseline.render(); m_profile.profile.render(); @@ -1024,7 +1025,9 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); @@ -5761,8 +5764,9 @@ void GLCanvas3D::_render_volumes_for_picking() const glsafe(::glColor4fv(picking_decode(id).data())); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * volume.first->world_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * volume.first->world_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL @@ -5942,7 +5946,9 @@ void GLCanvas3D::_render_camera_target() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); @@ -6131,12 +6137,14 @@ void GLCanvas3D::_render_sla_slices() for (const SLAPrintObject::Instance& inst : obj->instances()) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), - Vec3d(0.0, 0.0, inst.rotation), - Vec3d::Ones(), - obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), + inst.rotation * Vec3d::UnitZ(), Vec3d::Ones(), + obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0)); diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 828c7c6a4d..0dc6de9364 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -169,7 +169,8 @@ namespace GUI { } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_rectangle.set_color(ColorRGBA((m_state == Select) ? 0.3f : 1.0f, (m_state == Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index afcebb9869..a6d33d8065 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -65,12 +65,10 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); const Transform3d& projection_matrix = camera.get_projection_matrix(); - // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 6051d8c098..a6d7f5f232 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -145,7 +145,9 @@ void GLGizmoCut::on_render() } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_plane.render(); @@ -229,8 +231,9 @@ void GLGizmoCut::on_render() shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_cut_contours.shift); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index c071a491a9..1a7fc5a5af 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -124,9 +124,12 @@ void GLGizmoFlatten::on_render() if (selection.is_single_full_instance()) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); @@ -179,9 +182,12 @@ void GLGizmoFlatten::on_render_for_picking() if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 2bebbccd37..b8c4ecd41e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -192,11 +192,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index e8028f39f5..c3fe80a38b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -164,7 +164,9 @@ void GLGizmoMove3D::on_render() #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // draw axes @@ -206,7 +208,9 @@ void GLGizmoMove3D::on_render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabber_connection(m_hover_id); @@ -311,13 +315,16 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); if (axis == X) - matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); else if (axis == Y) - matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); - matrix = matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", matrix); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index b849617a3e..a6d970dc95 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -242,7 +242,8 @@ void GLGizmoPainterBase::render_cursor_circle() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_circle.render(); shader->stop_using(); @@ -307,10 +308,13 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * trafo * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * trafo * Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", matrix); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES assert(s_sphere != nullptr); @@ -1267,7 +1271,9 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 81dfeff3fd..8268bd8b9c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -181,8 +181,11 @@ void GLGizmoRotate::on_render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; @@ -605,10 +608,13 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", trafo); + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -624,10 +630,13 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick m_cone.render(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", trafo); + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 15b59d5ea4..62239508d2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -273,7 +273,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); @@ -322,7 +324,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); @@ -361,7 +365,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); @@ -400,7 +406,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); @@ -439,7 +447,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 739796b0f4..925f8d30de 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -239,11 +239,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); @@ -262,11 +259,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glScaled(radius, radius, radius)); diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 787110ad78..f84d69da9e 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -97,7 +97,9 @@ void MeshClipper::render_cut() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 1ea0cf2a17..30bebe8bab 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1291,8 +1291,11 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glDisable(GL_DEPTH_TEST)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(center); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(center); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); @@ -2006,7 +2009,9 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_box.set_color(to_rgba(color)); m_box.render(); @@ -2283,7 +2288,9 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); From ead51d69b7600a54ff0b3bb3e4399aecf7edd1e9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 09:01:10 +0100 Subject: [PATCH 058/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Move grabber extensions --- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 52 +++++++++++---------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index c3fe80a38b..6e2d924b80 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -287,7 +287,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light"); + GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -297,10 +297,6 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box if (shader == nullptr) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - #if ENABLE_GLBEGIN_GLEND_REMOVAL m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color); shader->start_using(); @@ -314,37 +310,31 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); - if (axis == X) - view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); - else if (axis == Y) - view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); - view_model_matrix = view_model_matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); + if (axis == X) + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); + else if (axis == Y) + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); - if (axis == X) - glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); - else if (axis == Y) - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); + if (axis == X) + glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); + else if (axis == Y) + glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (! picking) From d71ad7177e409ece1d2291c60bac5c5e22e47c8a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 09:08:15 +0100 Subject: [PATCH 059/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Rotate grabber extensions --- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 77 ++++++++++--------------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 8268bd8b9c..625594e31f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -577,17 +577,13 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light"); + GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers.front().color) : m_grabbers.front().color); shader->start_using(); @@ -607,54 +603,43 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const Vec3d& center = m_grabbers.front().center; #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * - Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + Transform3d view_model_matrix = view_matrix * m_grabbers.front().matrix * + Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); + glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * - Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + view_model_matrix = view_matrix * m_grabbers.front().matrix * + Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + shader->set_uniform("view_model_matrix", view_model_matrix); +#else + glsafe(::glPopMatrix()); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); + glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); + glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); + glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_cone.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (! picking) From f7d06f4ec856e486157da1da15d7e4526058a08d Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 09:16:17 +0100 Subject: [PATCH 060/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Gizmo Simplify --- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 1b4c751d4e..f5e3fdcf94 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -740,10 +740,20 @@ void GLGizmoSimplify::on_render() glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto* gouraud_shader = wxGetApp().get_shader("gouraud_light_attr"); +#else auto *gouraud_shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_DEPTH_TEST)); glsafe(::glEnable(GL_DEPTH_TEST)); gouraud_shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * trafo_matrix; + gouraud_shader->set_uniform("view_model_matrix", view_model_matrix); + gouraud_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glmodel.render(); gouraud_shader->stop_using(); From 3505e5a2901d27747ab81ef88147b8eeb07280ea Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 1 Mar 2022 12:03:42 +0100 Subject: [PATCH 061/149] Fix of leaking GDI resources on Win7 #8002: - Code refactoring for draw_focus_rect. - Use one PaintDC for rendering - DoubleSlider::Control::Ruler refactoring - Suppress to update ruler for horizontal slider --- src/slic3r/GUI/DoubleSlider.cpp | 76 ++++++++++++++++++++++++++------- src/slic3r/GUI/DoubleSlider.hpp | 25 +++++++++-- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index b5201d8618..d2f0e89aa0 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -122,6 +122,10 @@ Control::Control( wxWindow *parent, this->Bind(wxEVT_KEY_UP, &Control::OnKeyUp, this); this->Bind(wxEVT_RIGHT_DOWN, &Control::OnRightDown,this); this->Bind(wxEVT_RIGHT_UP, &Control::OnRightUp, this); + this->Bind(wxEVT_SIZE, [this](wxSizeEvent& event) { + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); + event.Skip(); + }); // control's view variables SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); @@ -137,8 +141,14 @@ Control::Control( wxWindow *parent, m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN }; m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN }; + FOCUS_RECT_PEN = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + FOCUS_RECT_BRUSH = wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT); + m_font = GetFont(); this->SetMinSize(get_min_size()); + + if (style == wxSL_VERTICAL) + m_ruler.set_parent(this->GetParent()); } void Control::msw_rescale() @@ -170,6 +180,9 @@ void Control::msw_rescale() SetMinSize(get_min_size()); GetParent()->Layout(); + + m_ruler.update_dpi(); + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::sys_color_changed() @@ -266,7 +279,11 @@ void Control::SetMaxValue(const int max_value) void Control::SetSliderValues(const std::vector& values) { m_values = values; - m_ruler.init(m_values); + m_ruler.init(m_values, get_scroll_step()); + + // When "No sparce layer" is enabled, use m_layers_values for ruler update. + // Because of m_values has duplicate values in this case. +// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos) @@ -426,9 +443,12 @@ void Control::SetLayersTimes(const std::vector& layers_times, float total if (m_layers_values.size() != m_layers_times.size()) for (size_t i = m_layers_times.size(); i < m_layers_values.size(); i++) m_layers_times.push_back(total_time); + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); Refresh(); Update(); } + else + m_ruler.update(m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); } void Control::SetLayersTimes(const std::vector& layers_times) @@ -494,15 +514,17 @@ void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos) } } -void Control::draw_focus_rect() +void Control::draw_focus_rect(wxDC& dc) { if (!m_is_focused) return; const wxSize sz = GetSize(); - wxPaintDC dc(this); - const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); - dc.SetPen(pen); - dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); +// wxPaintDC dc(this); + //const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + //dc.SetPen(pen); + //dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); + dc.SetPen(FOCUS_RECT_PEN); + dc.SetBrush(FOCUS_RECT_BRUSH); dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2); } @@ -513,11 +535,12 @@ void Control::render() #else SetBackgroundColour(GetParent()->GetBackgroundColour()); #endif // _WIN32 - draw_focus_rect(); wxPaintDC dc(this); dc.SetFont(m_font); + draw_focus_rect(dc); + const wxCoord lower_pos = get_position_from_value(m_lower_value); const wxCoord higher_pos = get_position_from_value(m_higher_value); @@ -807,7 +830,7 @@ void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, LabelType l } wxColour old_clr = dc.GetTextForeground(); - const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : wxPen(old_clr); + const wxPen& pen = is_wipe_tower_layer(tick) && (tick == m_lower_value || tick == m_higher_value) ? DARK_ORANGE_PEN : /*wxPen(old_clr)*/GREY_PEN; dc.SetPen(pen); dc.SetTextForeground(pen.GetColour()); @@ -1028,8 +1051,10 @@ void Control::draw_colored_band(wxDC& dc) } } -void Control::Ruler::init(const std::vector& values) +void Control::Ruler::init(const std::vector& values, double scroll_step) { + if (!m_parent) + return; max_values.clear(); max_values.reserve(std::count(values.begin(), values.end(), values.front())); @@ -1039,14 +1064,35 @@ void Control::Ruler::init(const std::vector& values) it = std::find(it + 1, values.end(), values.front()); } max_values.push_back(*(it - 1)); + + update(values, scroll_step); } -void Control::Ruler::update(wxWindow* win, const std::vector& values, double scroll_step) +void Control::Ruler::set_parent(wxWindow* parent) { - if (values.empty()) + m_parent = parent; + update_dpi(); +} + +void Control::Ruler::update_dpi() +{ + if (m_parent) + m_DPI = GUI::get_dpi_for_window(m_parent); +} + +void Control::Ruler::update(const std::vector& values, double scroll_step) +{ + if (!m_parent || values.empty() || + // check if need to update ruler in respect to input values + values.front() == m_min_val && values.back() == m_max_val && m_scroll_step == scroll_step && max_values.size() == m_max_values_cnt) return; - int DPI = GUI::get_dpi_for_window(win); - int pixels_per_sm = lround((double)(DPI) * 5.0/25.4); + + m_min_val = values.front(); + m_max_val = values.back(); + m_scroll_step = scroll_step; + m_max_values_cnt = max_values.size(); + + int pixels_per_sm = lround((double)(m_DPI) * 5.0/25.4); if (lround(scroll_step) > pixels_per_sm) { long_step = -1.0; @@ -1091,11 +1137,11 @@ void Control::Ruler::update(wxWindow* win, const std::vector& values, do void Control::draw_ruler(wxDC& dc) { - if (m_values.empty()) + if (m_values.empty() || !m_ruler.can_draw()) return; // When "No sparce layer" is enabled, use m_layers_values for ruler update. // Because of m_values has duplicate values in this case. - m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); +// m_ruler.update(this->GetParent(), m_layers_values.empty() ? m_values : m_layers_values, get_scroll_step()); int height, width; get_size(&width, &height); diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index e0f713d879..e4654d6047 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -303,7 +303,7 @@ public: protected: void render(); - void draw_focus_rect(); + void draw_focus_rect(wxDC& dc); void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end); void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos); void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection); @@ -438,19 +438,36 @@ private: wxPen GREY_PEN; wxPen LIGHT_GREY_PEN; + wxPen FOCUS_RECT_PEN; + wxBrush FOCUS_RECT_BRUSH; + std::vector m_line_pens; std::vector m_segm_pens; - struct Ruler { + class Ruler { + wxWindow* m_parent{nullptr}; // m_parent is nullptr for Unused ruler + // in this case we will not init/update/render it + // values to check if ruler has to be updated + double m_min_val; + double m_max_val; + double m_scroll_step; + size_t m_max_values_cnt; + int m_DPI; + + public: + double long_step; double short_step; std::vector max_values;// max value for each object/instance in sequence print // > 1 for sequential print - void init(const std::vector& values); - void update(wxWindow* win, const std::vector& values, double scroll_step); + void set_parent(wxWindow* parent); + void update_dpi(); + void init(const std::vector& values, double scroll_step); + void update(const std::vector& values, double scroll_step); bool is_ok() { return long_step > 0 && short_step > 0; } size_t count() { return max_values.size(); } + bool can_draw() { return m_parent != nullptr; } } m_ruler; }; From d6b0a9858bc93a362a9303489d9190fdc07ca109 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 10:52:30 +0100 Subject: [PATCH 062/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Selection sidebar hints --- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 2 + src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 1 + src/slic3r/GUI/Selection.cpp | 183 ++++++++++++++++++---- src/slic3r/GUI/Selection.hpp | 20 ++- 5 files changed, 174 insertions(+), 33 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 6e2d924b80..453b0c8378 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -320,6 +320,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 625594e31f..8a7d784454 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -612,6 +612,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); @@ -627,6 +628,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glPopMatrix()); glsafe(::glPushMatrix()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index f5e3fdcf94..e67a9b7a7f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -753,6 +753,7 @@ void GLGizmoSimplify::on_render() const Transform3d view_model_matrix = camera.get_view_matrix() * trafo_matrix; gouraud_shader->set_uniform("view_model_matrix", view_model_matrix); gouraud_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + gouraud_shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glmodel.render(); gouraud_shader->stop_using(); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 30bebe8bab..97f7379075 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1325,7 +1325,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #if ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light"); + GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat" : "gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -1349,16 +1349,26 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glEnable(GL_DEPTH_TEST)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!boost::starts_with(sidebar_field, "layer")) + const Transform3d base_matrix = Geometry::assemble_transform(get_bounding_box().center()); + Transform3d orient_matrix = Transform3d::Identity(); +#else + glsafe(::glPushMatrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); if (!boost::starts_with(sidebar_field, "layer")) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("emission_factor", 0.05f); +#else const Vec3d& center = get_bounding_box().center(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glTranslated(center.x(), center.y(), center.z())); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!boost::starts_with(sidebar_field, "position")) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Transform3d orient_matrix = Transform3d::Identity(); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (boost::starts_with(sidebar_field, "scale")) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); else if (boost::starts_with(sidebar_field, "rotation")) { @@ -1366,30 +1376,42 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); else if (boost::ends_with(sidebar_field, "y")) { const Vec3d& rotation = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation(); - if (rotation(0) == 0.0) + if (rotation.x() == 0.0) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); else - orient_matrix.rotate(Eigen::AngleAxisd(rotation(2), Vec3d::UnitZ())); + orient_matrix.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); } } - +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glMultMatrixd(orient_matrix.data())); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } else if (is_single_volume() || is_single_modifier()) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#else glsafe(::glTranslated(center.x(), center.y(), center.z())); Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!boost::starts_with(sidebar_field, "position")) orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glMultMatrixd(orient_matrix.data())); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } else { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (requires_local_axes()) + orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); +#else glsafe(::glTranslated(center.x(), center.y(), center.z())); if (requires_local_axes()) { const Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } @@ -1398,6 +1420,16 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (boost::starts_with(sidebar_field, "position")) + render_sidebar_position_hints(sidebar_field, *shader, base_matrix * orient_matrix); + else if (boost::starts_with(sidebar_field, "rotation")) + render_sidebar_rotation_hints(sidebar_field, *shader, base_matrix * orient_matrix); + else if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size")) + render_sidebar_scale_hints(sidebar_field, *shader, base_matrix * orient_matrix); + else if (boost::starts_with(sidebar_field, "layer")) + render_sidebar_layers_hints(sidebar_field, *shader); +#else if (boost::starts_with(sidebar_field, "position")) render_sidebar_position_hints(sidebar_field); else if (boost::starts_with(sidebar_field, "rotation")) @@ -1405,16 +1437,10 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) else if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size")) render_sidebar_scale_hints(sidebar_field); else if (boost::starts_with(sidebar_field, "layer")) -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - render_sidebar_layers_hints(sidebar_field, shader); -#else render_sidebar_layers_hints(sidebar_field); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!boost::starts_with(sidebar_field, "layer")) + glsafe(::glPopMatrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); #if !ENABLE_GLBEGIN_GLEND_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) @@ -1424,7 +1450,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) bool Selection::requires_local_axes() const { - return (m_mode == Volume) && is_from_single_instance(); + return m_mode == Volume && is_from_single_instance(); } void Selection::copy_to_clipboard() @@ -1434,8 +1460,7 @@ void Selection::copy_to_clipboard() m_clipboard.reset(); - for (const ObjectIdxsToInstanceIdxsMap::value_type& object : m_cache.content) - { + for (const ObjectIdxsToInstanceIdxsMap::value_type& object : m_cache.content) { ModelObject* src_object = m_model->objects[object.first]; ModelObject* dst_object = m_clipboard.add_object(); dst_object->name = src_object->name; @@ -1448,26 +1473,22 @@ void Selection::copy_to_clipboard() dst_object->layer_height_profile.assign(src_object->layer_height_profile); dst_object->origin_translation = src_object->origin_translation; - for (int i : object.second) - { + for (int i : object.second) { dst_object->add_instance(*src_object->instances[i]); } - for (unsigned int i : m_list) - { + for (unsigned int i : m_list) { // Copy the ModelVolumes only for the selected GLVolumes of the 1st selected instance. const GLVolume* volume = (*m_volumes)[i]; - if ((volume->object_idx() == object.first) && (volume->instance_idx() == *object.second.begin())) - { + if (volume->object_idx() == object.first && volume->instance_idx() == *object.second.begin()) { int volume_idx = volume->volume_idx(); - if ((0 <= volume_idx) && (volume_idx < (int)src_object->volumes.size())) - { + if (0 <= volume_idx && volume_idx < (int)src_object->volumes.size()) { ModelVolume* src_volume = src_object->volumes[volume_idx]; ModelVolume* dst_volume = dst_object->add_volume(*src_volume); dst_volume->set_new_unique_id(); - } else { - assert(false); } + else + assert(false); } } } @@ -2060,20 +2081,46 @@ static ColorRGBA get_color(Axis axis) return AXES_COLOR[axis]; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Selection::render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) +#else void Selection::render_sidebar_position_hints(const std::string& sidebar_field) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_matrix = camera.get_view_matrix() * matrix; + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (boost::ends_with(sidebar_field, "x")) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(X)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "y")) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader.set_uniform("view_model_matrix", view_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(Y)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "z")) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX()); + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(Z)); m_arrow.render(); } @@ -2095,28 +2142,65 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) +#else void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto render_sidebar_rotation_hint = [this](GLShaderProgram& shader, const Transform3d& matrix) { + Transform3d view_model_matrix = matrix; + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + m_curved_arrow.render(); + view_model_matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + m_curved_arrow.render(); + }; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_matrix = camera.get_view_matrix() * matrix; + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); +#else auto render_sidebar_rotation_hint = [this]() { m_curved_arrow.render(); glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); m_curved_arrow.render(); }; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x")) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(X)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY())); +#else render_sidebar_rotation_hint(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } else if (boost::ends_with(sidebar_field, "y")) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(Y)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX())); +#else render_sidebar_rotation_hint(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } else if (boost::ends_with(sidebar_field, "z")) { m_curved_arrow.set_color(get_color(Z)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix); +#else render_sidebar_rotation_hint(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } #else auto render_sidebar_rotation_hint = [this]() { @@ -2142,51 +2226,90 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) #endif // ENABLE_GLBEGIN_GLEND_REMOVAL } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) +#else void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { - bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); + const bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis, GLShaderProgram& shader, const Transform3d& matrix) { +#else auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #else m_arrow.set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + Transform3d view_model_matrix = matrix * Geometry::assemble_transform(5.0 * Vec3d::UnitY()); + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader != nullptr) shader->set_uniform("emission_factor", 0.0f); glsafe(::glTranslated(0.0, 5.0, 0.0)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.render(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + view_model_matrix = matrix * Geometry::assemble_transform(-5.0 * Vec3d::UnitY(), PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_model_matrix); + shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glTranslated(0.0, -10.0, 0.0)); glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_arrow.render(); }; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_matrix = camera.get_view_matrix() * matrix; + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (boost::ends_with(sidebar_field, "x") || uniform_scale) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_scale_hint(X, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ())); +#else glsafe(::glPushMatrix()); glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); render_sidebar_scale_hint(X); glsafe(::glPopMatrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (boost::ends_with(sidebar_field, "y") || uniform_scale) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_scale_hint(Y, shader, view_matrix); +#else glsafe(::glPushMatrix()); render_sidebar_scale_hint(Y); glsafe(::glPopMatrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (boost::ends_with(sidebar_field, "z") || uniform_scale) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_sidebar_scale_hint(Z, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX())); +#else glsafe(::glPushMatrix()); glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); render_sidebar_scale_hint(Z); glsafe(::glPopMatrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram* shader) +void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader) #else void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -2289,8 +2412,8 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader.set_uniform("view_model_matrix", camera.get_view_matrix()); + shader.set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index ac18c31bdb..521b4d1a96 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -376,14 +376,28 @@ private: void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); + void render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); + void render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); + void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render_sidebar_position_hints(const std::string& sidebar_field); void render_sidebar_rotation_hints(const std::string& sidebar_field); void render_sidebar_scale_hints(const std::string& sidebar_field); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram* shader); -#else void render_sidebar_layers_hints(const std::string& sidebar_field); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +// void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader); +//#else +// void render_sidebar_layers_hints(const std::string& sidebar_field); +//#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ public: enum SyncRotationType { From bca966039e4828f45b3ce016cd9ee46c3ebf3a76 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 12:07:08 +0100 Subject: [PATCH 063/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light - Toolpaths and batched options in gcode preview --- src/slic3r/GUI/GCodeViewer.cpp | 318 ++++++++++++++++++++++++--------- src/slic3r/GUI/Selection.hpp | 11 -- 2 files changed, 234 insertions(+), 95 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 792412a008..e51b9526c4 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -685,7 +685,11 @@ void GCodeViewer::init() #endif // !DISABLE_GCODEVIEWER_INSTANCED_MODELS buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::BatchedModel; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + buffer.shader = "gouraud_light_attr"; +#else buffer.shader = "gouraud_light"; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES buffer.model.data = diamond(16); buffer.model.color = option_color(type); @@ -699,7 +703,11 @@ void GCodeViewer::init() case EMoveType::Extrude: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + buffer.shader = "gouraud_light_attr"; +#else buffer.shader = "gouraud_light"; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES break; } case EMoveType::Travel: { @@ -2925,15 +2933,15 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool void GCodeViewer::render_toolpaths() { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - float point_size = 20.0f; + const float point_size = 20.0f; #else - float point_size = 0.8f; + const float point_size = 0.8f; #endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; + const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; const Camera& camera = wxGetApp().plater()->get_camera(); - double zoom = camera.get_zoom(); + const double zoom = camera.get_zoom(); const std::array& viewport = camera.get_viewport(); - float near_plane_height = camera.get_type() == Camera::EType::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : + const float near_plane_height = camera.get_type() == Camera::EType::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : static_cast(viewport[3]) * 0.0005; auto shader_init_as_points = [zoom, point_size, near_plane_height](GLShaderProgram& shader) { @@ -3040,11 +3048,19 @@ void GCodeViewer::render_toolpaths() } }; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GCODE_VIEWER_STATISTICS + auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { +#else + auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { +#endif // ENABLE_GCODE_VIEWER_STATISTICS +#else #if ENABLE_GCODE_VIEWER_STATISTICS auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader) { #else auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader) { #endif // ENABLE_GCODE_VIEWER_STATISTICS +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES struct Range { @@ -3053,30 +3069,44 @@ void GCodeViewer::render_toolpaths() bool intersects(const Range& other) const { return (other.last < first || other.first > last) ? false : true; } }; Range buffer_range = { 0, 0 }; - size_t indices_per_instance = buffer.model.data.indices_count(); + const size_t indices_per_instance = buffer.model.data.indices_count(); for (size_t j = 0; j < buffer.indices.size(); ++j) { const IBuffer& i_buffer = buffer.indices[j]; buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } +#else glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = buffer.vertices.normal_size_floats() > 0; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } +#else glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); for (auto& range : buffer.model.instances.render_ranges.ranges) { - Range range_range = { range.offset, range.offset + range.count }; + const Range range_range = { range.offset, range.offset + range.count }; if (range_range.intersects(buffer_range)) { shader.set_uniform("uniform_color", range.color); - unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; - size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); - Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; - size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; + const unsigned int offset = (range_range.first > buffer_range.first) ? range_range.first - buffer_range.first : 0; + const size_t offset_bytes = static_cast(offset) * indices_per_instance * sizeof(IBufferType); + const Range render_range = { std::max(range_range.first, buffer_range.first), std::min(range_range.last, buffer_range.last) }; + const size_t count = static_cast(render_range.last - render_range.first) * indices_per_instance; if (count > 0) { glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)count, GL_UNSIGNED_SHORT, (const void*)offset_bytes)); #if ENABLE_GCODE_VIEWER_STATISTICS @@ -3088,10 +3118,17 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); +#else if (has_normals) glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); buffer_range.first = buffer_range.last; @@ -3102,8 +3139,8 @@ void GCodeViewer::render_toolpaths() return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0)); }; - unsigned char begin_id = buffer_id(EMoveType::Retract); - unsigned char end_id = buffer_id(EMoveType::Count); + const unsigned char begin_id = buffer_id(EMoveType::Retract); + const unsigned char end_id = buffer_id(EMoveType::Count); for (unsigned char i = begin_id; i < end_id; ++i) { TBuffer& buffer = m_buffers[i]; @@ -3111,77 +3148,135 @@ void GCodeViewer::render_toolpaths() continue; GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str()); - if (shader != nullptr) { - shader->start_using(); + if (shader == nullptr) + continue; - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { - shader->set_uniform("emission_factor", 0.25f); - render_as_instanced_model(buffer, *shader); - shader->set_uniform("emission_factor", 0.0f); + shader->start_using(); + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + int position_id = -1; + int normal_id = -1; + const bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); + if (use_attributes) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + + position_id = shader->get_attrib_location("v_position"); + normal_id = shader->get_attrib_location("v_normal"); + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { + shader->set_uniform("emission_factor", 0.25f); + render_as_instanced_model(buffer, *shader); + shader->set_uniform("emission_factor", 0.0f); + } + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { + shader->set_uniform("emission_factor", 0.25f); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_as_batched_model(buffer, *shader, position_id, normal_id); +#else + render_as_batched_model(buffer, *shader); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("emission_factor", 0.0f); + } + else { + switch (buffer.render_primitive_type) { + case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; + case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; + default: break; } - else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { - shader->set_uniform("emission_factor", 0.25f); - render_as_batched_model(buffer, *shader); - shader->set_uniform("emission_factor", 0.0f); - } - else { - switch (buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; - case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; - default: break; + const int uniform_color = shader->get_uniform_location("uniform_color"); + + auto it_path = buffer.render_paths.begin(); + for (unsigned int ibuffer_id = 0; ibuffer_id < static_cast(buffer.indices.size()); ++ibuffer_id) { + const IBuffer& i_buffer = buffer.indices[ibuffer_id]; + // Skip all paths with ibuffer_id < ibuffer_id. + for (; it_path != buffer.render_paths.end() && it_path->ibuffer_id < ibuffer_id; ++it_path); + if (it_path == buffer.render_paths.end() || it_path->ibuffer_id > ibuffer_id) + // Not found. This shall not happen. + continue; + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); + } } - int uniform_color = shader->get_uniform_location("uniform_color"); - auto it_path = buffer.render_paths.begin(); - for (unsigned int ibuffer_id = 0; ibuffer_id < static_cast(buffer.indices.size()); ++ibuffer_id) { - const IBuffer& i_buffer = buffer.indices[ibuffer_id]; - // Skip all paths with ibuffer_id < ibuffer_id. - for (; it_path != buffer.render_paths.end() && it_path->ibuffer_id < ibuffer_id; ++ it_path) ; - if (it_path == buffer.render_paths.end() || it_path->ibuffer_id > ibuffer_id) - // Not found. This shall not happen. - continue; - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = buffer.vertices.normal_size_floats() > 0; - if (has_normals) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (has_normals) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); - // Render all elements with it_path->ibuffer_id == ibuffer_id, possible with varying colors. - switch (buffer.render_primitive_type) - { - case TBuffer::ERenderPrimitiveType::Point: { - render_as_points(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - case TBuffer::ERenderPrimitiveType::Line: { - glsafe(::glLineWidth(static_cast(line_width(zoom)))); - render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - case TBuffer::ERenderPrimitiveType::Triangle: { - render_as_triangles(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } - default: { break; } - } + // Render all elements with it_path->ibuffer_id == ibuffer_id, possible with varying colors. + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + render_as_points(it_path, buffer.render_paths.end(), *shader, uniform_color); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + glsafe(::glLineWidth(static_cast(line_width(zoom)))); + render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + render_as_triangles(it_path, buffer.render_paths.end(), *shader, uniform_color); + break; + } + default: { break; } + } - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (has_normals) glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } - - shader->stop_using(); } + + shader->stop_using(); } #if ENABLE_GCODE_VIEWER_STATISTICS @@ -3190,37 +3285,92 @@ void GCodeViewer::render_toolpaths() auto render_sequential_range_cap = [] #endif // ENABLE_GCODE_VIEWER_STATISTICS (const SequentialRangeCap& cap) { - GLShaderProgram* shader = wxGetApp().get_shader(cap.buffer->shader.c_str()); - if (shader != nullptr) { - shader->start_using(); + const TBuffer* buffer = cap.buffer; + GLShaderProgram* shader = wxGetApp().get_shader(buffer->shader.c_str()); + if (shader == nullptr) + return; - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); - glsafe(::glVertexPointer(cap.buffer->vertices.position_size_floats(), GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - bool has_normals = cap.buffer->vertices.normal_size_floats() > 0; - if (has_normals) { - glsafe(::glNormalPointer(GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + shader->start_using(); + +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + int position_id = -1; + int normal_id = -1; + const bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); + if (use_attributes) { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + + position_id = shader->get_attrib_location("v_position"); + normal_id = shader->get_attrib_location("v_normal"); + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glVertexPointer(buffer->vertices.position_size_floats(), GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const bool has_normals = buffer->vertices.normal_size_floats() > 0; + if (has_normals) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); + } + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glNormalPointer(GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } - shader->set_uniform("uniform_color", cap.color); + shader->set_uniform("uniform_color", cap.color); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_triangles_calls_count; + ++m_statistics.gl_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (use_attributes) { + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); + } + else { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (has_normals) glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - - shader->stop_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + shader->stop_using(); }; for (unsigned int i = 0; i < 2; ++i) { diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 521b4d1a96..392d2f9f30 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -376,28 +376,17 @@ private: void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render_sidebar_position_hints(const std::string& sidebar_field); void render_sidebar_rotation_hints(const std::string& sidebar_field); void render_sidebar_scale_hints(const std::string& sidebar_field); void render_sidebar_layers_hints(const std::string& sidebar_field); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -// void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader); -//#else -// void render_sidebar_layers_hints(const std::string& sidebar_field); -//#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ public: enum SyncRotationType { From cdf3cb83b6643d430f58e52d28ab308ec941cddf Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 12:46:01 +0100 Subject: [PATCH 064/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud_light_instanced_attr - Instanced options in gcode preview --- .../shaders/gouraud_light_instanced_attr.vs | 50 +++++++++++++++++++ src/slic3r/GUI/GCodeViewer.cpp | 5 +- src/slic3r/GUI/GLModel.cpp | 4 ++ src/slic3r/GUI/GLShadersManager.cpp | 6 ++- 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 resources/shaders/gouraud_light_instanced_attr.vs diff --git a/resources/shaders/gouraud_light_instanced_attr.vs b/resources/shaders/gouraud_light_instanced_attr.vs new file mode 100644 index 0000000000..7069feb65e --- /dev/null +++ b/resources/shaders/gouraud_light_instanced_attr.vs @@ -0,0 +1,50 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +// vertex attributes +attribute vec3 v_position; +attribute vec3 v_normal; +// instance attributes +attribute vec3 i_offset; +attribute vec2 i_scales; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index e51b9526c4..abbde51c86 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -676,7 +676,11 @@ void GCodeViewer::init() #if !DISABLE_GCODEVIEWER_INSTANCED_MODELS if (wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::InstancedModel; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + buffer.shader = "gouraud_light_instanced_attr"; +#else buffer.shader = "gouraud_light_instanced"; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES buffer.model.model.init_from(diamond(16)); buffer.model.color = option_color(type); buffer.model.instances.format = InstanceVBuffer::EFormat::InstancedModel; @@ -3158,7 +3162,6 @@ void GCodeViewer::render_toolpaths() int normal_id = -1; const bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); if (use_attributes) { - const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index c32a4e26ac..13606cb655 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -1083,7 +1083,11 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance GLShaderProgram* shader = wxGetApp().get_current_shader(); #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced_attr")) +#else if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced")) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES return; // vertex attributes diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index eda9097202..b35670d277 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -56,8 +56,12 @@ std::pair GLShadersManager::init() // used to render printbed valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); // used to render options in gcode preview - if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) + if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + } // used to render extrusion and travel paths as lines in gcode preview valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); // used to render objects in 3d editor From 191222c3a81344e603c494350ffcdbad6f7427b0 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 13:14:03 +0100 Subject: [PATCH 065/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat - Travel moves in gcode preview --- src/slic3r/GUI/GCodeViewer.cpp | 25 ++++++++++++++++++++++++- src/slic3r/GUI/GLShadersManager.cpp | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index abbde51c86..188a803a3f 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -716,8 +716,13 @@ void GCodeViewer::init() } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + buffer.vertices.format = VBuffer::EFormat::Position; + buffer.shader = "flat_attr"; +#else buffer.vertices.format = VBuffer::EFormat::PositionNormal3; buffer.shader = "toolpaths_lines"; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES break; } } @@ -1305,9 +1310,19 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { // x component of the normal to the current segment (the normal is parallel to the XY plane) const Vec3f dir = (curr.position - prev.position).normalized(); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Vec3f normal(dir.y(), -dir.x(), 0.0); normal.normalize(); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto add_vertex = [&vertices](const GCodeProcessorResult::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position.x()); + vertices.push_back(vertex.position.y()); + vertices.push_back(vertex.position.z()); + }; +#else auto add_vertex = [&vertices, &normal](const GCodeProcessorResult::MoveVertex& vertex) { // add position vertices.push_back(vertex.position.x()); @@ -1318,6 +1333,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) vertices.push_back(normal.y()); vertices.push_back(normal.z()); }; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // add previous vertex add_vertex(prev); @@ -2985,9 +3001,11 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); }; - auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { shader.set_uniform("light_intensity", light_intensity); }; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES auto render_as_lines = [ #if ENABLE_GCODE_VIEWER_STATISTICS this @@ -3187,11 +3205,16 @@ void GCodeViewer::render_toolpaths() shader->set_uniform("emission_factor", 0.0f); } else { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Point) + shader_init_as_points(*shader); +#else switch (buffer.render_primitive_type) { case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; default: break; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const int uniform_color = shader->get_uniform_location("uniform_color"); auto it_path = buffer.render_paths.begin(); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index b35670d277..41c6a1120f 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -62,8 +62,10 @@ std::pair GLShadersManager::init() valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render extrusion and travel paths as lines in gcode preview valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render objects in 3d editor valid &= append_shader("gouraud", { "gouraud.vs", "gouraud.fs" } #if ENABLE_ENVIRONMENT_MAP From b84b6af32a768613b56bac5bbca59e4631d8aa83 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 13:30:21 +0100 Subject: [PATCH 066/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: background --- resources/shaders/background_attr.vs | 12 ++++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 9 ++++++++- src/slic3r/GUI/GLShadersManager.cpp | 7 +++++-- 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 resources/shaders/background_attr.vs diff --git a/resources/shaders/background_attr.vs b/resources/shaders/background_attr.vs new file mode 100644 index 0000000000..9b56ab43a2 --- /dev/null +++ b/resources/shaders/background_attr.vs @@ -0,0 +1,12 @@ +#version 110 + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = vec4(v_position, 1.0); +} diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 00ad99af62..f7142c208b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5352,11 +5352,13 @@ void GLCanvas3D::_render_background() use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // Draws a bottom to top gradient over the complete screen. glsafe(::glDisable(GL_DEPTH_TEST)); @@ -5385,12 +5387,15 @@ void GLCanvas3D::_render_background() m_background.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("background_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("background"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("top_color", use_error_color ? ERROR_BG_LIGHT_COLOR : DEFAULT_BG_LIGHT_COLOR); shader->set_uniform("bottom_color", bottom_color); - m_background.render(); shader->stop_using(); } @@ -5408,9 +5413,11 @@ void GLCanvas3D::_render_background() glsafe(::glEnable(GL_DEPTH_TEST)); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 41c6a1120f..0435bc36e9 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -35,13 +35,16 @@ std::pair GLShadersManager::init() #if ENABLE_GLBEGIN_GLEND_REMOVAL // basic shader, used to render all what was previously rendered using the immediate mode - valid &= append_shader("flat", { "flat.vs", "flat.fs" }); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("flat", { "flat.vs", "flat.fs" }); // basic shader for textures, used to render textures valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); // used to render 3D scene background +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("background_attr", { "background_attr.vs", "background.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("background", { "background.vs", "background.fs" }); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG @@ -57,10 +60,10 @@ std::pair GLShadersManager::init() valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { - valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); } #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render extrusion and travel paths as lines in gcode preview From 44a00be329502eb946698420bfaed36a9cb759d9 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 13:50:31 +0100 Subject: [PATCH 067/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: toolpaths_cog --- resources/shaders/toolpaths_cog_attr.vs | 61 +++++++++++++++++++++++++ src/slic3r/GUI/GCodeViewer.cpp | 18 +++++++- src/slic3r/GUI/GLShadersManager.cpp | 3 ++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 resources/shaders/toolpaths_cog_attr.vs diff --git a/resources/shaders/toolpaths_cog_attr.vs b/resources/shaders/toolpaths_cog_attr.vs new file mode 100644 index 0000000000..7b9fcd9707 --- /dev/null +++ b/resources/shaders/toolpaths_cog_attr.vs @@ -0,0 +1,61 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +attribute vec3 v_position; +attribute vec3 v_normal; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + vec3 normal = normalize(normal_matrix * v_normal); +// vec3 normal = normalize(gl_NormalMatrix * gl_Normal); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); +// vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; +// intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + world_position = v_position; + gl_Position = projection_matrix * position; + +// world_position = gl_Vertex.xyz; +// gl_Position = ftransform(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +} diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 188a803a3f..b2cf368ab6 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -184,7 +184,11 @@ void GCodeViewer::COG::render() init(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -192,6 +196,18 @@ void GCodeViewer::COG::render() glsafe(::glDisable(GL_DEPTH_TEST)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d matrix = camera.get_view_matrix() * Geometry::assemble_transform(cog()); + if (m_fixed_size) { + const double inv_zoom = wxGetApp().plater()->get_camera().get_inv_zoom(); + matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), inv_zoom * Vec3d::Ones()); + } + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + m_model.render(); +#else glsafe(::glPushMatrix()); const Vec3d position = cog(); glsafe(::glTranslated(position.x(), position.y(), position.z())); @@ -200,8 +216,8 @@ void GCodeViewer::COG::render() glsafe(::glScaled(inv_zoom, inv_zoom, inv_zoom)); } m_model.render(); - glsafe(::glPopMatrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->stop_using(); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 0435bc36e9..ea7b826e3e 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -49,6 +49,9 @@ std::pair GLShadersManager::init() #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("toolpaths_cog_attr", { "toolpaths_cog_attr.vs", "toolpaths_cog.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); #endif // ENABLE_SHOW_TOOLPATHS_COG // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview From 4323b602f54dd79436bae5fcc82ecdfe87dfa352 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 13:57:11 +0100 Subject: [PATCH 068/149] Code cleanup --- resources/shaders/toolpaths_cog_attr.vs | 14 -------------- src/slic3r/GUI/GLShadersManager.cpp | 15 ++++++++++----- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/resources/shaders/toolpaths_cog_attr.vs b/resources/shaders/toolpaths_cog_attr.vs index 7b9fcd9707..5951238b71 100644 --- a/resources/shaders/toolpaths_cog_attr.vs +++ b/resources/shaders/toolpaths_cog_attr.vs @@ -14,14 +14,12 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ attribute vec3 v_position; attribute vec3 v_normal; uniform mat4 view_model_matrix; uniform mat4 projection_matrix; uniform mat3 normal_matrix; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // x = tainted, y = specular; varying vec2 intensity; @@ -30,32 +28,20 @@ varying vec3 world_position; void main() { // First transform the normal into camera space and normalize the result. -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ vec3 normal = normalize(normal_matrix * v_normal); -// vec3 normal = normalize(gl_NormalMatrix * gl_Normal); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ vec4 position = view_model_matrix * vec4(v_position, 1.0); intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); -// vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz; -// intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Perform the same lighting calculation for the 2nd light source (no specular applied). NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ world_position = v_position; gl_Position = projection_matrix * position; - -// world_position = gl_Vertex.xyz; -// gl_Position = ftransform(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index ea7b826e3e..3259494ae7 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -37,36 +37,41 @@ std::pair GLShadersManager::init() // basic shader, used to render all what was previously rendered using the immediate mode #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#else valid &= append_shader("flat", { "flat.vs", "flat.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // basic shader for textures, used to render textures valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); // used to render 3D scene background #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("background_attr", { "background_attr.vs", "background.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#else valid &= append_shader("background", { "background.vs", "background.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("toolpaths_cog_attr", { "toolpaths_cog_attr.vs", "toolpaths_cog.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#else valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_SHOW_TOOLPATHS_COG // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light_attr", { "gouraud_light_attr.vs", "gouraud_light.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#else valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render printbed valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#else valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render extrusion and travel paths as lines in gcode preview From 93610ebb02b8631dabc3b2d1c79ab8e8d479803a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 14:10:41 +0100 Subject: [PATCH 069/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: printbed --- resources/shaders/printbed.fs | 8 ++++---- resources/shaders/printbed.vs | 4 ++-- resources/shaders/printbed_attr.vs | 15 +++++++++++++++ src/slic3r/GUI/3DBed.cpp | 9 +++++++++ src/slic3r/GUI/GLShadersManager.cpp | 4 ++++ 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 resources/shaders/printbed_attr.vs diff --git a/resources/shaders/printbed.fs b/resources/shaders/printbed.fs index bef0751580..833dff08f4 100644 --- a/resources/shaders/printbed.fs +++ b/resources/shaders/printbed.fs @@ -7,15 +7,15 @@ uniform sampler2D texture; uniform bool transparent_background; uniform bool svg_source; -varying vec2 tex_coords; +varying vec2 tex_coord; vec4 svg_color() { // takes foreground from texture - vec4 fore_color = texture2D(texture, tex_coords); + vec4 fore_color = texture2D(texture, tex_coord); // calculates radial gradient - vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coords.xy) - vec2(0.5))))); + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); // blends foreground with background return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); @@ -24,7 +24,7 @@ vec4 svg_color() vec4 non_svg_color() { // takes foreground from texture - vec4 color = texture2D(texture, tex_coords); + vec4 color = texture2D(texture, tex_coord); return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); } diff --git a/resources/shaders/printbed.vs b/resources/shaders/printbed.vs index 3b3f8875d2..27addc7526 100644 --- a/resources/shaders/printbed.vs +++ b/resources/shaders/printbed.vs @@ -1,9 +1,9 @@ #version 110 -varying vec2 tex_coords; +varying vec2 tex_coord; void main() { gl_Position = ftransform(); - tex_coords = gl_MultiTexCoord0.xy; + tex_coord = gl_MultiTexCoord0.xy; } diff --git a/resources/shaders/printbed_attr.vs b/resources/shaders/printbed_attr.vs new file mode 100644 index 0000000000..e59a99da35 --- /dev/null +++ b/resources/shaders/printbed_attr.vs @@ -0,0 +1,15 @@ +#version 110 + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 2fb5752f62..64bc8c7dfa 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -599,9 +599,18 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #if ENABLE_GLBEGIN_GLEND_REMOVAL init_triangles(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("printbed_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("printbed"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->set_uniform("transparent_background", bottom); shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg")); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 3259494ae7..dc0d9cfab1 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -64,7 +64,11 @@ std::pair GLShadersManager::init() valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render printbed +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("printbed_attr", { "printbed_attr.vs", "printbed.fs" }); +#else valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES From 545056bf7cdbc21051b76c257a8d615121ca182f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 14:17:55 +0100 Subject: [PATCH 070/149] Fixed warnings --- src/slic3r/GUI/GCodeViewer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index b2cf368ab6..2cfcaa71fd 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1324,9 +1324,9 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // x component of the normal to the current segment (the normal is parallel to the XY plane) const Vec3f dir = (curr.position - prev.position).normalized(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Vec3f normal(dir.y(), -dir.x(), 0.0); normal.normalize(); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -2973,7 +2973,9 @@ void GCodeViewer::render_toolpaths() #else const float point_size = 0.8f; #endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const double zoom = camera.get_zoom(); const std::array& viewport = camera.get_viewport(); From 3bf704932af693c5e47b93ed1811223ab5445b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Fri, 4 Mar 2022 19:10:50 +0100 Subject: [PATCH 071/149] Ignore CLion IDE files. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e3a9db477f..c4df3f3f8e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ local-lib build-linux/* deps/build-linux/* **/.DS_Store +/.idea/ From 005fef7bf68e2e589e8ecb3de80a43aa37043ce3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 7 Mar 2022 09:45:29 +0100 Subject: [PATCH 072/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: flat_texture --- resources/shaders/flat_texture_attr.vs | 24 +++ src/slic3r/GUI/GLShadersManager.cpp | 4 + src/slic3r/GUI/GLTexture.cpp | 8 + src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 186 ++++++++++++++++++---- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 6 +- 5 files changed, 199 insertions(+), 29 deletions(-) create mode 100644 resources/shaders/flat_texture_attr.vs diff --git a/resources/shaders/flat_texture_attr.vs b/resources/shaders/flat_texture_attr.vs new file mode 100644 index 0000000000..bdd675052c --- /dev/null +++ b/resources/shaders/flat_texture_attr.vs @@ -0,0 +1,24 @@ +#version 110 + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +varying vec2 tex_coord; + +void main() +{ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +// gl_Position = vec4(v_position, 1.0); + + +// gl_Position = ftransform(); +// tex_coord = gl_MultiTexCoord0.xy; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +} diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index dc0d9cfab1..fb9a9cecf5 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -41,7 +41,11 @@ std::pair GLShadersManager::init() valid &= append_shader("flat", { "flat.vs", "flat.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // basic shader for textures, used to render textures +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("flat_texture_attr", { "flat_texture_attr.vs", "flat_texture.fs" }); +#else valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render 3D scene background #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("background_attr", { "background_attr.vs", "background.fs" }); diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 340bb78c3c..8cfc8fd058 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -358,9 +358,17 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, GLModel model; model.init_from(std::move(init_data)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("flat_texture_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat_texture"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES model.render(); shader->stop_using(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index fba02963f3..499a2fe498 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -665,6 +665,60 @@ void GLGizmosManager::update_after_undo_redo(const UndoRedo::Snapshot& snapshot) dynamic_cast(m_gizmos[SlaSupports].get())->reslice_SLA_supports(true); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const +{ + const unsigned int tex_id = m_background_texture.texture.get_id(); + const float tex_width = float(m_background_texture.texture.get_width()); + const float tex_height = float(m_background_texture.texture.get_height()); + if (tex_id != 0 && tex_width > 0 && tex_height > 0) { + const float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; + const float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; + + const float internal_left = left + border_w; + const float internal_right = right - border_w; + const float internal_top = top - border_h; + const float internal_bottom = bottom + border_h; + + // float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + const float internal_left_uv = float(m_background_texture.metadata.left) * inv_tex_width; + const float internal_right_uv = 1.0f - float(m_background_texture.metadata.right) * inv_tex_width; + const float internal_top_uv = 1.0f - float(m_background_texture.metadata.top) * inv_tex_height; + const float internal_bottom_uv = float(m_background_texture.metadata.bottom) * inv_tex_height; + + // top-left corner + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + + // top edge + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_top, top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, top_uv }, { internal_left_uv, top_uv } }); + + // top-right corner + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_top, top, { { internal_right_uv, internal_top_uv }, { right_uv, internal_top_uv }, { right_uv, top_uv }, { internal_right_uv, top_uv } }); + + // center-left edge + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_bottom, internal_top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + + // center + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + + // center-right edge + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_bottom, internal_top, { { internal_right_uv, internal_bottom_uv }, { right_uv, internal_bottom_uv }, { right_uv, internal_top_uv }, { internal_right_uv, internal_top_uv } }); + + // bottom-left corner + GLTexture::render_sub_texture(tex_id, left, internal_left, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + + // bottom edge + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, bottom, internal_bottom, { { internal_left_uv, bottom_uv }, { internal_right_uv, bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); + + // bottom-right corner + GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); + } +} +#else void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border) const { const unsigned int tex_id = m_background_texture.texture.get_id(); @@ -717,6 +771,7 @@ void GLGizmosManager::render_background(float left, float top, float right, floa GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const { @@ -757,20 +812,95 @@ void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_t } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLGizmosManager::do_render_overlay() const { std::vector selectable_idxs = get_selectable_idxs(); if (selectable_idxs.empty()) return; - float cnv_w = (float)m_parent.get_canvas_size().get_width(); - float cnv_h = (float)m_parent.get_canvas_size().get_height(); - float zoom = (float)wxGetApp().plater()->get_camera().get_zoom(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + const Size cnv_size = m_parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); - float height = get_scaled_total_height(); - float width = get_scaled_total_width(); - float zoomed_border = m_layout.scaled_border() * inv_zoom; + if (cnv_w == 0 || cnv_h == 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float height = 2.0f * get_scaled_total_height() * inv_cnv_h; + const float width = 2.0f * get_scaled_total_width() * inv_cnv_w; + const float border_h = 2.0f * m_layout.scaled_border() * inv_cnv_h; + const float border_w = 2.0f * m_layout.scaled_border() * inv_cnv_w; + + float top_x = -1.0f; + float top_y = 0.5f * height; + + render_background(top_x, top_y, top_x + width, top_y - height, border_w, border_h); + + top_x += border_w; + top_y -= border_h; + + const float icons_size_x = 2.0f * m_layout.scaled_icons_size() * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.scaled_icons_size() * inv_cnv_h; + const float stride_y = 2.0f * m_layout.scaled_stride_y() * inv_cnv_h; + + const unsigned int icons_texture_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); + + if (icons_texture_id == 0 || tex_width <= 1 || tex_height <= 1) + return; + + const float du = (float)(tex_width - 1) / (6.0f * (float)tex_width); // 6 is the number of possible states if the icons + const float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); + + // tiles in the texture are spaced by 1 pixel + const float u_offset = 1.0f / (float)tex_width; + const float v_offset = 1.0f / (float)tex_height; + + float current_y = FLT_MAX; + for (size_t idx : selectable_idxs) { + GLGizmoBase* gizmo = m_gizmos[idx].get(); + const unsigned int sprite_id = gizmo->get_sprite_id(); + // higlighted state needs to be decided first so its highlighting in every other state + const int icon_idx = (m_highlight.first == idx ? (m_highlight.second ? 4 : 5) : (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable() ? 0 : 3))); + + const float u_left = u_offset + icon_idx * du; + const float u_right = u_left + du - u_offset; + const float v_top = v_offset + sprite_id * dv; + const float v_bottom = v_top + dv - v_offset; + + GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + icons_size_x, top_y - icons_size_y, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); + if (idx == m_current || current_y == FLT_MAX) { + // The FLT_MAX trick is here so that even non-selectable but activable + // gizmos are passed some meaningful value. + current_y = 0.5f * cnv_h - top_y; + } + top_y -= stride_y; + } + + if (m_current != Undefined) { + const float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height(); + m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); + } +} +#else +void GLGizmosManager::do_render_overlay() const +{ + std::vector selectable_idxs = get_selectable_idxs(); + if (selectable_idxs.empty()) + return; + + const float cnv_w = (float)m_parent.get_canvas_size().get_width(); + const float cnv_h = (float)m_parent.get_canvas_size().get_height(); + const float zoom = (float)wxGetApp().plater()->get_camera().get_zoom(); + const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + + const float height = get_scaled_total_height(); + const float width = get_scaled_total_width(); + const float zoomed_border = m_layout.scaled_border() * inv_zoom; float zoomed_top_x = (-0.5f * cnv_w) * inv_zoom; float zoomed_top_y = (0.5f * height) * inv_zoom; @@ -785,36 +915,35 @@ void GLGizmosManager::do_render_overlay() const zoomed_top_x += zoomed_border; zoomed_top_y -= zoomed_border; - float icons_size = m_layout.scaled_icons_size(); - float zoomed_icons_size = icons_size * inv_zoom; - float zoomed_stride_y = m_layout.scaled_stride_y() * inv_zoom; + const float icons_size = m_layout.scaled_icons_size(); + const float zoomed_icons_size = icons_size * inv_zoom; + const float zoomed_stride_y = m_layout.scaled_stride_y() * inv_zoom; - unsigned int icons_texture_id = m_icons_texture.get_id(); - int tex_width = m_icons_texture.get_width(); - int tex_height = m_icons_texture.get_height(); + const unsigned int icons_texture_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); - if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) + if (icons_texture_id == 0 || tex_width <= 1 || tex_height <= 1) return; - float du = (float)(tex_width - 1) / (6.0f * (float)tex_width); // 6 is the number of possible states if the icons - float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); + const float du = (float)(tex_width - 1) / (6.0f * (float)tex_width); // 6 is the number of possible states if the icons + const float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); // tiles in the texture are spaced by 1 pixel - float u_offset = 1.0f / (float)tex_width; - float v_offset = 1.0f / (float)tex_height; + const float u_offset = 1.0f / (float)tex_width; + const float v_offset = 1.0f / (float)tex_height; - float current_y = FLT_MAX; - for (size_t idx : selectable_idxs) - { + float current_y = FLT_MAX; + for (size_t idx : selectable_idxs) { GLGizmoBase* gizmo = m_gizmos[idx].get(); - unsigned int sprite_id = gizmo->get_sprite_id(); + const unsigned int sprite_id = gizmo->get_sprite_id(); // higlighted state needs to be decided first so its highlighting in every other state - int icon_idx = (m_highlight.first == idx ? (m_highlight.second ? 4 : 5) : (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable()? 0 : 3))); + const int icon_idx = (m_highlight.first == idx ? (m_highlight.second ? 4 : 5) : (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable()? 0 : 3))); - float v_top = v_offset + sprite_id * dv; - float u_left = u_offset + icon_idx * du; - float v_bottom = v_top + dv - v_offset; - float u_right = u_left + du - u_offset; + const float u_left = u_offset + icon_idx * du; + const float u_right = u_left + du - u_offset; + const float v_top = v_offset + sprite_id * dv; + const float v_bottom = v_top + dv - v_offset; GLTexture::render_sub_texture(icons_texture_id, zoomed_top_x, zoomed_top_x + zoomed_icons_size, zoomed_top_y - zoomed_icons_size, zoomed_top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); if (idx == m_current || current_y == FLT_MAX) { @@ -826,10 +955,11 @@ void GLGizmosManager::do_render_overlay() const } if (m_current != Undefined) { - float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height(); + const float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height(); m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES float GLGizmosManager::get_scaled_total_height() const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index b8dfdec780..3bdcd0f656 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -234,8 +234,12 @@ private: bool alt_down = false, bool control_down = false); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; +#else void render_background(float left, float top, float right, float bottom, float border) const; - +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void do_render_overlay() const; float get_scaled_total_height() const; From 6c51e5148c0fca15c869d344e081aad249b0244f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Mon, 7 Mar 2022 10:48:17 +0100 Subject: [PATCH 073/149] Fix of #7994 (Travel very close to the inner holes, could cross external perimeter when the avoid crossing perimeters was enabled.) --- .../GCode/AvoidCrossingPerimeters.cpp | 91 ++++++++++++------- .../GCode/AvoidCrossingPerimeters.hpp | 5 +- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp index f846d8cecc..9edb35ee8e 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp @@ -13,6 +13,8 @@ #include #include +//#define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT + namespace Slic3r { struct TravelPoint @@ -354,8 +356,6 @@ static Polyline to_polyline(const std::vector &travel) return result; } -// #define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT - #ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT static void export_travel_to_svg(const Polygons &boundary, const Line &original_travel, @@ -521,6 +521,25 @@ static float get_perimeter_spacing_external(const Layer &layer) return perimeter_spacing; } +// Returns average perimeter width calculated from all LayerRegion within the layer. +static float get_external_perimeter_width(const Layer &layer) +{ + size_t regions_count = 0; + float perimeter_width = 0.f; + for (const LayerRegion *layer_region : layer.regions()) + if (layer_region != nullptr && !layer_region->slices.empty()) { + perimeter_width += float(layer_region->flow(frExternalPerimeter).scaled_width()); + ++regions_count; + } + + assert(perimeter_width >= 0.f); + if (regions_count != 0) + perimeter_width /= float(regions_count); + else + perimeter_width = get_default_perimeter_spacing(*layer.object()); + return perimeter_width; +} + // Called by avoid_perimeters() and by simplify_travel_heuristics(). static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &boundary, const Point &start, @@ -659,22 +678,22 @@ static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary // Check if anyone of ExPolygons contains whole travel. // called by need_wipe() and AvoidCrossingPerimeters::travel_to() // FIXME Lukas H.: Maybe similar approach could also be used for ExPolygon::contains() -static bool any_expolygon_contains(const ExPolygons &ex_polygons, - const std::vector &ex_polygons_bboxes, - const EdgeGrid::Grid &grid_lslice, +static bool any_expolygon_contains(const ExPolygons &lslices_offset, + const std::vector &lslices_offset_bboxes, + const EdgeGrid::Grid &grid_lslices_offset, const Line &travel) { - assert(ex_polygons.size() == ex_polygons_bboxes.size()); - if(!grid_lslice.bbox().contains(travel.a) || !grid_lslice.bbox().contains(travel.b)) + assert(lslices_offset.size() == lslices_offset_bboxes.size()); + if(!grid_lslices_offset.bbox().contains(travel.a) || !grid_lslices_offset.bbox().contains(travel.b)) return false; - FirstIntersectionVisitor visitor(grid_lslice); + FirstIntersectionVisitor visitor(grid_lslices_offset); visitor.pt_current = &travel.a; visitor.pt_next = &travel.b; - grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); + grid_lslices_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); if (!visitor.intersect) { - for (const ExPolygon &ex_polygon : ex_polygons) { - const BoundingBox &bbox = ex_polygons_bboxes[&ex_polygon - &ex_polygons.front()]; + for (const ExPolygon &ex_polygon : lslices_offset) { + const BoundingBox &bbox = lslices_offset_bboxes[&ex_polygon - &lslices_offset.front()]; if (bbox.contains(travel.a) && bbox.contains(travel.b) && ex_polygon.contains(travel.a)) return true; } @@ -684,18 +703,18 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons, // Check if anyone of ExPolygons contains whole travel. // called by need_wipe() -static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice, const Polyline &travel) +static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice_offset, const Polyline &travel) { assert(ex_polygons.size() == ex_polygons_bboxes.size()); - if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice](const Point &point) { return !grid_lslice.bbox().contains(point); })) + if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice_offset](const Point &point) { return !grid_lslice_offset.bbox().contains(point); })) return false; - FirstIntersectionVisitor visitor(grid_lslice); + FirstIntersectionVisitor visitor(grid_lslice_offset); bool any_intersection = false; for (size_t line_idx = 1; line_idx < travel.size(); ++line_idx) { visitor.pt_current = &travel.points[line_idx - 1]; visitor.pt_next = &travel.points[line_idx]; - grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); + grid_lslice_offset.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor); any_intersection = visitor.intersect; if (any_intersection) break; } @@ -711,14 +730,14 @@ static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vec return false; } -static bool need_wipe(const GCode &gcodegen, - const EdgeGrid::Grid &grid_lslice, - const Line &original_travel, - const Polyline &result_travel, - const size_t intersection_count) +static bool need_wipe(const GCode &gcodegen, + const ExPolygons &lslices_offset, + const std::vector &lslices_offset_bboxes, + const EdgeGrid::Grid &grid_lslices_offset, + const Line &original_travel, + const Polyline &result_travel, + const size_t intersection_count) { - const ExPolygons &lslices = gcodegen.layer()->lslices; - const std::vector &lslices_bboxes = gcodegen.layer()->lslices_bboxes; bool z_lift_enabled = gcodegen.config().retract_lift.get_at(gcodegen.writer().extruder()->id()) > 0.; bool wipe_needed = false; @@ -728,16 +747,16 @@ static bool need_wipe(const GCode &gcodegen, // The original layer is intersected with defined boundaries. Then it is necessary to make a detailed test. // If the z-lift is enabled, then a wipe is needed when the original travel leads above the holes. if (z_lift_enabled) { - if (any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, original_travel)) { + if (any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, original_travel)) { // Check if original_travel and result_travel are not same. // If both are the same, then it is possible to skip testing of result_travel wipe_needed = !(result_travel.size() > 2 && result_travel.first_point() == original_travel.a && result_travel.last_point() == original_travel.b) && - !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel); + !any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel); } else { wipe_needed = true; } } else { - wipe_needed = !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel); + wipe_needed = !any_expolygon_contains(lslices_offset, lslices_offset_bboxes, grid_lslices_offset, result_travel); } } @@ -1163,10 +1182,8 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point & Vec2d startf = start.cast(); Vec2d endf = end .cast(); - const ExPolygons &lslices = gcodegen.layer()->lslices; - const std::vector &lslices_bboxes = gcodegen.layer()->lslices_bboxes; - bool is_support_layer = dynamic_cast(gcodegen.layer()) != nullptr; - if (!use_external && (is_support_layer || (!lslices.empty() && !any_expolygon_contains(lslices, lslices_bboxes, m_grid_lslice, travel)))) { + bool is_support_layer = dynamic_cast(gcodegen.layer()) != nullptr; + if (!use_external && (is_support_layer || (!m_lslices_offset.empty() && !any_expolygon_contains(m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel)))) { // Initialize m_internal only when it is necessary. if (m_internal.boundaries.empty()) init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer()))); @@ -1216,7 +1233,7 @@ Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point & } else if (max_detour_length_exceeded) { *could_be_wipe_disabled = false; } else - *could_be_wipe_disabled = !need_wipe(gcodegen, m_grid_lslice, travel, result_pl, travel_intersection_count); + *could_be_wipe_disabled = !need_wipe(gcodegen, m_lslices_offset, m_lslices_offset_bboxes, m_grid_lslices_offset, travel, result_pl, travel_intersection_count); return result_pl; } @@ -1227,13 +1244,21 @@ void AvoidCrossingPerimeters::init_layer(const Layer &layer) { m_internal.clear(); m_external.clear(); + m_lslices_offset.clear(); + m_lslices_offset_bboxes.clear(); + + float perimeter_offset = -get_external_perimeter_width(layer) / float(2.); + m_lslices_offset = offset_ex(layer.lslices, perimeter_offset); + + m_lslices_offset_bboxes.reserve(m_lslices_offset.size()); + for (const ExPolygon &ex_poly : m_lslices_offset) + m_lslices_offset_bboxes.emplace_back(get_extents(ex_poly)); BoundingBox bbox_slice(get_extents(layer.lslices)); bbox_slice.offset(SCALED_EPSILON); - m_grid_lslice.set_bbox(bbox_slice); - //FIXME 1mm grid? - m_grid_lslice.create(layer.lslices, coord_t(scale_(1.))); + m_grid_lslices_offset.set_bbox(bbox_slice); + m_grid_lslices_offset.create(m_lslices_offset, coord_t(scale_(1.))); } #if 0 diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp index 412822c66e..eb81c7972e 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp @@ -58,8 +58,11 @@ private: // we enable it by default for the first travel move in print bool m_disabled_once { true }; + // Lslices offseted by half an external perimeter width. Used for detection if line or polyline is inside of any polygon. + ExPolygons m_lslices_offset; + std::vector m_lslices_offset_bboxes; // Used for detection of line or polyline is inside of any polygon. - EdgeGrid::Grid m_grid_lslice; + EdgeGrid::Grid m_grid_lslices_offset; // Store all needed data for travels inside object Boundary m_internal; // Store all needed data for travels outside object From 568f42660a38c1f8a814f7db3e370dfd53b1795d Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 7 Mar 2022 12:02:19 +0100 Subject: [PATCH 074/149] Follow-up of 005fef7bf68e2e589e8ecb3de80a43aa37043ce3 - Fixed Toolbars --- src/slic3r/GUI/GLCanvas3D.cpp | 62 ++-- src/slic3r/GUI/GLToolbar.cpp | 585 ++++++++++++++++++++++++++++++++-- src/slic3r/GUI/GLToolbar.hpp | 4 + 3 files changed, 603 insertions(+), 48 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index f7142c208b..4212e9c834 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5821,20 +5821,26 @@ void GLCanvas3D::_render_main_toolbar() if (!m_main_toolbar.is_enabled()) return; - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + const Size cnv_size = get_canvas_size(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float top = 0.5f * (float)cnv_size.get_height(); +#else + const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; + const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); +#else + const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_main_toolbar.set_position(top, left); m_main_toolbar.render(*this); if (m_toolbar_highlighter.m_render_arrow) - { m_main_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); - } } void GLCanvas3D::_render_undoredo_toolbar() @@ -5842,33 +5848,43 @@ void GLCanvas3D::_render_undoredo_toolbar() if (!m_undoredo_toolbar.is_enabled()) return; - Size cnv_size = get_canvas_size(); + const Size cnv_size = get_canvas_size(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float top = 0.5f * (float)cnv_size.get_height(); +#else float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; + const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; + const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float left = m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); +#else + const float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_undoredo_toolbar.set_position(top, left); m_undoredo_toolbar.render(*this); if (m_toolbar_highlighter.m_render_arrow) - { m_undoredo_toolbar.render_arrow(*this, m_toolbar_highlighter.m_toolbar_item); - } } void GLCanvas3D::_render_collapse_toolbar() const { GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - Size cnv_size = get_canvas_size(); - float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); + const Size cnv_size = get_canvas_size(); + const float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float top = 0.5f * (float)cnv_size.get_height(); + const float left = 0.5f * (float)cnv_size.get_width() - collapse_toolbar.get_width() - band; +#else + const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; - - float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; - float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; + const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; + const float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES collapse_toolbar.set_position(top, left); collapse_toolbar.render(*this); @@ -5891,12 +5907,18 @@ void GLCanvas3D::_render_view_toolbar() const view_toolbar.set_icons_size(size); #endif // ENABLE_RETINA_GL - Size cnv_size = get_canvas_size(); + const Size cnv_size = get_canvas_size(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + // places the toolbar on the bottom-left corner of the 3d scene + float top = -0.5f * (float)cnv_size.get_height() + view_toolbar.get_height(); + float left = -0.5f * (float)cnv_size.get_width(); +#else float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); // places the toolbar on the bottom-left corner of the 3d scene float top = (-0.5f * (float)cnv_size.get_height() + view_toolbar.get_height()) * inv_zoom; float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES view_toolbar.set_position(top, left); view_toolbar.render(*this); } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 86827442db..64911d6982 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -434,18 +434,16 @@ void GLToolbar::render(const GLCanvas3D& parent) { default: case Layout::Horizontal: { render_horizontal(parent); break; } - case Layout::Vertical: { render_vertical(parent); break; } + case Layout::Vertical: { render_vertical(parent); break; } } } - - bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) { if (!m_enabled) return false; - Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); + const Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); bool processed = false; // mouse anywhere @@ -493,7 +491,7 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) return false; } - int item_id = contains_mouse(mouse_pos, parent); + const int item_id = contains_mouse(mouse_pos, parent); if (item_id != -1) { // mouse inside toolbar if (evt.LeftDown() || evt.LeftDClick()) { @@ -601,16 +599,12 @@ int GLToolbar::get_visible_items_cnt() const void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas3D& parent, bool check_hover) { - if ((m_pressed_toggable_id == -1) || (m_pressed_toggable_id == item_id)) - { - if ((0 <= item_id) && (item_id < (int)m_items.size())) - { + if (m_pressed_toggable_id == -1 || m_pressed_toggable_id == item_id) { + if (0 <= item_id && item_id < (int)m_items.size()) { GLToolbarItem* item = m_items[item_id]; - if ((item != nullptr) && !item->is_separator() && !item->is_disabled() && (!check_hover || item->is_hovered())) - { - if (((type == GLToolbarItem::Right) && item->is_right_toggable()) || - ((type == GLToolbarItem::Left) && item->is_left_toggable())) - { + if (item != nullptr && !item->is_separator() && !item->is_disabled() && (!check_hover || item->is_hovered())) { + if ((type == GLToolbarItem::Right && item->is_right_toggable()) || + (type == GLToolbarItem::Left && item->is_left_toggable())) { GLToolbarItem::EState state = item->get_state(); if (state == GLToolbarItem::Hover) item->set_state(GLToolbarItem::HoverPressed); @@ -628,12 +622,11 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas switch (type) { default: - case GLToolbarItem::Left: { item->do_left_action(); break; } + case GLToolbarItem::Left: { item->do_left_action(); break; } case GLToolbarItem::Right: { item->do_right_action(); break; } } } - else - { + else { if (m_type == Radio) select_item(item->get_name()); else @@ -648,8 +641,7 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas case GLToolbarItem::Right: { item->do_right_action(); break; } } - if ((m_type == Normal) && (item->get_state() != GLToolbarItem::Disabled)) - { + if (m_type == Normal && item->get_state() != GLToolbarItem::Disabled) { // the item may get disabled during the action, if not, set it back to hover state item->set_state(GLToolbarItem::Hover); parent.render(); @@ -669,10 +661,209 @@ void GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) { default: case Layout::Horizontal: { update_hover_state_horizontal(mouse_pos, parent); break; } - case Layout::Vertical: { update_hover_state_vertical(mouse_pos, parent); break; } + case Layout::Vertical: { update_hover_state_vertical(mouse_pos, parent); break; } } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) +{ + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); + + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; + + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size + gap_size; + + float left = m_layout.left + border; + float top = m_layout.top - border; + + for (GLToolbarItem* item : m_items) { + if (!item->is_visible()) + continue; + + if (item->is_separator()) + left += separator_stride; + else { + const float right = left + icons_size; + const float bottom = top - icons_size; + + const GLToolbarItem::EState state = item->get_state(); + bool inside = (left <= (float)scaled_mouse_pos.x()) && + ((float)scaled_mouse_pos.x() <= right) && + (bottom <= (float)scaled_mouse_pos.y()) && + ((float)scaled_mouse_pos.y() <= top); + + switch (state) + { + case GLToolbarItem::Normal: + { + if (inside) { + item->set_state(GLToolbarItem::Hover); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Hover: + { + if (!inside) { + item->set_state(GLToolbarItem::Normal); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Pressed: + { + if (inside) { + item->set_state(GLToolbarItem::HoverPressed); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::HoverPressed: + { + if (!inside) { + item->set_state(GLToolbarItem::Pressed); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Disabled: + { + if (inside) { + item->set_state(GLToolbarItem::HoverDisabled); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::HoverDisabled: + { + if (!inside) { + item->set_state(GLToolbarItem::Disabled); + parent.set_as_dirty(); + } + + break; + } + default: + { + break; + } + } + + left += icon_stride; + } + } +} + +void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent) +{ + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); + + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; + + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size + gap_size; + + float left = m_layout.left + border; + float top = m_layout.top - border; + + for (GLToolbarItem* item : m_items) { + if (!item->is_visible()) + continue; + + if (item->is_separator()) + top -= separator_stride; + else { + const float right = left + icons_size; + const float bottom = top - icons_size; + + GLToolbarItem::EState state = item->get_state(); + const bool inside = (left <= (float)scaled_mouse_pos.x()) && + ((float)scaled_mouse_pos.x() <= right) && + (bottom <= (float)scaled_mouse_pos.y()) && + ((float)scaled_mouse_pos.y() <= top); + + switch (state) + { + case GLToolbarItem::Normal: + { + if (inside) { + item->set_state(GLToolbarItem::Hover); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Hover: + { + if (!inside) { + item->set_state(GLToolbarItem::Normal); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Pressed: + { + if (inside) { + item->set_state(GLToolbarItem::HoverPressed); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::HoverPressed: + { + if (!inside) { + item->set_state(GLToolbarItem::Pressed); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::Disabled: + { + if (inside) { + item->set_state(GLToolbarItem::HoverDisabled); + parent.set_as_dirty(); + } + + break; + } + case GLToolbarItem::HoverDisabled: + { + if (!inside) { + item->set_state(GLToolbarItem::Disabled); + parent.set_as_dirty(); + } + + break; + } + default: + { + break; + } + } + + top -= icon_stride; + } + } +} +#else void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { // NB: mouse_pos is already scaled appropriately @@ -889,18 +1080,16 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLToolbarItem* GLToolbar::get_item(const std::string& item_name) { if (!m_enabled) return nullptr; - for (GLToolbarItem* item : m_items) - { - if (item->get_name() == item_name) - { + for (GLToolbarItem* item : m_items) { + if (item->get_name() == item_name) return item; - } } return nullptr; } @@ -914,10 +1103,159 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) { default: case Layout::Horizontal: { return contains_mouse_horizontal(mouse_pos, parent); } - case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } + case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const +{ + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); + + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; + + float left = m_layout.left + border; + const float top = m_layout.top - border; + + for (size_t id = 0; id < m_items.size(); ++id) { + GLToolbarItem* item = m_items[id]; + + if (!item->is_visible()) + continue; + + if (item->is_separator()) { + float right = left + separator_size; + const float bottom = top - icons_size; + + // mouse inside the separator + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return id; + + left = right; + right += gap_size; + + if (id < m_items.size() - 1) { + // mouse inside the gap + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return -2; + } + + left = right; + } + else { + float right = left + icons_size; + const float bottom = top - icons_size; + + // mouse inside the icon + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return id; + + left = right; + right += gap_size; + + if (id < m_items.size() - 1) { + // mouse inside the gap + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return -2; + } + + left = right; + } + } + + return -1; +} + +int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const +{ + const Size cnv_size = parent.get_canvas_size(); + const Vec2d scaled_mouse_pos((mouse_pos.x() - 0.5 * (double)cnv_size.get_width()), (0.5 * (double)cnv_size.get_height() - mouse_pos.y())); + + const float icons_size = m_layout.icons_size * m_layout.scale; + const float separator_size = m_layout.separator_size * m_layout.scale; + const float gap_size = m_layout.gap_size * m_layout.scale; + const float border = m_layout.border * m_layout.scale; + + const float left = m_layout.left + border; + float top = m_layout.top - border; + + for (size_t id = 0; id < m_items.size(); ++id) { + GLToolbarItem* item = m_items[id]; + + if (!item->is_visible()) + continue; + + if (item->is_separator()) { + const float right = left + icons_size; + float bottom = top - separator_size; + + // mouse inside the separator + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return id; + + top = bottom; + bottom -= gap_size; + + if (id < m_items.size() - 1) { + // mouse inside the gap + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return -2; + } + + top = bottom; + } + else { + const float right = left + icons_size; + float bottom = top - icons_size; + + // mouse inside the icon + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return id; + + top = bottom; + bottom -= gap_size; + + if (id < m_items.size() - 1) { + // mouse inside the gap + if (left <= (float)scaled_mouse_pos.x() && + (float)scaled_mouse_pos.x() <= right && + bottom <= (float)scaled_mouse_pos.y() && + (float)scaled_mouse_pos.y() <= top) + return -2; + } + + top = bottom; + } + } + + return -1; +} +#else int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { // NB: mouse_pos is already scaled appropriately @@ -1062,14 +1400,92 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& return -1; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLToolbar::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const +{ + const unsigned int tex_id = m_background_texture.texture.get_id(); + const float tex_width = (float)m_background_texture.texture.get_width(); + const float tex_height = (float)m_background_texture.texture.get_height(); + if (tex_id != 0 && tex_width > 0 && tex_height > 0) { + const float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; + const float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; + + const float internal_left = left + border_w; + const float internal_right = right - border_w; + const float internal_top = top - border_h; + const float internal_bottom = bottom + border_w; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + const float internal_left_uv = (float)m_background_texture.metadata.left * inv_tex_width; + const float internal_right_uv = 1.0f - (float)m_background_texture.metadata.right * inv_tex_width; + const float internal_top_uv = 1.0f - (float)m_background_texture.metadata.top * inv_tex_height; + const float internal_bottom_uv = (float)m_background_texture.metadata.bottom * inv_tex_height; + + // top-left corner + if (m_layout.horizontal_orientation == Layout::HO_Left || m_layout.vertical_orientation == Layout::VO_Top) + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_top, top, { { left_uv, internal_top_uv }, { internal_left_uv, internal_top_uv }, { internal_left_uv, top_uv }, { left_uv, top_uv } }); + + // top edge + if (m_layout.vertical_orientation == Layout::VO_Top) + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_top, top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, top_uv }, { internal_left_uv, top_uv } }); + + // top-right corner + if (m_layout.horizontal_orientation == Layout::HO_Right || m_layout.vertical_orientation == Layout::VO_Top) + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_top, top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_top, top, { { internal_right_uv, internal_top_uv }, { right_uv, internal_top_uv }, { right_uv, top_uv }, { internal_right_uv, top_uv } }); + + // center-left edge + if (m_layout.horizontal_orientation == Layout::HO_Left) + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_bottom, internal_top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, left, internal_left, internal_bottom, internal_top, { { left_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv }, { internal_left_uv, internal_top_uv }, { left_uv, internal_top_uv } }); + + // center + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + + // center-right edge + if (m_layout.horizontal_orientation == Layout::HO_Right) + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_bottom, internal_top, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, internal_right, right, internal_bottom, internal_top, { { internal_right_uv, internal_bottom_uv }, { right_uv, internal_bottom_uv }, { right_uv, internal_top_uv }, { internal_right_uv, internal_top_uv } }); + + // bottom-left corner + if (m_layout.horizontal_orientation == Layout::HO_Left || m_layout.vertical_orientation == Layout::VO_Bottom) + GLTexture::render_sub_texture(tex_id, left, internal_left, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, left, internal_left, bottom, internal_bottom, { { left_uv, bottom_uv }, { internal_left_uv, bottom_uv }, { internal_left_uv, internal_bottom_uv }, { left_uv, internal_bottom_uv } }); + + // bottom edge + if (m_layout.vertical_orientation == Layout::VO_Bottom) + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, internal_left, internal_right, bottom, internal_bottom, { { internal_left_uv, bottom_uv }, { internal_right_uv, bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); + + // bottom-right corner + if (m_layout.horizontal_orientation == Layout::HO_Right || m_layout.vertical_orientation == Layout::VO_Bottom) + GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_left_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv }, { internal_right_uv, internal_top_uv }, { internal_left_uv, internal_top_uv } }); + else + GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); + } +} +#else void GLToolbar::render_background(float left, float top, float right, float bottom, float border) const { unsigned int tex_id = m_background_texture.texture.get_id(); float tex_width = (float)m_background_texture.texture.get_width(); float tex_height = (float)m_background_texture.texture.get_height(); - if ((tex_id != 0) && (tex_width > 0) && (tex_height > 0)) - { + if (tex_id != 0 && tex_width > 0 && tex_height > 0) { float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; @@ -1140,6 +1556,7 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) { @@ -1207,6 +1624,117 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte } } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLToolbar::render_horizontal(const GLCanvas3D& parent) +{ + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; + + const unsigned int tex_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); + + if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_w; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_w; + const float border_w = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_h = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; + const float width = 2.0f * get_width() * inv_cnv_w; + const float height = 2.0f * get_height() * inv_cnv_h; + + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_x + gap_size; + + float left = 2.0f * m_layout.left * inv_cnv_w; + float top = 2.0f * m_layout.top * inv_cnv_h; + const float right = left + width; + const float bottom = top - height; + + render_background(left, top, right, bottom, border_w, border_h); + + left += border_w; + top -= border_h; + + // renders icons + for (const GLToolbarItem* item : m_items) { + if (!item->is_visible()) + continue; + + if (item->is_separator()) + left += separator_stride; + else { + item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); + left += icon_stride; + } + } +} + +void GLToolbar::render_vertical(const GLCanvas3D& parent) +{ + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; + + const unsigned int tex_id = m_icons_texture.get_id(); + const int tex_width = m_icons_texture.get_width(); + const int tex_height = m_icons_texture.get_height(); + + if (tex_id == 0 || tex_width <= 0 || tex_height <= 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_h; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_h; + const float border_w = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_h = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; + const float width = 2.0f * get_width() * inv_cnv_w; + const float height = 2.0f * get_height() * inv_cnv_h; + + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_y + gap_size; + + float left = 2.0f * m_layout.left * inv_cnv_w; + float top = 2.0f * m_layout.top * inv_cnv_h; + const float right = left + width; + const float bottom = top - height; + + render_background(left, top, right, bottom, border_w, border_h); + + left += border_w; + top -= border_h; + + // renders icons + for (const GLToolbarItem* item : m_items) { + if (!item->is_visible()) + continue; + + if (item->is_separator()) + top -= separator_stride; + else { + item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); + top -= icon_stride; + } + } +} +#else void GLToolbar::render_horizontal(const GLCanvas3D& parent) { unsigned int tex_id = m_icons_texture.get_id(); @@ -1300,6 +1828,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) } } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bool GLToolbar::generate_icons_texture() { diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 5740db3e6c..862b473f67 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -344,7 +344,11 @@ private: int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; +#else void render_background(float left, float top, float right, float bottom, float border) const; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_horizontal(const GLCanvas3D& parent); void render_vertical(const GLCanvas3D& parent); From ea88d0b0ae276495cea7dee1e70f19e4bcc1d903 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:05:23 +0100 Subject: [PATCH 075/149] added Ender 3 Pro thumbnail --- .../profiles/Creality/ENDER3PRO_thumbnail.png | Bin 0 -> 27678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/profiles/Creality/ENDER3PRO_thumbnail.png diff --git a/resources/profiles/Creality/ENDER3PRO_thumbnail.png b/resources/profiles/Creality/ENDER3PRO_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..68ed43b7f1adc4bc6125f70b4031f561bd7115e2 GIT binary patch literal 27678 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 literal 0 HcmV?d00001 From 8d3f4e633ee068184b1508cb022a03a657cfb4b7 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Mon, 7 Mar 2022 15:06:43 +0100 Subject: [PATCH 076/149] Added Ender 3 Pro thumbnail --- .../profiles/Creality/ENDER3PRO_thumbnail.png | Bin 0 -> 27678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/profiles/Creality/ENDER3PRO_thumbnail.png diff --git a/resources/profiles/Creality/ENDER3PRO_thumbnail.png b/resources/profiles/Creality/ENDER3PRO_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..68ed43b7f1adc4bc6125f70b4031f561bd7115e2 GIT binary patch literal 27678 zcmdQ~Wmg+*w+KDk8FUn46aWB#E+;Fc20b^cAA?=!hj1H7NfkLsNlIr| zCrcZ93jhF=6p$n=J0wOrVx(SHjE5u`&1YU|*i6av7o^D?8ZoD3y)f`^j?H@RTWLEV zN-YACDEYKR%>)tV`;FE9n)XgkbZ(*}Mv z1T$&KCQ!U!271}ym(y>Q8lxQqHk>A^Qr4q#9k;#)*so3E^uMDS*f<2Wz)S=te|56^ zLt|`A(%$Z9cSY{p0f#1hm`uf=Tu`n80-RgjDDfL#;2#*e`PrTB+`#-)(H`gRAE3fw zRJ-dO?eY`wd%jov(MJ(KEr_NHGE&eZbbFNS3W6Sxon>|1002~+|8^Ka zb}k_RKnakO64&rvJqhs2Bwa{5Ki@>jtME&vmnYs0{|1ng1;R)Wrlj;J6C$xIFL#YM z3e}@8$2r)CDX}B&j7X(4L`%pPhSS0WX=#f{t#Il0rwldkdqt~$bai(6()NvlBa5c) z57obTd3b1UxP5uZgXjDAO%j9u|Lw~S5$zlW1DR;x-)1{_=0zssIjG8tu!5H$mv{QLPK=dAns z{?E?HjA>AAb7`r$g`8ZBu~2ij{xq{PD^BKC(HxpeLG7vzz4>60iuN z&x$?Whm&||eu=(bB<02L&@XIRxT!aA-rpf$!|g1R>81-{Mj9Aoj1hbvg)7MknVFgS zMpM+3JnT&}GX`6utK zdX`G^M$cAmJkVw4O+EYEnDxdxzwS*-sScMb<*>V&=Mf^yyhtV#q2o>SM-_ttsy<&^ zWtXok&vwiW{sLOYSjrCd{(he&T=8dBnzt8;l0G7Twlo2g%_A}nX9hT&^qzPfLmImZ zN*sbEz)lZD;aI>>=k>h7Koe^TplJhP@|gLQDN3j@hh%iT`?S~9L_(HkXBNRv|A~gx z@_;Oi$EwbHoTs|{CN{(dGa*5$nI(>ZN5K1$)uNmJk|Y+qyO-C{{&hnZ=NBb({>XBT z{@>r#uQQKze&=NAo+fgyCEnRySSSDL26-wP0WS{}YSs+n@(c~5|0G0~zVv09k6tN0 zdj`ru7(OX%N!Vp8(pyuLXGD@pBEgC%siq304o&cRf=%rKZEKV2-*H9pzni6Pd#V@~ zDGl>8L=gV=o$Ad59shLI-)rb|L(;rABGpWw%n7N<@!j^NRm(v5kgZ?(rtM*T3T zHK#6LR8>{OX#Q2fkMBca>gU%$qqT2CMKIg3AA8ra<3=J+H+x7#3NXX5q)Jr5r2L8(=h3WcBx3 zf9d_n?`6>dpK07%O;GU0LeMYGiD73vs9XLA5&xJf90=eo!bRMvCuN)@yw=jtP+aTr zyPwWrHk8-P&MB%QR?guR^t}shvSLs8>Wl&5;x#k)m6mPrFZa=H77G@l!$=jbm!Fj5 zM*eF-Y9-!!T~a~edKpthCn#m@6q4iA8^fqxE`}>@zt)O=y*C+F4Ekn4M8ad=|1*i^ zLyXkS;$kF@G9L^83qwX8pVhy}4k!>2%&ZX3!3!$GlIGY!?=q-GlSB;#=%x?wM}cCU zyEXv9vb1vn5TfhsNMDWP7>4}ps|n6&kuJ9-R%#S#5M5<0X(acL^k;fy{>z)|Y0<|U%)5C`EX1)WW2vQ7!zpJbtQ^}Egf^#}w^)PS z`fXha=_7P~3F}zS6(sYr-tT6HcHjLk3+!_Ah$A$ZklVHr-yfz6{{HJgo!MN86J8T} zGqbD1KLES)@N#*6q0l8e^3rr%2-H%tewid3r{n=&!s=Z=V4e1^ruhvU4Z-tq66eIiQ4$6hPF77O*YW^KdoJ_S#g`Yf{cUe&J^>^fWp6RoLu9XxVpc`MC2x7za4;(i8|376183R*Csx@j!VuV`@ejj zoff*jnTA$>EUa|<>0*J&)6F5~%U+uo5WTBS@x=Zd?Ax*zq=-av_gj+@^o_pc+Xos!rd6Ka-b=kP<@u5Pz12YCqE;7(-WA)v=YlBrec>YUH z*mzz0-*~^Xj=ty9k-GQLPh~l(e_kTu@ORCtZr#0}1qA#8CB&bEWd`d*COsQJkh7H< zHqGkKZCzbH$Xi3&l?1F!4jmfShKnE*_nUt2F~^HFU9~+m=y#`n6L$EVJIQXu1z*H$uXKfg0I%`NF*zB(nF5fhJ^UpK`YFJ4+5 z1e%cw?s4<9FVwa+G#E<87kQm5yL652R9K8qP2_XpII;LuJg+d2ca;s}0LP_^IPuwZ zn-`w)S`(%k{>Z+>Eu@v1A^jyr2nltw%ptQ`sO*5D^CwqHFlaH4h`cIuRnGL2%_99G ze0!7C<$2osd;hx7_5paZ+C;!6dOI9lEJmp-;yE!Am%+Sh`Z_g0Q{(DH+h9;QDD9Y$ zgAU}>xsoF^Yn|%up%EP>TD4`%@$xB(GW#SRiT3M5{O1ipuhXZk#yK?&w2v}e*pP%o zk?=Y`ji5if8Afj>DPO7^0xMc-HV`hPlR<%2|1N%=!g;mOGB^z#k>cy^55TV6{undS zlD4dv?%p|_6PPc+Bub%4lFjw0|1;wa;R=r(cQHO^J!8b^3Aisf@3MYrcZt1yxVs|{ zQq!cM)9`lj)?E1&(yi6hVe*ycN0W8hOhKHii4p%$#Fe)ariCo~O?J!qIOgkZ(s|^N zi3&!zpYO^F>fZbPKgJZcdb7R!&1fUl78bz9XW-+raXV7eqY2XaVV&D}Ph@3ytAxv= zPglUQL4i-oPSR*WzW0`)mvDvk5!V2nI3@K|uIPCu#rs1P<_Z}_!Z6d&?64NrRakcH z--ywjY;Gk^anF@|6g*S&G9EGDd6TsT)OEPQN6>gmSlfuA87eBSUVYv z_sDKsJS|`9e4Bm$5tD+S%jp`D_Qx42r;iF{2bY^Yfed)=qYDJ^`D%X*9NhzE9yzckd_VIe37F)ulQK zTKtH?kY6g7CIIW>lS|icqnZ#aR1Lne>R}_%<+E9gk^1b&Ju}xON1$K?Kcw?}V10d? zkavt5Yxm31v8eCaBSEdBfa^mkdR~kTntVQdVXnSAC2Urxu z3Fw&u<;R3Y+PGHE@5>Q)$~86dz&6_k6XR7M|Gkseu#8}R;?JyE{gkPX1;17r^h&jN zb{9|Ke9Sjz0F$W8=$cYme?Q6u4dmp~7V`cezb=Tn-qAHFZP;kfXxYo;1@9^B}LZ0D2(uukF{%CV&3Q!cceUPxrR_ON2Ay`r=HiK4gI_+@mfFMW-j-9nKhT}_9qzYas@@0OZ|(w?!D zCVzW2K#bjg_$OJ|#u&G=_3`RTR=FMkO%7Su}6$tFIL7h z{@&GY(q6W|I(Hb}K7f-<*z^T8SNP)>DOa&lXW(iTovklZ9k{>Y^mY^!C|q6A)Wn4y19ot5q@C3vC2vD5kx2}kJxwRi za$8;h68Mxt!Tok!MgRZ=`N?7)F~%NgWqbhl+i-%)?+>qzZO>ccT*GD@Jj+BnST~+bg5A zu9z6U!CP8g$Pu6SH>^~+f8lp$2eR@&c=^H9&v9#d0(*dmePc^&8gWtmkU8G34rz;F;_~l7oHunrug63`wCjk*2#2b5n=sza zyuAD?x0=aFwY_#SS+djwRp4G%BIhc8204laTvlLX4C zNzkNTz{99Yhgidw2}*~&4bY*k8M1cl7_E9LTyB z-KW>Vq@>K+ArH9fnB)GTHF58|;lBq~H+r1%s{M^9EGhbQuv0rq?sw8h!1nb@G?^9| zQ180Sbow`r&EmVpm6R$j0%ew!+VYCAR+nBX?a4+PCi#~SnUI;;*$A3=hYKVLSz1#7 zOs9aL%Zdd-VQDiiDnT!#^`u(6>K82S`tN3HDr7;SoeJ(_Xhxlk;f!ltZ2z->!+b@fe~=*yqPGeTisS_*fx9*c2? zl%U%m?>=#AdS=ac*wP&PQPE^j3k{1pG6TqN=DLXLC8(qNl|vjgUIgb)l%PoAs78X#oW{=}Lq z+os#58ID}U6rNs@5VLP9DvQ&KI&ChjWMgB4jod56YzGowbX?c>HrryiWO(M;#VNNn zYmKYlYCoWa83*P{T;#-?G_-8M>vJ0N>#(f!wXT1 zg_gMB^Uyk&_Wlo^mS3t`$_;(iH$FU2b2Hr2+SX>s;v$c;GkhFuLH1a~S1C#_98L zk=ZDA0H_tPd7K^|D#EggYFZmT?DMm*W8fn(De@1`9k_|Ol_V*#e(I`2n!#eE&XI5P z1!s@5!uRWbedRWx9im|!9#tV~nMNc*`gwi+R_sOs|70owQ+(c?TWwWUom|_bNzQ~l z!osqpe+y?s@FL%~!xDw+y03oeLwmZ&#?Bo8SC$UmIvZ9zl~M%-ODvrhR26AofLCjz zP7BV@cVu_2tcr|`4CB`42>>(V(D$FC7Iw5asF=;}QO8LPj%C{8qajj_yXI3ilC)+| zhMd2Hh4dMASMB=V`)Lw|t_q7mp~avXF7&D@>NI(AP0h-xY@cZZ2h+Q6@wVFrz{-oT zW)XmrnQ?9y%E~!Om|gUlspJAKd%U>j!k37m4acP)=hb=voeG{|VUp_HAY1HE=8&f9 z?`2iQQsTiNSt3#`B}M=eu5`roe$+3*%yMxogc~Uu!XMu&iB$!U^Sl(sk$%%yGkDLViZCWlf=7$mr!+Td5ndg@n9ER-Ql90EthJtu1 zE-=T*Mi-`I8;N7vntRxy#?auYdyR4t)vHc+(kDz*-0UiGEGeu5Z1s7Oyw(hbbk@A7 zfdM{A7gYd*at>?;XlE!<)Rvlhh4Uy2L-n6;t zSibXfmBXOTaGk1~97s_khhR&Ud|3D1xy|Hq#Qhbe`KN&)9}>s*hC|*)kn1-5m*Y1^ zow(B%Okdx>2S>J}!yk5Bu6!~|=G4PqLxb}(BOkA)2N>2`%~oR5_$ol*Jv9ywa~ZYE zs+xwkJyGPo#_R$SM5L?1=MxF}qI4-YoOb4SQ*0NBhw6Z8Z^lBnA|qZk@|8 z6H7bQVGL+$Xi=ug7gbasNe@tauXm=b&d-OXr{gu zyLt8*QjV~eeB{M06D6e4UP7bbC=U%2*Ayj-T%7!fsGB_NZB6m(mwf$8-hG4lq1wiw z0^Rnt-yc^b=N|%x=MEvA>)%^R{%8CK&n*fnA{L)wtC%ikw#fTi9R&OP z`%6@DGg3`Y+Gm|6MEwTD{Skk9Z;qK`vu2=p%NLrSuJw}@ITtQT7MIg97gii=W?>;- ztRJau4NfVo`mCzV)06k3Q7uF9&=&Q()dbq>Wm0R(Aj=}IyV zM1_o+;h(cRg`OTolA6xb!a==%BKD2E|9muh{S_5P)Jh{&;8ruiRMx6YRi>iGh)Y1wCk~WDBa|c|*u#8i2w3w}%;7;tIy&ZX+hf$ZSv~&mHd$L+ z_wOb0n!OBPMl<|%?lQP|?1r34%E@7|usB>i0Dcy_&V7BOG6$3;KMya)^}L zg&z>34X&87xV2S)Ap>UH+R87CUWg_2w$8B$*R=+xVBv+c8= zwSqe{MiM-J@6M88Gi@I28W74Qe9;o%(~#`lNE?EJTG z*8`uOX4cokBTxy78ylITsN%^CWd+t0=_XV5_K>V6Ae_<_-cN#zQ;#2x`AiOW*(bxX zCIwXS#4v+3>Ot;@NsuAzPZ*4nOlcDJpy;OQ{3wNKd{sdgTAu2)P+slB4~lZBg_S63 zj0jc5c33NP7NO!R=n4ZJk(>FT&d#pc)m1cU3qsCL3?(I{3vUCW8cVVedyh{0&%#Xx zEy|xra1X(7@=qd2`=r_Bs**oTQzq@#R5F)-KPal=4x4hMrl;@ySpmC!YnHRxgA0Zl z4m9|2hJ2nU%VoS9?j?8M6|ATDEvH5BK5A9>k1-U0EymL&3t=%9M?b`ksHm!j1WzYo zE(Jwj#hUPWELKn4D<~*n#Yu0wj`4>b)eH~{Dz15d!3tND01veLpjr^oqsM->0=b~bmrJD4AZ^~j~j2YTcydj z>)b%}@}!|u zF}ZSg4@W(fE;ROIpBhwkYs!R`7a~pG&(p^X&0w-D`R|3H;Y1bQf6{Ru;Y|xTvB~*#PqiHzoMetR{Ig!3%+FOT<9*uF7 z*=BHLWMmIe0Sqil8(J4|`onuK%Ze(Nns5IbE%JW;GXnGi5#hzf_(&lGVMs1#9Y*~z z49XGXyMs`G5SgByzDnZQemN}qdRWU+KrBhpIt_`>alQhle25!OiXK%}*N4-+E3EED z+t?6Z?)4Dt{>mFoS@^vH;p}Gn_KV0$td3&aT&c=2c-tzbnYl$6Ta4;u`(ZGbyn^wMDpuNCu(aB5TrSOsDjQ&g z{LJDebZl%VTXgqPML=g{xvTr_&ELt9ICe7#+C(M?3Ht4`ikeo0$9WB0MSt&KY^fcW ziEMU+I081v2!RoNxy?2Jo=I#$gIyE;i}r=LP@uOEtGCc5xT>woQqaTbz)ga&Tsb?~ zYspE^*HY5x^N=2la^m>Yqj5ULN zI&sv@+QC8k%NJfqLSC?j+T_GjYYJsJHmNlqFmWjg3NXZRT~9>;fk6P_BzD>r^ul`c z{jlQJ|78JMQ+|1(s_LX2*{UvZIb-}}CDIPs&jF!4T&|KR03d*J@l<$bzh`s+F^|I& zu;d6*+*pMuys>fdD8%RffK?@vFr-t5q@*-yZ7UQV`4m=3!i^2)0992c}1Y)F3ks}pw2kN&uj@B9qiUY-+oCsN1YA&APmK%3*po6KkmB;^Bf9tc2 z4I`BP+S6jYG`FB+OP||WYhp|icl&9N)zXif$%CxM|xE8u)3#f5@>e& zDpqzp9+9GR%b9PvtEJ>vr2^^znAmZsu`$9t@WJ%a@Y>^_h*8FPgfV+~*Lg1iYsN<$ zmf9abhM?;ZL!^K$EG8#~hPwfe3xl=Iw}JkK}7 z6AO+@4+!&kNI$bt=bbXqhXNjx?MEJC{@XBbR?a94kN2 zs8|EbTo-nU@T}t;=4WHLYKcr3$EzN6gU()%Y;m|sJz*3{q8PSRy8$am9y_+Gu)7-f z`M%BUZ)wbOlLyTpBSMT6T57cMAt`}82p2*LWQC7~b?y?r@a_3VJJxQsm=R_@E3)SY zpwcKz{U)KDyRg^#gy%^-piGm!R0OT0mX?;oT&sNKNQAI~Tyt(!Tn>*TWbfxw3t$w@ za+epIhGsl!DEsa6*8A57_32icaO2Z#FI7Xs7;m8%w)`M+o}g}IH|3nLyH?NN3ky{E z3Y3H>MV8(yOdpvz>~(y6D|%4l8D(j)`TQS%8k&>g{gW#CRA}?cWoq)!3FhPAaM}VL z?dPtLe!l)9N%7CpsQbBb#Xo^m^apVjm-d#ipIn_G13L5*wIP61H4&4+QX^=XCUCy~ zF+hZkOG%Qc%=}x!;-c2DsYz;vc1ceY9PEO+9%Bg>?FX<;^a%F0qGUU7Xy;{$cy#dQ zW_`Y`0w@!bq)0~@>!_ivU9;R^*uHsTr0DaBn2Nmx=O??}=Q-j!Jn04CpLOrAnwn`v zl2I71Up3Qw8c(n%3?C+^avya`vVZHjn-mKB60?lUopRfa7Z+1EH#Y~XWsfED$oNO0 zleBg;G#tw7rh}+_VMb%|KB{PGMUJH~cx<@Ozw@uNB}q*2%m0dPu$=75^m{U}e>MO3 zIi5Tsk=HSlR-y8HjkLBEgRNZ^M|Uf}LI&%=uC_tQ+?-lvRjf5vze_O|ieP%-5Gd2Fy-B?=s0SQV7f z;)SF5*0vVI!fzYP(yDi=j|2ZUIDd9Xx#`zb#Twv3fGtWwClOhn!))Vx&$g>2TUuWB zt_8&gaWw9n49;1?m}a=h0L4FLP1tqYRH*XrLla{@p+CyXEcAr(GasSAMOef*Nn%Lq z;Oq!et!`D^(?jOApC5U4=BS~iNvVR{{}%8p1`<~VMMuKjW_ldiYiMa%o|saRu@Xqn z;tR5H&Gj>VXDn;KnTtE`J1oz6%fb3YxgnrQM`V9~5V~~^M+G0_O&ThuYCt;IU;|Ob zMKhk>%&V+knLjRSZZ&i|Pg2zEiwb#eE&9X!Si4mEzb zIC}5gP0u+es`Tr=guFLxZx2ZJWmr7oiep9RrMA+?XD!uyQ{TvF=1rLA`tKAE8!T-v zFZ*!RMSi}WJ5Vt=JdU*!D@hg&Y;zbCT>iZrjhSV`GA$G9a+VmBxV8+6_M* zqE;))Z5ca#sMmQzRsKbgh`azZ8=|787JGNcV+}6hU59IEMBz>;H`USP=F&viK}$s` z3`*!vTUQs$+;$H+apX~T)OTFlh5!1p-Yh^e)@!okYAp~cz$10 zT1tyUSie@|X**u~wWhuOp`GraUPB@YBrcZ}U6@Gh?X#{Ut2ytysB87NECZiNf&lpLTWssv3L#B>dEs*qljno3si8jS^U$ zp~uS*zaO}Eed-#&7>xJsh6yJL%CSR6g}L;^gv8pCo5}+^hUaL z?nN!Ui;JX^gzS+#2R-+juk#*Dum9qqfueU;>ZD9-ZBo1YI+f-ra1j0{{u9#F9q~6Y zMmT5bgr>?W+52p)Sk$RLLMT9lQW9*n@3`0vd?30^PAd!pR-z&m{?IpCdN2j1 zbWBNa5fb_&wT7lRGjWIlzAC9u;A(U!%u8uiD7LYVGy*i0gLHd)3q_8~GO=zS6RRg| zZ_7{~^(^gu`-zAF;Lo!eQ zquM0S+H-@AVSM@}=;^$Km>5H3WpU9nq=WiT_jPYH)Q+=*!t$Zz1~aIfux=&sP4_7q z=O?7$ZrrI1_Dt5lebp~Oc; z6R)PGX1U1<(FM%a^&L*v@D=N5jx>bZVqObTOE*S<%HhQ9A;kc-#fzG z0%xJD$W_V8YUwqZwj*VX_H#UO1ayuu8+PIzFZN_u8Id{YsEBmSAWmY*a4KbTUFw7i zz8hS=1Z4QWeAi}B6n<8qqfz#`zGQd{8IZS38PGE^YY9LQ7xVGqhgw>ZP|u^ds0b!4 zEe(n_L&kT1=^v|rqT!zJcS=*r&F0G|vu1qQb=-}DHgR4Fyts^-4{rO60v~sAkg0Oa zbs+)wuS7<#M@ttcP1Cyr0-h#XU6gSvjyz1{B0t>kwBL7HYV+IM%!e7BFz)P>P?Oxx z88FHlL<)KudZEsVrlzJb*aSM2mV5jNpoPw*H2E*^_d@(&$dm6nRAREWvEitSy|Z7w zxV#RFENYr9Cn46V(Q{FQLN-IkHW{}r;jB5vCNj&(>ZZGP&g2VpSWOq? zE7JSw>+3^X9JsYr3rcmMhyxvp?x9puN?V%%s%Xq?ZYJ#Q(Vwh$z&SWLKzjr^7tLU# zzz2EG+Z5Qc4zmYq;;ikJj#Dk2sdYs}$~F2g`OWW#6$RNiK=?>>3XzvBJ3G5oNFs$- z($+a!(8WOC1W~l#(>rzqr`6Opz%}x)TCW8bfMMu75FyvL7WVXn=q>aWKzixTrH;-T zOAX}^Tb zEe=SdlPck`KBSBW#acr-vYacl>KzJUVSf8RuYo0V6nY|QCH1{riku(Bf=@B~S7lO*eI}ra0}hN=pdEM*^8q6gxT%{5BJ;(tFiajR=5@6HfD`X`ZCu~b&(Tp1`1wC-cH6X8 z-s&Nc8(r}cLp0{ERSDFxCoL#D>cY-XI6o;#X+_ziOTEvV z6r!YlP37pC3HQ-6X2&znvoX2)y?mE=yq3&R z(Oa3~9%*C1{nKDUQ_0;#plWN(zi(F7UHKS~)-r)b)sk@59;MfO->l>d`+aXWkeq;P zGeR-}WGv2qDM?2ck`d`T;*GiDS9nahcIGUpxO5h4w+L53o-7)Vc>$Cdb1nvDO%3GR z+v)!ThTg~GKm3#M{jG8MiLlbhL{M0}KP=w6<){K9rkvB=wD9T> za|eGLa`{;xrvM73KXTO zxhn!3@}x&7ZI*mZbXBn?o`05F)9|{FNYI%~q?(@TcyQf%<*zn;B_l2zsleUXFf0r& zcgwxbTErOSY&<`qAIGpESta#3`Z$w}y24K?>?}eRHhwC9A4pGRVY85`_xAeJYC{2%n#8pt zi^Z?v9!{(|X4vZ^8-0r{e%u!Fj?iE+Dsgflfi(vS_e5|gM{PH zOUdI-l{)lQK#=EFEJ@5A9eK**V5+>l{u@n!Aw%-_&%|?R4rsQ`NPA7MGYNFl&>C$j zGHLeQ16b+pJ+5gU>o=Xcx*Sn$S<~yI+k2qIte;ASK(ClkV6UH2L~E6DrY!YL!d8^Dj!vqj)0h$hNz4kU&U^0nuaD7lu^ZFH`1 zUhD&QLBEaKzl{nllTYnSD$=ABnk#cP4pw_k*ngcLm(4{BO*Vdl1tc=N0@@+XA>=&kDY6CokNnCT5DcCK?%`Akuk6@!*K&tLyw@zp58Y1G_r8qn&}MF)x>ay7>O{Y}?A6SNOxoe2Mcz$`+%{M66XJcZzg^IN z<8LMu*zsK!6Z2G-&L?)O42r=@3u~^;Dpx*;^5_>&^RBW83a7W zK~|%eh8^3w*xC?>-}k66Mf4e5DU7zgK}BEW^L75ZnseZa)~7b_6q>xg<}3^i!=dh{ z>ngOdO{kYEQ(JDffkIWj&S0uw2%!cYhNf!5@zw2*@Ybfd8s%a`=MfHm#BdE~_JDPI zIR+3>cJi*$K;sv#@x3p0*@)a_5(`{6cae!}O1Hr-Q z3_3}q4ss~1j^mR_^tzdeZr0!sApGp+<_@C#{c*LEV2ok(WsMu^WV7=h1&g&-hYGL_ zyS73mMeTPoW`=O~0AIlLM9EZNo+Ssid}xBTl*&v%?Q;Q3vAI+CS+okffpg-YMfE(04cGE&){nUyVSDP~ac z2}F|}0#%e?rGCd(by?jK3-JvT3KW=}Tos=(j9dOEur5He74Q5|0G zfyLGi#l%uxFMe^AZLC`ICfbuvtK%B|rrY@jD|Z@fRP6oMJ0K*OB1Q^!4_L=7+KKhA zYC4hz%9hb@(XYOx&AhW&Xz!W5-v?2=Sp)=x(Z-qbzVoN!&?I`7&^K zDkzT3E$uOh9(v-pv0IzMx+_jdxC3HB`MWRLcY5x%?(%#e2}XCY5b1hHg_&nA(slkp)K8bnU!xI zW_Gk>xnI9ZmLe)ov!xCC$FQ8nt(&LXrDSI1xx7)gQC|P71R?C~>iUp40;T)#a@b0q zd~H3W>s!AB*nNN4ke#Y<7h*$ZeRH{sX@3de@(rxM~wuC6x`ReZNA0P$|01+ zZ$yHc`KyIjP6$_6rRUbyI_tLDXTsvVXlSXNE~GdLoR zLD5iEjy7csE!ot8c7A^gK)Bx-Zixowq)q#Mi9#6A>AsN|Yf3@xE zuS_jVzD2n8NR6z2^GHqxHP4q4jwz<1hW+N z2P7)kzjKQn<>Zz)-NUYn|lb$IFl)cf+(*k z2frNTZBMtF8&k_7x1s_C3+gu-_#V=|w?ChW2H5o*cZEe^1ZvCCy9`7S{GE+DAFWh1 zn_b)tIS+b|nn}gg(_3?OP?Pv`+0O2G0`zY-K?NlI{cEZ}W^YxjL*hVkuFJ4|HzMUZ z?|7Okw&OvG6-+Ca$sS1hH%97n)x&F`hK7b1mehZNFABckgal=F$hK=oz2E&AsdXKj zdg+WMlX>y-tr$m8#Wy#{MX_ABpR5^&Ui`pd9e>*3;_9~isUV&yW#oQ7j!QupDpE87 zt{P5%-zog1E!skW4C3>CFa`;1*2)ekJQl9^2viyE-@i6{yu#Z-#Ers`DUQCoE94~| z*znp)RP~^#x4u+EtE(AFXUX~F+Tljwsh2%sHg+TZY)==fDXm8|clOXrN-X%fO~6_! z^UFL}ba60;8KkhO3GNy5Hw`prm`n?OEViVyl+bRmS{$SSE*AS>Yx{%4VU>&dYd2vk zc4}H0G!{)T6p1eRDNBlvbZW&vK>Ew6y_H~i$u}SK%#V=IMX3_dT&s|yiu~*vNhB!N z7+lodO?rCj0AK(JxEQ~ufUrl0_F<_xg6-f(%1C<*;bCDwa6kkDk%Uch6eV~AszO(9 zlspq;mL7O8+|12RGzz%V97{uN4<3mG86FXw)xV9W0Zb0o2ra3U8t{vfO8u@qw7-Tb z&lejDYxZBufOqVDEWZe5cbC>>Y;EC^#06sfUMhJL6E02y-kq*R6&F+fz4RvU#)}z- zX2;U>Yw_b$m%*I+phEz=I}G|GSvAnzghdl@EmT zDtda**wvp)@0o=SWKH!3yA0Meef>2R4O}q?2NtM(3VqtvjfbZUSFcmAv*IRv1v3XyHX!S>evy2Rnu-QN!An>~ z77&Y#XBw)pEk1XU_XxDyq>=azJgnpeU$5XQlEG6`!8JiRa14w58=M<~KU=BasDuz|n9i)Lu; zk4(ov`bN{sW$`RQm!Y8jJXRGw?)FV3W)>w}^JflqZ74a@6&}x4MG{;X%Nn`cbpD6% z@9iidFO1mv{1f?D9iGRZ)FJ?ushG$|0LW^XQ3dvC>~Y*)8MQ?${NwsvZjYzF+IR5Q zSyPhj&A_4wN5qGvLgjrNFIpA4FS?l`F>oao6U)*4y!pnDzu%Q(#Vm0Pp887>ki zVX7EOs(W8PA=wn^!ghUkiLn1>y**A+H4yhEsBC$rYQRTPx6_cm7)+tu`sEn~fQF)G zg5QS|OP}C|f^ee^C#5B}vdG+TSE-TGD7CMrp*K-Xp zO3IGC^Ubo3?c;giqxPL#{rAnl*lQoli`<8uRuK31SMgI52M+s^VuMSOP+PjuBMVMqL-GxT2W&{VlZN0F@Lp`db{>au{?p;Pyz?vaNh%R6M zh>*$3%EjPvG>~zbIrQ8={Rz!)t*}mKoTpooZ z?Xm71869P9+3!l8{q-xB60kjaHq)oPVwZc;bV5$7co)z>5NhzwfF~T>lRyIIl`Qro z1FIWVB)Ij#^>H^*v3>R5!r{n^?z7c&Qb|O)S-&tf(tl`QJev|Fo;Mnmtj-e3Q_bT+?p?uKU8VuqUro73_jY|uf%)a z9NX)6g3|x!#MXp3Vo~grz34PO-R`M#(Cv;5^6`sjWUQoNwOBmNE%t%unb{god&#I3 zie3gc-V*hT#$qL2H9{pdd7X+Q3blzh#~OHjHOU#vm_PG#hS(;H?$v38lS{uUg78p| zn8`3l((sqw&io~}zn4B364nGGfpvXt1=c{v!*>GLC)a-FYfmnYZ`N<$9w_u#e9O*# z_PfkZHs1!-zCc{FM_~+*L1rv6a4cEE++5Df5#!OUce!OQFtVEN?dIyLv>ojr=wr=< zz*_m70Em5c+H3RS&G_^*hMOwV`(eYL6rigBzbI7Z8rYWqR)!_$P4Zp)h%6?WcUg^% zv=vx*!Ap*yyEmuZ;)D>Ny|xQ%(<$-c@$rTve%JiI2Y_#0BBTIow7=76ee`o3!ysZe z?V*@1Mh^z0-R2X9#r?YLsN=1!fz+uAzbhi}71bU5E9Zm}i@x{sckW;YHi5T&WE?pZ-;7juGLvjxt?k#%* zd6{e`87TqMjEP4CahIMJ?=vm?nr$Wy3?b*~nG_YXGv3Ery2~dQ4}}0Wq@0x2TB_@f zv++}s4Zg+yK^|-ci6gR1woD=KO>d3qI6oM8vMYK+nefK)@BO@#OVWX}s(p{ZZX;fB z^_h7&JCA$?ze~pJj@MgLA8$ z!{Bp>&hY1n7Rwl-5>COb&KdcI`Sj(Pvt=yXM9)A=N%L_-y7(WkL?|mx-H_ftbvU^G zXkxzGY`1&j_wD4^`_Y|Zy=IvI*^vp~S$#l2z&*z6B2wedh!vFhlYqN&(FP_a_~1MG zZ$xp~6J1TI%|fdn?;sZ>pu}Ki;i95P8K6QbCcuSEL9sM1*lSg$+ekQ7qZ=_i%qx1f ztPTxnzsat0-X=ZX_9l*Xp##@;j|uLA0}3fCq+ky64-S-7k%})~++~OX=`3K!`ANv{ z(&L~t0Pm(B)87bX*3gi?dpCRiX!F1HmQ`&t$#>ONYLoYyP8Hcp#|;g%;q#+d=+I*> zJBkmzJQ*mMq+}bdJ=^}PSN-$ngYS&kdglvYl;TMzYwAqm!#`)BnV8nXgI#%|Zb{)( zgv0CUB-DG!Qat{xewP0Rm+Df9g@xnS8jaMy9wOI&S6XTecrQX>|a^Xat> z3c?fg`g%K2k?@t?*)5DfEfWfE$VS(MQ$#QD_=$Kmu0@0IVpB@TktqGq)FI z7}Ry2sc!sswQYZef{0yA42GaW&wjSfL%LqXWM7oj4vme)I0yzdGzgpUjR5HaDa)MP zFQuWuuGU`uNxfT*BksL&-iO|m49mhtpTZ1LGAz7`FY-S0n5b~P6?C=2pRl3ojepPy zC}TGg;?(K0apM?}g>o|$rswBbHZ+~0FgiAtF8=tjYcS#f$G)e)wtoAoBZ!sx8OK@S zX3PHc=~IWr@3+2;tdB?2Gkyfk_wD?$vV^Hg?L4rseM}Dv`M#R|hT-b!s%|lYKAJ+v zI_C~Pxf~gl$X>g>c5CQklSnw)0VPQGbwd!64-qt49J)p*A3eaK9;)zEXBcvE2qaO; zG4N+%`o!FetJvXhIm8r&6PoKdoAYpSpWQyFkldjdHiFD3lFiqq_L|%3d|62%;^qVQ z*7v(b$9|csN&ic$Yz14D`>#s{eOi`<4#@QMS&24X+obP)@#aIQVZJ=;B6w~XrB_x$ z(3igpSHSW)03A`c9Q!-fZ+aiiDzMB<6mgy zu~ERDiLRs=sI)8$Y(s#25)-YbOb7{S>4OuH_wdG3yklr`yLN78{IKNpLnA^$Lel)g z%C_0RcmWWMlB>}gI0paM!v?Jqpd-{W+ZFC2BLqp^%5n&WLmR`}cKNAFuAf z{Wib=s=lJ`2JrfR^4uk%v~*A@6*ni%%U21lkH>U^d@uB5Ut4nukCk*}$B2Qz8xXdm zsZp0sI~RaGQ`RYW#9g-}9L8s&w21m5t-=Z`(u_3lq@TefLHNcq+R z#f1??L$PzrMr<8S`UZ}(!em6(j{+M$2i)ros2CYD_Bgdw`5v65y}WtmLz1cB$AUl% zjgN;%K5Rh^J~?@Pb-Hidm;PPq^=n20lyDs)=x$h-#4uU84NZhv>ge7dbmOLrzOO4I z4Xrw$Iod`?G5ofZQS0lL$Vgdaq-S@>;Oam5ypibNq=Z3~&u!^BKghpixW;$U4Px3u zC&c}Wq2G+YKFkwOEQO^m-*!yO6+pwv?Pk1EL?>c&xHsq3WmP#A9#BC7SmQF#g&jEE z&Z3H+dEmEc#(BCc*Dz2+aAMF2rbAx|<4r*fQHAZ4+t%ETuv5LG=)n(Z=d_-ZTEF3@ zjY8``Zm#sUWU^%cIZ2DkS|U6|wF<;*Hr_wDxeMvw0l`d!L`0c|9OQ3V(GeK{Q4BQ% zjZisP7zO(|;;jq>mrm5fcKFSOYa8Y36H2~lp6Qq{M=pHl6B z7Ay(jwzRWrD^TwM4vL)E@SNufQe&mXhF$ypYRjsUac+U{<5 zPJ&)U?VKO&n4b3o(4xP6=)3+LIKCPG6l(?P-<*#DbVrokKy}IpypYx<4{h;|OmfY# zGd_vpb2uI$TB;4>s)A9!Z&bM$3Ga~7RNzsf=rMskdZb?UXBJc8RW0(-viZ-OU#$(U zV@riEd~r|2_m~1RArYOp8ykyEOhc~3!}9p)=cDX^=zb0j2{bv`nc0N&sal-daJqm5 zB?8gG-5;w?@!9BSJc=ETf?GcV>3z#70kl%i73owT^&i4hRz?a2Vnb|SU!TGHuN)xO z&I^*{DW^*5>e4&a)3LF!0eOK}P%s=k^RBL^CVY2XTwDxXT)r9&NB&s-2T=@`GPId% z***rPN-nH<)ektzv+C>DodJ1l{skDc)Ya8N`N=>pVka%Wl0cZCq6#_Wa9tv$*Kboi zM0e(oCN|Ym^PwF)8R$SMX3~gCqh(CL0YH1!*4JfuP{B;lH|)=T(UJPyT#w1cb7^Ut zq5krzah1T&FBcv&$(|Um{hdJzyA(a#9<>I`63AoGvL83_`>{qH1sijs)db3XW?(_)_t7I zZF>FApU!^_EY^@P0syPSB5c}u?tEsuJz{{<-j4A=ut(?lAf@Em zj2t0?Rte|lFviRIu=1mZJe4_ zlBPzP0g48)_{FV+w)iE3GHj(X#8YWR223j+X>#uF0;tfo(^EkZA7+_^qNgWN8Ue3q zgi@jCiT80U51jqU>~IAQwVubqH>$`SU3mWxpjyZBwnpoS;{a#Q72mX7GiBH4Xk@f_ zpjHs9V@J5)fd5KopX_Vx!|oS;2TKb4(M~nqg=%xw0<3kBZ*8Dvc@qLQf}{z$ZtTZf zp0}2kmaz3s_t@CkonyqWWjG;+CntcnuLd65cUj@3n{3jm-}ArMzBxY|oO9S6c_BV? z*hOnEy7%k(L;VL4EI^+E6BW+jzx=Wn!jV00+P9d&m54&2AiYlLI2rcjdb=56I0?xj z9%B<+{CqgZ5Le}K2|4%IS+f;{nI)}@ZbzkQZ@GmkZH@gDp{xc|FCVCW{Pwf>N+S+E z_Y&s89NkUv;*xGq?7}|$cPID;p32FYTdRiOLS&$+B*|bm7wj>uLjfkzkGLC7eNTtN z#9;A%hek#s^`BgDq2it4PtnM8et+*d*F1;b_{f%&9+Q@AG>o+X|5+>tyP;`ov0(Xc zE@Po*RPbTf$To7Gz2O)?I`5N~VDR`j98z5Wn_}ZliD-UQZrN-n=+@AKv@x#Oo?zoE zp=jqOzj)JB+fS>W4s=9HBM3NQ5&451{7Bsd@L)XB+<)y~oO~mZLL*_Gipt9EJTCY_ zhB}@rae_YMeCJ8IhM>XnIA70W?$!KMoRdRPfu)D^PDDL51{!~y42;)QOVuKYCHK}( zjFNNwhQHJKNwI7mt^chN9;N720u7B6R;Vocm5?=ln+hcF=~Eo3V%=Xu8R7R-c$lA) zf7fB?OvL<*4Xm`wz@q(GAdFD|XjX_(pp)y8#~qXV5mM&n>`>-;PX_iEX)*<@M%$Cs zbvu*Rj@JaMLAe$wYa%$RT$$O%kGUJxj2!4*X|yNxoAHWb{2kCy7F^Lf%(vr>TKDO2 z+upCZx5+T4%NZLNF6LXW?d-7ZHiZ0f)m;)SC66_3<>A7`!Ra)rFv`K^ZDPkX@Po*f zogNvW8k|0&{__mc3fP5ap_SX38dc;*Fhr3fm=J1xAF>4pXck)7Fi)*u8C|r3uNCtA z*a(V`tNdfgPvzKsQY5r`=uqJcD^x4K!uy09AvHAP3kPWx%|otu0IQrAEG@)1FLm7p zS2H+PL56D{hr>4^z*7gxW3pWXfx5coXEQn^0Yd771XJtO>2%sFz9}M$c1($`znR6R zsB0B@Bq2u0{pmAQ18j|kFoFA&e;x!QmfU*Y9S)N)*1 zwge=ilNG{MPX=U1DVNQp?YQfJM7Rf9u3m;t2b~ROT21`i- zSto5ZrRK`T3zn$Z<#`HR+Wq}X16dW+$*j+YTseQKaKsHwO+{*d7pT(k{8G5wgHc5B zwDMqRa50kvgbzaBQl&{Z8~O{}!X0X@B$SuHO&wJ!9aGJx$moifzFm`Dy!PWQ2V0eA z3IlxysOm6T`dBLo0ZWTcNWN!28}Kv$DM~^W2@AmmHHtYR%Xuz2Nex?JBzsSr`M-yo z*r%u=l1MDQtAUe(ocUR++EL zv}fw<=Za2#|L){@^wF_+J@(#nRqh1(uxIh6YYm!j=R!Fsjo?7%qnozQ%eJ+)daYFS z(n&LMCWXGCR0KO?t08Dt)AY$y%lyMQ%>K9jp? zjus#+_la3eGti%ypGu=vv(bF2CQ-tQmWEMCA-MT1vvZ70B>rk=(9lo5Wi^~cOA7To z_;MwkqBM?%WsCx*??9lw?42PBxbBD;PPsuihCUe6k-Oe=nsiSlLtYk=arGMQ&c1rz z|2JckW^o^1?6i&4U@&cFyvg$sjDW29N%OeFwI?)8YP|6zE+VLpnJQ8`{$8G_riMnZ z9P@t|M}S1DXDMAbGuYkEx&9a)8#@UB9_7W>fGZw2J?OE(q(NF)EU55BBPBX9as6i} z6tqkruSS)Mv$|OD!3(=_W~ivkj04(W`=@~JSjHyd!I@~~#1@?x$!o*M{e@&y_-z4n zZpd66ZqVU@$~)@Xbo9rOOTUHA*VlKTqq?N7k>?E+NV^G~z>a8IT~uw3mC3z%!w5z) z1JvYwE8JpC#WOU%C*l17N$2;SM$u0dxUvQ?WP0BNEHhP=d)AaO8FID~>DaI>OPsY^ zf&D+jf10uik`;uq2-8Z9&wiFDe+*TgZ-e4uqhpk)Yur-=)T+aPGB}X zLErBVh;AVbB_t|$nczc4vVaa4Xgu`c7SxVf1NjR{Cw$&M_IS2jRE@{rp1s~=yxt?b z(hZ;k?PxdYul0i0-Ca-jyJ(3Fli1=PSj$OE-;LGNIZ?^@5z0hNd-)<-LNbqSBY)i{q&^;bS%+WiTfUN~2uFO25@MDY|3_^H*^@sJPCbmf5qaqbBSYD zw?LR8D&&8(DdITid$Lrde@yTZbM=B@QFgaxCWFOjmUDdzJlMislH zgZ~EX>^kChcDN_$>%^^Lz9%zt$Y1L&NxAEL*)iAUmG5u?Amd(~^UhmCqjPT$0s1jk za^U{yc5iWh82aK}1~*leroL`pdlMWFEE=HrOwY*K*w`f{%02dt@(VX)R3W%p+(Ao% z;aTAwVWh9Ln<7A$4&H_A#erMO+PY*xY*!8ClqSE12IziO&`74<%Amw;hk1~d@D33F z>{g3AdKD#2uO_Z0d$eD_-tT*uj{kbS0`7pJ@r2#il}pWH?n;K#L_gjfl;!vxy#E#x%^(!`VVEo`UF;oDq8dsA-CVcF$ETHT zuy=I(?>|vN5(G#fl5$1X?FGuhrZTJC(I+f!56vzbw#T-I?T=S&pnqrgr(IcRvp8w_ z4@#fv$*MZc0PjsN(5XB(8*zlvbelZ(gFyGxck>k%qX>qJnGID6{BClH1b?z@J(uDB zVke3*UBdf<@5{)?)2r*bAj3O4PCfbt4i35fL3bYi$<1^*+ea5n;Kp!!E z*QkPm`*1iMj4sIS?QLjShk+2ujD7Qecm2_(u;cQcA^X=AyI@y2fvuYf1#GE{dt*sy zf=6dr*sygfeWWcePMYjtkTjZ2n8`9lq#Pn zM`C1HTAGuq{nE=;tCIRDo%7$j&g{|m+FaQQI{Hn09zQt*dOhu+aH!w%2S)y)!t-X} zLVt69x^E|943$I_77p9M4;FJRUtA>L0 z9200@WrAtB`{az4OxX{}f1mosSbeS=f8R=|fwHArR-um`xfRvRyR7`kpptLnkWN^0 z2+x&r9#eQNGt;^p9BSM-!?z2Ep z(b5tK1OorC>B>z5M}@K|rZoHg;9U{pkhh^>p@?@fdp|jEh`4&CfK@@Qrvh7Z(ZnXBr1+Lw%P z`c%*-7v{wK`>BcyXj6V}k-xW&alGG9HW z_iv@I98Zq_9;Hkmm({BS6+Q?A2K(=41UzD!;N#&@S;$Q{U1kn8u(E=IO6<%PL3`WV zzR8zPE52y2{8jxn{`&-lws-gMN8qAiNM2svA9u;_V&kD%E7P*!vYYRFR~#2*9yUa~ z3LP=xBK>hAoG_=6_7B^eFC^UMDp}pSkVTti7>~cxCdV z)FsAt#HQv!Rn|}-qVD}_NMRt|)Wm^^=M+cXx??lDq7YIQiOh+TV6w>h$yqm)}YsnP%;-O%JkQtiM;o$&qaAs%q6qS@Z`la6F#tEGe zl0gV-nr`^EW{zI3v84n*<0F%P#)TXFRF^BT(nxAdqZ|`p^pc!h?7pV>mS*IefvfkL zr8-(UU;IA6FPP7it_syc6}EqN-R5VZBVMrIt?Q_WsQRZBUL{{N7+L5Qvuz>NXN9jU z>V5oZKn(ZflKP^`4Zl5<0SNSTB;fdpj4c!CHz{n?<~K)Li`~|}y?aq1-5)kKS0P0k zTAzdn1kx1|@Uw_7?k#lG9sPMYKazeORn~q^c{rF^?%FTtd9*UeOhYU^R*Xw21qJ*S znhs1@sC2=1KFmb%e-ZEyL$WW%(Ff-rXuS%YuI%axIl#W|CW1ZfRLH4bM@hLs`>URv zm`Lq!?WuaIGoR8}nmkcb>r$2rRnoz0yZxSe>LB9ZX5Y+rvQjlP{S6OcHb(!chNiuf zzTNen?o7Kb2D{Dszu@UTJ*E8ti!uGpb8o1S+N2ZJx8c$NAAXGL;)wei89DG})Q?($ zqc}dm;D;LAjDNtAGf(5O++79=h>_q*a`j$0V@P1aN&oZC&PuxTi;Lmu=`Bo?7v;FF zgsJpHdz;B-W0l~p;cR=Oo9io$J1Rw{eH+hGs%!Yw{f^c|?610uWd(HKeB|(0ypHk} zrFFtaXGE)@18v;EWY-^{sTblbK5|x9bo1V#o3TB?myPI<>;BgxgA+glQF6v-0|oZm z`R{M99yfb6YF)+>>&YHOOO#g>yUVI!a58Txe(ZaDa;_16wqWwjxRG~y(C--abA>Pd zp}ts{$Ye9(lA(_A>mmUO>61eqY`iRss=o8)6LtBhm!Bn4HOW_vw!dA;P4>qoy>?c8 zsZ^r!ME*T18C`d#3YzJI{JFNOI9kPe@0ZVByY=`bR?AxH#pmX<4S^=(kQ!c8x1-16 z+jJ3E8oS)*wd9_Z1Ge|9OLWSPSkrJB+`aygzVYNWc(Aoa+&SUU#vPydut0?~enZ3O z6?q<4Z{<3X{`A=P%&<;3^YMvgk{z}OxeN)<^d8a-gQdvw3pHJ5tFsi$lc?2uUldZd<#(2E5UHoGjZM6?P#P&>_>`R1`tWi^)8Lz- z)IZNAKWV<1+r3Y4+utP*29H2u~pY%W>aa^4V0LO1>`Cd-2S-BaJVl6cBe+0D(>AN>L(-eP>`G|^8y!GHgw zby;&4{y=+F+y<5{(Oo9kz3~|2F~j~6XZDzdY{+Pid#U0z6F(f*z9tmwK*ucS0?B z;2o&Y%%t3BiX%g}m_sdT*qDRCUr+=_RP%=$T7+7XOOLri162y6w63dS0s7L`)63l` zO2h=-&6oHH&2^dfium>h^ zAI|!}9m9TxEW0;NyUt;5O%dC*-s7V%J5F1HsRL1gX2Xt7&h~|JDODa<`rs_|NLsoQ zl=sSwIl+||XFinH?zBqX>~;J@`?-mkt3R~|XLJCCi>nfuLzbWIIXz%^Y#Fm^Bi?P# zLQ7dD?Rb1M$C0*v9JFp{YGrHN*?e+MalCUyI_=ckUk9=gR)YsF=}60*h0;w={-rd7 z6!DVL_7BM&H`f=>09DcgP4kFPZU`rz@;M7Bl7H9KO(SKBWdy?HhC9`L}8 zTM{VG8Lt-@zkrqLLiFe;%r&jYYj73sH%+a3?r6=R6w}U0DkXfIh@$CU5LfSF8_~_3 z%3>x2q7YVn_38IR<7MiIqPVC60=dG0u{(nN0v5YUE1IzWN3-iSyRx?k@m^GLRjn(Y z)@WL|v}i3?I}ubzDU|pJ^mb>$I~;fpMQVoZidRYtjyhzi;%vqj=F9bKsr_|ZbsftK zvq*M~Jj?FY#0Xh?7L}AwO^$2$f07O7H4m<6ycx+9>OS}i`FbH8$WHKU@Vg=cmkD*E~{ z8bz8yK6k-Gd?!G{@-eaEPEpi}?qSQfH`_;JetDKjde601X*q;xUmuf@%I0)^cd^2P z#nX?`v?q-^iA(P2H~$1`-}pH=tf`9USusp6U8eS!L@6b6i{4yce7nfKxLQACjT>Bj zd-O=IbIB1TzxGe28($tbqru=!DV}Zl*XtWUpZ#ih^X9~$e!OWhwqkJ@K*H%a7wP9s za}~gOy)*lJeEig3Y4`DMYI%)L?9rfBr=7L+1FyI{5E>eqZCe?Am9iV^^6ZuU{rzE# z(xcp00p{+)o1PpIYB@s1A literal 0 HcmV?d00001 From f4726f738c38271aceebc5c99e4833485dff354a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 7 Mar 2022 15:06:45 +0100 Subject: [PATCH 077/149] Follow-up of 005fef7bf68e2e589e8ecb3de80a43aa37043ce3 - Fixed highlight arrows for gizmos bar and toolbars --- resources/icons/toolbar_arrow_2.svg | 22 ++++++ src/slic3r/GUI/GLCanvas3D.cpp | 40 ++++++----- src/slic3r/GUI/GLToolbar.cpp | 88 ++++++++++++++++++++++- src/slic3r/GUI/GLToolbar.hpp | 8 +++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 74 ++++++++++++++++--- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 16 +++-- 6 files changed, 215 insertions(+), 33 deletions(-) create mode 100644 resources/icons/toolbar_arrow_2.svg diff --git a/resources/icons/toolbar_arrow_2.svg b/resources/icons/toolbar_arrow_2.svg new file mode 100644 index 0000000000..5ff1cfa2bc --- /dev/null +++ b/resources/icons/toolbar_arrow_2.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4212e9c834..b3bcf379d2 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4759,21 +4759,28 @@ bool GLCanvas3D::_init_main_toolbar() return true; } // init arrow +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES BackgroundTexture::Metadata arrow_data; arrow_data.filename = "toolbar_arrow.svg"; arrow_data.left = 0; arrow_data.top = 0; arrow_data.right = 0; arrow_data.bottom = 0; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_main_toolbar.init_arrow("toolbar_arrow_2.svg")) +#else if (!m_main_toolbar.init_arrow(arrow_data)) - { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Main toolbar failed to load arrow texture."; - } + // m_gizmos is created at constructor, thus we can init arrow here. +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_gizmos.init_arrow("toolbar_arrow_2.svg")) +#else if (!m_gizmos.init_arrow(arrow_data)) - { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Gizmos manager failed to load arrow texture."; - } // m_main_toolbar.set_layout_type(GLToolbar::Layout::Vertical); m_main_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); @@ -4973,24 +4980,27 @@ bool GLCanvas3D::_init_undoredo_toolbar() background_data.right = 16; background_data.bottom = 16; - if (!m_undoredo_toolbar.init(background_data)) - { + if (!m_undoredo_toolbar.init(background_data)) { // unable to init the toolbar texture, disable it m_undoredo_toolbar.set_enabled(false); return true; } // init arrow +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES BackgroundTexture::Metadata arrow_data; arrow_data.filename = "toolbar_arrow.svg"; arrow_data.left = 0; arrow_data.top = 0; arrow_data.right = 0; arrow_data.bottom = 0; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_undoredo_toolbar.init_arrow("toolbar_arrow_2.svg")) +#else if (!m_undoredo_toolbar.init_arrow(arrow_data)) - { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Undo/Redo toolbar failed to load arrow texture."; - } // m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Vertical); m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); @@ -5010,8 +5020,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() item.right.toggable = true; item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; item.right.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { + if (m_canvas != nullptr) { if (_render_undo_redo_stack(true, 0.5f * (left + right))) _deactivate_undo_redo_toolbar_items(); } @@ -5030,8 +5039,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() new_additional_tooltip = (boost::format(_utf8(L("Next Undo action: %1%"))) % action).str(); } - if (new_additional_tooltip != curr_additional_tooltip) - { + if (new_additional_tooltip != curr_additional_tooltip) { m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); set_tooltip(""); } @@ -5048,8 +5056,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_REDO)); }; item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; }; item.right.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { + if (m_canvas != nullptr) { if (_render_undo_redo_stack(false, 0.5f * (left + right))) _deactivate_undo_redo_toolbar_items(); } @@ -5068,8 +5075,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() new_additional_tooltip = (boost::format(_utf8(L("Next Redo action: %1%"))) % action).str(); } - if (new_additional_tooltip != curr_additional_tooltip) - { + if (new_additional_tooltip != curr_additional_tooltip) { m_undoredo_toolbar.set_additional_tooltip(id, new_additional_tooltip); set_tooltip(""); } @@ -5811,9 +5817,7 @@ void GLCanvas3D::_render_gizmos_overlay() m_gizmos.render_overlay(); if (m_gizmo_highlighter.m_render_arrow) - { m_gizmos.render_arrow(*this, m_gizmo_highlighter.m_gizmo_type); - } } void GLCanvas3D::_render_main_toolbar() diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 64911d6982..d35c0e0608 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -185,6 +185,16 @@ bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture) return res; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +bool GLToolbar::init_arrow(const std::string& filename) +{ + if (m_arrow_texture.get_id() != 0) + return true; + + const std::string path = resources_dir() + "/icons/"; + return (!filename.empty()) ? m_arrow_texture.load_from_svg_file(path + filename, false, false, false, 512) : false; +} +#else bool GLToolbar::init_arrow(const BackgroundTexture::Metadata& arrow_texture) { if (m_arrow_texture.texture.get_id() != 0) @@ -201,6 +211,7 @@ bool GLToolbar::init_arrow(const BackgroundTexture::Metadata& arrow_texture) return res; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLToolbar::Layout::EType GLToolbar::get_layout_type() const { @@ -1408,9 +1419,9 @@ void GLToolbar::render_background(float left, float top, float right, float bott const unsigned int tex_id = m_background_texture.texture.get_id(); const float tex_width = (float)m_background_texture.texture.get_width(); const float tex_height = (float)m_background_texture.texture.get_height(); - if (tex_id != 0 && tex_width > 0 && tex_height > 0) { - const float inv_tex_width = (tex_width != 0.0f) ? 1.0f / tex_width : 0.0f; - const float inv_tex_height = (tex_height != 0.0f) ? 1.0f / tex_height : 0.0f; + if (tex_id != 0 && tex_width > 0.0f && tex_height > 0.0f) { + const float inv_tex_width = 1.0f / tex_width; + const float inv_tex_height = 1.0f / tex_height; const float internal_left = left + border_w; const float internal_right = right - border_w; @@ -1558,6 +1569,76 @@ void GLToolbar::render_background(float left, float top, float right, float bott } #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) +{ + // arrow texture not initialized + if (m_arrow_texture.get_id() == 0) + return; + + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float icons_size_x = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.icons_size * m_layout.scale * inv_cnv_h; + const float separator_size = 2.0f * m_layout.separator_size * m_layout.scale * inv_cnv_w; + const float gap_size = 2.0f * m_layout.gap_size * m_layout.scale * inv_cnv_w; + const float border_x = 2.0f * m_layout.border * m_layout.scale * inv_cnv_w; + const float border_y = 2.0f * m_layout.border * m_layout.scale * inv_cnv_h; + + const float separator_stride = separator_size + gap_size; + const float icon_stride = icons_size_x + gap_size; + + float left = 2.0f * m_layout.left * inv_cnv_w + border_x; + float top = 2.0f * m_layout.top * inv_cnv_h - 2.0f * border_y - icons_size_y; + + bool found = false; + for (const GLToolbarItem* item : m_items) { + if (!item->is_visible()) + continue; + + if (item->is_separator()) + left += separator_stride; + else { + if (item->get_name() == highlighted_item->get_name()) { + found = true; + break; + } + left += icon_stride; + } + } + if (!found) + return; + + const float right = left + icons_size_x; + + const unsigned int tex_id = m_arrow_texture.get_id(); + // arrow width and height + const float arr_tex_width = (float)m_arrow_texture.get_width(); + const float arr_tex_height = (float)m_arrow_texture.get_height(); + if (tex_id != 0 && arr_tex_width > 0.0f && arr_tex_height > 0.0f) { + const float arrow_size_x = 2.0f * m_layout.scale * arr_tex_width * inv_cnv_w; + const float arrow_size_y = 2.0f * m_layout.scale * arr_tex_height * inv_cnv_h; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + top -= border_y; + const float bottom = top - arrow_size_y * icons_size_x / arrow_size_x; + + GLTexture::render_sub_texture(tex_id, left, right, bottom, top, { { left_uv, top_uv }, { right_uv, top_uv }, { right_uv, bottom_uv }, { left_uv, bottom_uv } }); + } +} +#else void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) { // arrow texture not initialized @@ -1623,6 +1704,7 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLToolbar::render_horizontal(const GLCanvas3D& parent) diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 862b473f67..aa0a5b1d9d 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -246,7 +246,11 @@ private: GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLTexture m_arrow_texture; +#else BackgroundTexture m_arrow_texture; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Layout m_layout; ItemsList m_items; @@ -273,7 +277,11 @@ public: bool init(const BackgroundTexture::Metadata& background_texture); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool init_arrow(const std::string& filename); +#else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Layout::EType get_layout_type() const; void set_layout_type(Layout::EType type); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 499a2fe498..6991c5356f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -124,7 +124,17 @@ bool GLGizmosManager::init() return true; } -bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata& arrow_texture) +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +bool GLGizmosManager::init_arrow(const std::string& filename) +{ + if (m_arrow_texture.get_id() != 0) + return true; + + const std::string path = resources_dir() + "/icons/"; + return (!filename.empty()) ? m_arrow_texture.load_from_svg_file(path + filename, false, false, false, 512) : false; +} +#else +bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata & arrow_texture) { if (m_arrow_texture.texture.get_id() != 0) return true; @@ -139,6 +149,7 @@ bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata& arrow_textur return res; } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLGizmosManager::set_overlay_icon_size(float size) { @@ -329,7 +340,7 @@ void GLGizmosManager::render_current_gizmo_for_picking_pass() const m_gizmos[m_current]->render_for_picking(); } -void GLGizmosManager::render_overlay() const +void GLGizmosManager::render_overlay() { if (!m_enabled) return; @@ -773,6 +784,54 @@ void GLGizmosManager::render_background(float left, float top, float right, floa } #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const +{ + const std::vector selectable_idxs = get_selectable_idxs(); + if (selectable_idxs.empty()) + return; + + const Size cnv_size = m_parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + if (cnv_w == 0 || cnv_h == 0) + return; + + const float inv_cnv_w = 1.0f / cnv_w; + const float inv_cnv_h = 1.0f / cnv_h; + + const float top_x = -1.0f; + float top_y = 0.5f * 2.0f * get_scaled_total_height() * inv_cnv_h; + + const float icons_size_x = 2.0f * m_layout.scaled_icons_size() * inv_cnv_w; + const float icons_size_y = 2.0f * m_layout.scaled_icons_size() * inv_cnv_h; + const float stride_y = 2.0f * m_layout.scaled_stride_y() * inv_cnv_h; + + for (size_t idx : selectable_idxs) { + if (idx == highlighted_type) { + const int tex_width = m_arrow_texture.get_width(); + const int tex_height = m_arrow_texture.get_height(); + const unsigned int tex_id = m_arrow_texture.get_id(); + + const float arrow_size_x = 2.0f * m_layout.scale * float(tex_height) * inv_cnv_w; + const float arrow_size_y = 2.0f * m_layout.scale * float(tex_width) * inv_cnv_h; + + const float left_uv = 0.0f; + const float right_uv = 1.0f; + const float top_uv = 1.0f; + const float bottom_uv = 0.0f; + + const float left = top_x + icons_size_x + 6.0f * m_layout.scaled_border() * inv_cnv_w; + const float right = left + arrow_size_x * icons_size_y / arrow_size_y; + + GLTexture::render_sub_texture(tex_id, left, right, top_y, top_y + icons_size_y, { { left_uv, bottom_uv }, { left_uv, top_uv }, { right_uv, top_uv }, { right_uv, bottom_uv } }); + break; + } + top_y -= stride_y; + } +} +#else void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const { std::vector selectable_idxs = get_selectable_idxs(); @@ -811,11 +870,12 @@ void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_t zoomed_top_y -= zoomed_stride_y; } } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void GLGizmosManager::do_render_overlay() const { - std::vector selectable_idxs = get_selectable_idxs(); + const std::vector selectable_idxs = get_selectable_idxs(); if (selectable_idxs.empty()) return; @@ -989,14 +1049,12 @@ GLGizmosManager::EType GLGizmosManager::get_gizmo_from_name(const std::string& g return GLGizmosManager::EType::Undefined; } -bool GLGizmosManager::generate_icons_texture() const +bool GLGizmosManager::generate_icons_texture() { std::string path = resources_dir() + "/icons/"; std::vector filenames; - for (size_t idx=0; idxget_icon_filename(); if (!icon_filename.empty()) filenames.push_back(path + icon_filename); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 3bdcd0f656..28cd8780a1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -102,10 +102,14 @@ private: GLCanvas3D& m_parent; bool m_enabled; std::vector> m_gizmos; - mutable GLTexture m_icons_texture; - mutable bool m_icons_texture_dirty; + GLTexture m_icons_texture; + bool m_icons_texture_dirty; BackgroundTexture m_background_texture; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLTexture m_arrow_texture; +#else BackgroundTexture m_arrow_texture; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Layout m_layout; EType m_current; EType m_hover; @@ -133,7 +137,11 @@ public: bool init(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + bool init_arrow(const std::string& filename); +#else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES template void load(Archive& ar) @@ -208,7 +216,7 @@ public: void render_current_gizmo_for_picking_pass() const; void render_painter_gizmo(); - void render_overlay() const; + void render_overlay(); void render_arrow(const GLCanvas3D& parent, EType highlighted_type) const; @@ -245,7 +253,7 @@ private: float get_scaled_total_height() const; float get_scaled_total_width() const; - bool generate_icons_texture() const; + bool generate_icons_texture(); void update_hover_state(const EType &type); bool grabber_contains_mouse() const; From 9fb350e3dda6317a2063f37d7b995eb7ea2bf00b Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 7 Mar 2022 15:31:23 +0100 Subject: [PATCH 078/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: gouraud --- resources/shaders/flat_texture_attr.vs | 9 --- resources/shaders/gouraud.fs | 1 - resources/shaders/gouraud.vs | 2 - resources/shaders/gouraud_attr.vs | 77 ++++++++++++++++++++ src/slic3r/GUI/3DScene.cpp | 32 +++----- src/slic3r/GUI/GLCanvas3D.cpp | 4 + src/slic3r/GUI/GLShadersManager.cpp | 4 + src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 18 +++++ 8 files changed, 114 insertions(+), 33 deletions(-) create mode 100644 resources/shaders/gouraud_attr.vs diff --git a/resources/shaders/flat_texture_attr.vs b/resources/shaders/flat_texture_attr.vs index bdd675052c..e59a99da35 100644 --- a/resources/shaders/flat_texture_attr.vs +++ b/resources/shaders/flat_texture_attr.vs @@ -1,24 +1,15 @@ #version 110 -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ attribute vec3 v_position; attribute vec2 v_tex_coord; uniform mat4 view_model_matrix; uniform mat4 projection_matrix; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ varying vec2 tex_coord; void main() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ tex_coord = v_tex_coord; gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); -// gl_Position = vec4(v_position, 1.0); - - -// gl_Position = ftransform(); -// tex_coord = gl_MultiTexCoord0.xy; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index b9e860d106..511faf4c00 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -40,7 +40,6 @@ varying vec2 intensity; uniform PrintVolumeDetection print_volume; -varying vec4 model_pos; varying vec4 world_pos; varying float world_normal_z; varying vec3 eye_normal; diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs index 79d7a63c07..c8b3d7b335 100644 --- a/resources/shaders/gouraud.vs +++ b/resources/shaders/gouraud.vs @@ -38,7 +38,6 @@ varying vec2 intensity; varying vec3 clipping_planes_dots; -varying vec4 model_pos; varying vec4 world_pos; varying float world_normal_z; varying vec3 eye_normal; @@ -60,7 +59,6 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - model_pos = gl_Vertex; // Point in homogenous coordinates. world_pos = volume_world_matrix * gl_Vertex; diff --git a/resources/shaders/gouraud_attr.vs b/resources/shaders/gouraud_attr.vs new file mode 100644 index 0000000000..87e524c14a --- /dev/null +++ b/resources/shaders/gouraud_attr.vs @@ -0,0 +1,77 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +attribute vec3 v_position; +attribute vec3 v_normal; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; +uniform mat4 volume_world_matrix; +uniform SlopeDetection slope; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec3 clipping_planes_dots; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 31639c0653..9269458df4 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1097,7 +1097,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); + assert(boost::algorithm::iends_with(shader->get_name(), "_attr")); #else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); @@ -1140,14 +1140,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL if (!volume.first->model.is_initialized()) @@ -1176,12 +1172,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab volume.first->model.set_color(volume.first->render_color); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - const Transform3d matrix = view_matrix * volume.first->world_matrix(); - shader->set_uniform("view_model_matrix", matrix); - shader->set_uniform("projection_matrix", projection_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - } + const Transform3d matrix = view_matrix * volume.first->world_matrix(); + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", projection_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); @@ -1193,14 +1187,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (m_show_sinking_contours) { diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b3bcf379d2..5cf8c06193 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5523,7 +5523,11 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.set_show_non_manifold_edges(!m_gizmos.is_hiding_instances() && m_gizmos.get_current_type() != GLGizmosManager::Simplify); #endif // ENABLE_SHOW_NON_MANIFOLD_EDGES +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index fb9a9cecf5..091e59818b 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -86,7 +86,11 @@ std::pair GLShadersManager::init() valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render objects in 3d editor +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("gouraud_attr", { "gouraud_attr.vs", "gouraud.fs" } +#else valid &= append_shader("gouraud", { "gouraud.vs", "gouraud.fs" } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_ENVIRONMENT_MAP , { "ENABLE_ENVIRONMENT_MAP"sv } #endif // ENABLE_ENVIRONMENT_MAP diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index a6d970dc95..7910c6eb1d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -80,7 +80,11 @@ GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_pl void GLGizmoPainterBase::render_triangles(const Selection& selection) const { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto* shader = wxGetApp().get_shader("gouraud_attr"); +#else auto* shader = wxGetApp().get_shader("gouraud"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (! shader) return; shader->start_using(); @@ -105,8 +109,16 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // For printers with multiple extruders, it is necessary to pass trafo_matrix // to the shader input variable print_box.volume_world_matrix before @@ -116,7 +128,9 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const m_triangle_selectors[mesh_id]->render(m_imgui); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -907,7 +921,11 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) auto* shader = wxGetApp().get_current_shader(); if (! shader) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + assert(shader->get_name() == "gouraud_attr"); +#else assert(shader->get_name() == "gouraud"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ScopeGuard guard([shader]() { if (shader) shader->set_uniform("offset_depth_buffer", false);}); shader->set_uniform("offset_depth_buffer", true); for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), From 62cc48188d36b2afe9b2085d84b76e6f25e95602 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 4 Mar 2022 09:50:38 +0100 Subject: [PATCH 079/149] Fix background color in InfoDialog on older macOSes (#3775, #7603) --- src/slic3r/GUI/MsgDialog.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 31d137cb6d..90ed274673 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -137,7 +137,22 @@ static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxStrin wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxFont monospace = wxGetApp().code_font(); wxColour text_clr = wxGetApp().get_label_clr_default(); - wxColour bgr_clr = parent->GetBackgroundColour(); //wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + wxColour bgr_clr = parent->GetBackgroundColour(); + +#ifdef __APPLE__ + // On macOS 10.13 and older the background color returned by wxWidgets + // is wrong, which leads to https://github.com/prusa3d/PrusaSlicer/issues/7603 + // and https://github.com/prusa3d/PrusaSlicer/issues/3775. wxSYS_COLOUR_WINDOW + // may not match the window background exactly, but it seems to never end up + // as black on black. + + if (wxPlatformInfo::Get().GetOSMajorVersion() == 10 + && wxPlatformInfo::Get().GetOSMinorVersion() < 14) + bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); +#endif + + + auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue()); auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()); const int font_size = font.GetPointSize(); From c17c4d2e9a19a2b3c2b3cbb3b5d02655057cf9ff Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 09:24:42 +0100 Subject: [PATCH 080/149] Follow-up of 005fef7bf68e2e589e8ecb3de80a43aa37043ce3 - Fixed imgui dialogs associated to gizmo bar and toolbar items --- src/slic3r/GUI/GLCanvas3D.cpp | 17 ++++-- src/slic3r/GUI/GLToolbar.cpp | 63 ++++++++++++++++------- src/slic3r/GUI/GLToolbar.hpp | 5 ++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 10 ++-- 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 5cf8c06193..a056dc1bd9 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4199,8 +4199,12 @@ bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) ImGuiWrapper* imgui = wxGetApp().imgui(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + imgui->set_next_window_pos(pos_x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#else const float x = pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width(); imgui->set_next_window_pos(x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES std::string title = is_undo ? L("Undo History") : L("Redo History"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4239,8 +4243,12 @@ bool GLCanvas3D::_render_search_list(float pos_x) bool action_taken = false; ImGuiWrapper* imgui = wxGetApp().imgui(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#else const float x = /*pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + */0.5f * (float)get_canvas_size().get_width(); imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES std::string title = L("Search"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4293,9 +4301,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) { ImGuiWrapper *imgui = wxGetApp().imgui(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#else auto canvas_w = float(get_canvas_size().get_width()); const float x = pos_x * float(wxGetApp().plater()->get_camera().get_zoom()) + 0.5f * canvas_w; imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); @@ -4827,9 +4839,7 @@ bool GLCanvas3D::_init_main_toolbar() item.right.toggable = true; item.right.render_callback = [this](float left, float right, float, float) { if (m_canvas != nullptr) - { _render_arrange_menu(0.5f * (left + right)); - } }; if (!m_main_toolbar.add_item(item)) return false; @@ -4932,8 +4942,7 @@ bool GLCanvas3D::_init_main_toolbar() item.sprite_id = 11; item.left.toggable = true; item.left.render_callback = [this](float left, float right, float, float) { - if (m_canvas != nullptr) - { + if (m_canvas != nullptr) { if (_render_search_list(0.5f * (left + right))) _deactivate_search_toolbar_item(); } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index d35c0e0608..7b8029e5c4 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -85,26 +85,29 @@ bool GLToolbarItem::update_enabled_state() return ret; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLToolbarItem::render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const +#else void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { - auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs - { - assert((tex_width != 0) && (tex_height != 0)); + auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs { + assert(tex_width != 0 && tex_height != 0); GLTexture::Quad_UVs ret; // tiles in the texture are spaced by 1 pixel - float icon_size_px = (float)(tex_width - 1) / ((float)Num_States + (float)Num_Rendered_Highlight_States); - char render_state = (m_highlight_state == NotHighlighted ? m_state : Num_States + m_highlight_state); - float inv_tex_width = 1.0f / (float)tex_width; - float inv_tex_height = 1.0f / (float)tex_height; + const float icon_size_px = (float)(tex_width - 1) / ((float)Num_States + (float)Num_Rendered_Highlight_States); + const char render_state = (m_highlight_state == NotHighlighted ? m_state : Num_States + m_highlight_state); + const float inv_tex_width = 1.0f / (float)tex_width; + const float inv_tex_height = 1.0f / (float)tex_height; // tiles in the texture are spaced by 1 pixel - float u_offset = 1.0f * inv_tex_width; - float v_offset = 1.0f * inv_tex_height; - float du = icon_size_px * inv_tex_width; - float dv = icon_size_px * inv_tex_height; - float left = u_offset + (float)render_state * du; - float right = left + du - u_offset; - float top = v_offset + (float)m_data.sprite_id * dv; - float bottom = top + dv - v_offset; + const float u_offset = 1.0f * inv_tex_width; + const float v_offset = 1.0f * inv_tex_height; + const float du = icon_size_px * inv_tex_width; + const float dv = icon_size_px * inv_tex_height; + const float left = u_offset + (float)render_state * du; + const float right = left + du - u_offset; + const float top = v_offset + (float)m_data.sprite_id * dv; + const float bottom = top + dv - v_offset; ret.left_top = { left, top }; ret.left_bottom = { left, bottom }; ret.right_bottom = { right, bottom }; @@ -114,12 +117,26 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); - if (is_pressed()) - { - if ((m_last_action_type == Left) && m_data.left.can_render()) + if (is_pressed()) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Size cnv_size = parent.get_canvas_size(); + const float cnv_w = (float)cnv_size.get_width(); + const float cnv_h = (float)cnv_size.get_height(); + + const float out_left = (0.5f * left + 0.5f) * cnv_w; + const float out_right = (0.5f * right + 0.5f) * cnv_w; + const float out_top = (0.5f * top + 0.5f) * cnv_h; + const float out_bottom = (0.5f * bottom + 0.5f) * cnv_h; + if (m_last_action_type == Left && m_data.left.can_render()) + m_data.left.render_callback(out_left, out_right, out_bottom, out_top); + else if (m_last_action_type == Right && m_data.right.can_render()) + m_data.right.render_callback(out_left, out_right, out_bottom, out_top); +#else + if (m_last_action_type == Left && m_data.left.can_render()) m_data.left.render_callback(left, right, bottom, top); - else if ((m_last_action_type == Right) && m_data.right.can_render()) + else if (m_last_action_type == Right && m_data.right.can_render()) m_data.right.render_callback(left, right, bottom, top); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } @@ -1756,7 +1773,11 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) if (item->is_separator()) left += separator_stride; else { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); +#else item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES left += icon_stride; } } @@ -1811,7 +1832,11 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) if (item->is_separator()) top -= separator_stride; else { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); +#else item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES top -= icon_stride; } } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index aa0a5b1d9d..ae958bce01 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -153,7 +153,12 @@ public: // returns true if the state changes bool update_enabled_state(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; +#else void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + private: void set_visible(bool visible) { m_data.visible = visible; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 6991c5356f..0a2d5b2857 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -802,7 +802,7 @@ void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_t const float inv_cnv_h = 1.0f / cnv_h; const float top_x = -1.0f; - float top_y = 0.5f * 2.0f * get_scaled_total_height() * inv_cnv_h; + float top_y = get_scaled_total_height() * inv_cnv_h; const float icons_size_x = 2.0f * m_layout.scaled_icons_size() * inv_cnv_w; const float icons_size_y = 2.0f * m_layout.scaled_icons_size() * inv_cnv_h; @@ -936,15 +936,13 @@ void GLGizmosManager::do_render_overlay() const if (idx == m_current || current_y == FLT_MAX) { // The FLT_MAX trick is here so that even non-selectable but activable // gizmos are passed some meaningful value. - current_y = 0.5f * cnv_h - top_y; + current_y = 0.5f * cnv_h - 0.5f * top_y * cnv_h; } top_y -= stride_y; } - if (m_current != Undefined) { - const float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height(); - m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); - } + if (m_current != Undefined) + m_gizmos[m_current]->render_input_window(get_scaled_total_width(), current_y, cnv_h - wxGetApp().plater()->get_view_toolbar().get_height()); } #else void GLGizmosManager::do_render_overlay() const From 0ffba3c48484a31fce9dade8bcfbd9efc2f2ad4b Mon Sep 17 00:00:00 2001 From: davidjuanesb Date: Fri, 4 Mar 2022 17:05:56 +0100 Subject: [PATCH 081/149] Catalan language updated to 2.4.1 RC1 --- resources/localization/ca/PrusaSlicer.mo | Bin 511311 -> 518747 bytes resources/localization/ca/PrusaSlicer_ca.po | 154 +++++++++++++++----- 2 files changed, 119 insertions(+), 35 deletions(-) diff --git a/resources/localization/ca/PrusaSlicer.mo b/resources/localization/ca/PrusaSlicer.mo index 167cc324dfe02a3982112800fef360d0a054af95..c5f940d31b60b769a5cb5346c6986e4483c95db6 100644 GIT binary patch delta 108089 zcmXWkdBBZD8-VfiF7`-S+jz;o@3MvLB$CKdAu0*km&y@INFiC1l9U#NqCym@WGP#P zQsEOVv~T#X>&$%r{AT7n&pb2t+%wPddiCvIQ2fxo;>oWr&3r1s|DL=wk+>4q&Q2t@ z7fmFtFP~;};_k=N5|;X7V;q3_@s;QXyoCBrERA1d24UKVTXB2`gctC(;sGcpch) z2bROBcoVL{9y~vhV@6t{zZakn-idc%`I%t=GqEJ~RhS$1Vn_T6jab!L!Rzr_>iw|- zzJx|*FXqDISOR~>i|~>si4f0E6r(`&6J^l{)JJF90`p*R%!>o#=l5el>W^SyT!@Bx zHTs};kkBT!Mfaf({0{B^3})fKm^4&Z&JLk$gLZTmy2kfKA3_H-3*W^Rcnk+U6=r(V zoG^iL=o-&N2QVM6N+%NNgFl#;miQGvMW3^6ep)h>47=usk?%)G`ZX57AJ7{U3qsQ5 zK|j9~eL!*a^D1bP)revLTG!HBn3OHi>_TGbgf&VYkM;~ z(tFVd4v$VkXEq1zXbIZSE78}{2d;~se}MM08}0WXdVTVzSokeo@DDnp^ru6}a-la~ zhTc#D9bj2BX=|g`w?+rjA=YofROm4kdUS&Kqt{JB`b#Drr(lP(LqlQ-y7n)j58i<8 z^R4KNzC|B+79G%E=ym7Oj40|F zH-0`4O}?RMhe`Colh7GXM<2Kdz3xTyBwUMLw;t_pb8PtG?gZZZ4c2j4=29o>f3`{89c z0KIWiY@dbZz&!MUFQN}v8C@UUg3kD3wBN7LB|eV!e+pA4;o@W%>A&%VT+fCZE=EIF z7+u3GG$%@-`@0_6Q9E=1H%7ao1G^(S0DbT<%)-%F8Rw%(y*){x7KP(j3NL>y*cg53 z^hIA9ld%Xc#|pRwtKtt>AFo`JmU=)}bikw00X~36U_x{Xx->J;NG6}5;7ngb4~BKI zz6)Ke&oOnP#r8kY4inFZrOAP5R0|?UeWGxzUxwz;6|r6k9at4~X=;SelZloT3|Uw7 zfwzYb5(AxWod~!u;YtqiJG_;Yvajiv6n(}cE&oiKY@?o2eE$Ba`t~q8m2B! zOZ3D~@lCAqa>(}M=zz|}dgWI_WLlsnT~G8Nxfio=0=i3{$II~@G?E9<*Y1z#gtEUH zuDjw@_P-a_q`?bsK)=)VLpz=jFPw*7w+g*(2ReXnM#h^wQauNQ3` zZGoN}?UJ$38NK1wSnr3$sSiTe`tjJlIQkO0bg#$y`dHtB=ER5SKHrb#!guHce@1iS zFLWuBIaY*heGePa@Bz9TGFOHOT#OE&G@2uI(9gT01MY_&Tm#Xs>$A{<>veP~_CxoL{GpnXlSoN zuWOA>uqQUeMOX>HjOKVd{F$#7mZiN%tWQKI@G=_Fjc>F64dur)m|Xj@1fD>T;+*e< zq`VYOx&~MsyP_RTiOz{Wj}CMd*1^r_lKqKJB=3gst|*QUq*RhZGYWOF8{Uu4;(ojr zM{Z0@48!lx6SC{3uy$+lcH6NwHhVV=a15GcPes>bIqHYd31x0hOSHv&=me78DAcEL zC%Q(@p*ipxdU9<;*LnwL;TP!4{z2b*)whJ?tAj30BXnjrqLJ#0cj6p$VCS$sX1$l1 zNHQ^qLJb-gp(oxRbfjm{ZSxO0fJ@#F$ygi>aalB^b@6FzgZ=RYcEFBXLqE@=1A7_0 zZxcGPU6|Ybzb{qb51nWPPN7-)2b!E0(DNb3wzR}F%t8nFDw=$6qBHvy&7r~{gxymX z&GIQ&6JLwHG39K#@Eob{|LSA0(xJ; z57SahRR(Qug$}GIx-AD{Wt@yjv-1rKo@6`X1>d8g&-f@j=yLS)I+%r>(T+x-XZ{mt zKP%Adw#LuDMQ8dS?!z1(rzPg#Vf4OXJJ|njw^=(v2-l(=A4ErZ7EPk!pM)&F5lyOFJG8{D3Y4C>H=u$LBL)IyJM{FOC zK43EXz(weNE79b73-8B|(1Eqs6}~rgL;D+!=F}u~DW@kXIHCn;$X8-D`~W@E|3tI( zJl4U?-J#w9jX+cM2)`c9ogQd}hN1V3j`eY9e-qIGOhtE9a#k!n8!uRa?t(YarPzYb zHU^)-N6`Tn{WJ{ZY9xZZ|0y_~Yma59k3_Fu6n+15 z_P<&EJq=f4))%3JM%b8oFZAer7XAD!^gK9#S(x+75X$msayCQ1Gxk8wmGNjKmY_+y z9L=@2&>=1*i7L7`oOtgg$~xB57>t;%|GaoS@i2ruZu3#&1kM9F$))< zOYjbQ|5s=PGmoYvZo#Y2r5uU2C+ASGqm}3yet~8296I9C--HeuquJgE-5rC`q#A`; zI1xSJmZIDCjac7`Ch>lB3BE!Pyq`jQGLi9ZSfh*3ffPV*XoSwZW&FG^I)DM_07j!< zT*jkI_zrpyeSkjbKXgDBeHV`EtI%YwincdP$^PpcFX)FpU=&uthtUD7K|A~uUCVEx zf1;t!dn`P-9NO`1Xk-SXGrb?Pa0Xt7ucH(F4X@_;iDJjo620&`%!SXR9leIG)h2Wx zU&Z===n`FdB4l}Uw8J~GBF?}{xB=ZY-=n#c{eNL8OQX5g8k6qJz7$;hX=q0)(QWhv z`uTaZgVHC%N!c6?W!LBcbXz6S-7p=i;udruXQRcw57)IrBh>AC_P-(OM}wgpiw@u^ zbO7(7`~6t7@Trh1tX5m~k^y_2&7?z`+?Z*)6D(H4>i{5`9X5mvw z3XbqiEP+R2{Q~-cGCzd@v_BNy!;=b5m-FGH809NJzTO{(kA2i%6{NME$y(dh1a z7#;XbBqGVgG74V!2|9zL=m37g?3g$kk|_te@9Ux?Z;Y>E8??he&|Q+}mvCKqyn%Xk zbfDv-Q_u*`!i)X>zcE$d$MEPH9YJTD@oP8%Yoj6UfDUvR`k=|^j9)+pv;{li4s`8{ z{T3eF3O%4YVtMR=9=(&Wko*4`3a-)G=qEUY`Z087U4BnXbj1PK1K&sYfAK%UOj@A> z8;V~42$~ZM(d6BT?uw&m1ph#n;yfn%r4zD0nK2IeJ1oKT|At-hI{KiaXasWp7k)-m z37z3R=stfk*5603{{b6d!E+%39i!dQ`}&}}W!gFRzkjk>N5c|4g|l$_`H(bO7s5y@ z;cnXNp&jJnN6pTp2D$|G(Fk;j?e}0)>O;{#qOC>0;+;jW%S=m8MWkq2GCj2xRcLTc zTcI8I!%Q5ACgV`_t@bebz$at-%IFq!8}G#__z%wT`tV4(M&X9{1rF?*9^b!iE2$Ct2-_(o@^0CE7s`w1cP6lX3;t#ckLK&!M@| zAaAfOdIEMslkWCdABry7=vaTy&)xqME#Mr?!sS>CKSl?10X+%x=SxpKi$&0ray>fJ z56}Vp96gVo19>k_Prb}aqV;a*Q9KB5!LgY1;Mq&TEI*AIcn(dfwEQ7t`OpWJ!<<+L zJy05>+v(=`d4IIOQCJC|Ku^*QSPg$dPuSv@1Y2B^o=mOD02&POBy^_Fpfh>_9mrZt z9kJ*@cc4jj1kH&H=(fH3(r{lz^vJD`Mz#g|`7P)-qF%TWAH0gPQ0_ zJEH@-3k~fE^Z`?1`+PJfUPK4F9-ZkP^twanTAz-eCyIpjqUZ$5VJgYdTu8R0UhvE)2X|KI9J<%CE zqUXp9nAiQkfr452F*?%!p#%8^$KgNd1IF;XG-mw-bQ>*2Bl9uZ@o(r7v?)eEY3z4& z;C+jS-7_9t!l~$qI|q{%-lAZ(ACCTx&MaS6nCX?6+V?n#_QvP{x1lrLi9Yxw*1*5w z=M_t&CvK!(6Wz{}(234QBk+0&_P?S2kcJ9)80|1e$uNMDXouC%Y`+72dEAffZ~@+o zC(tEncy)T}D_9q7MSVF=!?Wm7{$Q!F4cDOq+Egl;p16j>P8x2(?4?7t-j36$567CA zUM3`09dsal(FZ<&sZgRz@fOSgPAw2j>v|bI3)HTR}lZieQ9P!=Q z76)T>d>b9<59ou=q7lfb7`{^FLl2a;=zwlTllU$)GUL%~pMx&Z5;Xa?p#%9Ai@E<# z#Sd~-3frX&HsONn&<-YIX?y}*qBqdUypL|LuW$hVgBP*w?yMY=YgmEkWcEk#_4?sgU2Mysf=#spHJ#i-*kqWhf zEzrpHiuDK3?-g^=C0vO1x2zWX-{f0CgJ=CaSO&j9LzJi;lIs#Q^p~SEDu-r!YxE$w z0UcOBbY>G``-0g1IvV<2n1$b>NtjWG{qI3gxlZ^}*$}%@ACIN*bF78uV!cM)5aO=r z49B7e%N#66B==wk>VIF8p7ffRRE|+W&zKym(XEY0)={)qL zTNd4hM(7wiu=Ivujmx4lYl6OJJEH^ZkM4p=(S1#JCHWjp$}{M@B3I+o((?U}f-^6P zCPz8E4r`)oJrYyNhgsC0K|}X$Y(I=X@EE$3r||~-2kT;+Ch3V=@gW?GU!&J|Z)%RQ z|9Vq!pASVp7>9N=DLNY+`Sa)iH$=CiN%|QY>hG{3{*B&W`ns@`wXh8J>(KlAqxTKR zf;>Mli9%Ui5HENyx)Z(dbF72kquVU2S?IVyv<;dQUC||c0G;_lG#B<_75o`nW3lF8 z$?w9{@BdDx;Dv8T4@7^7=4%lT4s&!vo);!K~bccKB7SpN#dt&_Q)}ixD_4f z?P!0a(A;_mJ@6jI`uJ3mf?2)?JxI==OHrXsIC@*6-++c-O@tPOOYSq3??1mF+_EHO6W*+=YHH4;|1u=mUR`pI?4`ctAV!y1UTq zo*L_~qu1}lYw&M$_ta<~CfW{LQ6GRMeE+YZP?d)L*c7wf5R#-7nzduFJidg^=rc58 zXVJ)9(jk1_91Zy(wEYqEoOlcE{{R}9>>WeBB$jsnccS3yb9D4+G}N2X8UBXeSmeg= zRjej@V)jI5IsvorMeK|pqDgyIr?512u^jb2(P`1OSjzo>!~&+@6qceaI+G6QnSU2L zkV)uTzZBc|A|XtiMZbC#=p6cKgGOo)8mZ~g*D#CvPV}Jq36mzn0e(QNOhJpjg>>ZBMOVJUR#Z0V@W__J#Z)`;UG4z2Sqe*oVeL$W*VE~t- zOIs6tcl1P;;4X9kk6}*t|1t`G0a=M&_y#(|&9VL&8kr;LwmgA`?mRlsJa>e8Asj`$ zB$}KH@NV3W&9PeFummH}rF{rfzyJFvg@!atM<4WYbT7IDhtUX~L0`A$(U;Z5{ldVD zqib6_S{+@gM(F+B(4`uPF2zLjXr6<~4it7%a61&gGtB&2^ljG>-9~qzk$D{La6TG| z*U-pqLkF+}J!%i4_vg4PTvrU8aUJyjM(6}?yo>#B_V=d2Z81Auum_FAF?6kdL_5fF zcgTr+Xy^-|uivZi6Rd%q@Itgx|L~f90nMeOXe5uL6Z*A(GOi^J&Lq!0;rsq2ID~pj z^sTratK;`L8?P7;zHqF<(bRWDo8KFfaU(jAqxcfm92g>W82#pS5^aY zlZoyW9PtO}A0R$OXS5&9fg`bg0yk3s37x^K!$?j}z7NoW{5U+kbS|LvtP$~x2Rh(( z=q~7v-hUrn;r^c*8FlXbM%|bkLZB1j||%w1+`~RgWIKxWl4YjZ|Hbx`S58cmWaTLx(b0ycUO)zUcMC(CztPFqwFQf@}U9R>V)x z8~;LYIEO|e$HcHy`LR9qQs`O^MNh~TSQpRYa4i3DnE5m467NDI^(~r|>65IJ1-U5r z1)@A=;q}ph=(c~JN)o!0Gh<>u{bk5jsEF2&z$tcHf)I<@uIom?+t( zPft8T{gwscFAly&Z>+vB{Oo1|8i{i_83#U{p88eG-|;KzPb>-t)Sze56K_#Jfkx=r z#lh>IB_a&)7#^Vg@+EAG!Ze&+5+0CqX-JNV=o(JN)%XTx;oUEUB%Ok#Y)6ysOEdzP zE(_o5TcEiy7(M$Zqe=KYdfz(q%j@AJ1(WO_G%E|d7`DshXi}9&J7|pF*aO|S&Y@dX_gyy0BJQF`(gHHHuO#S}PUJ5?oJIs&gFcb5= z8bVb7Z7+`Xuo^nRd(e)@V`Y2_jm-P#fc9b^{2BdX)9JM^z%F5YG^&cwbtl`JFq$)LPM4J^>9NO^b152EQjsU2#iGE9n;VUuEb8b3r)fjt3yBa(C-nQ zunzWL&HlIWY`owg+R+)j1`DnUGiTZ-9khN+tPhR#*|EMN z*7wBvDKwH7tq%h%jYg_vl7ic6YXbAbUYfV$+12SjaYIPh1?Vtq8%)Yu0jX!Hrmm9=nWr5KZ~CqLht)7)_+7N z@_VeOy&dYg(CZ4J{S*%-6Xhtlrq$yI*PH49`IvVZpQ8W@W zWBY69bsM95&`5rV_Wuix_WggJLRT6_y%Vfqhj z1RdydbV4h!25!J+_%pi8YHkc`-wLz){=bug`+gw06!)Y1_>t(-=*U;29c)1dv>zSN z$=LoQIW)0JGzB}=fD6os~LLXEC9bg?aQccnG;U=`>p7HZL(ffu($D!9vi_S*-Tjb~N|K$|y;LUi! z=2-s-&4s<_gAYYdpff#-M&tr^!h9d6r~dOiy|E4T5<5b_1JD7Fz*liHdS9(i*#ADD z83p%uJ9Mo(p${C2-uNJzG*6&2Sr*$@qDi;~UGsxzE}V^@|Bk-@bLL4~Bi8GE7G~BV+9x_9`Y3vmE{wh% z{UR9)f1#l+vNuGaJi11$qFti>qQlX1V`B7~=v&c!=tO?T$yi`tdg@=%EkxTp>`zZL z!Q?OseluB%=D#3JS zb8Rrzz){F9NG4vU;F`aQ-nb9V?yt~f`T^Z8XV4t^56y*(J`V#ef}VWWqRG|^O|H>s z?#xC*zZ@O-hv>KKUoiFie;2+8SzqYOFvHsDQrw0P>^`*P$MF;{Lpz#zC_LyLG-3xa zbyA|&7dsq|>^fMHdRH_O6Vb@+!A0)>gA|RF9%d_c+?`ld=6dGGe`#ay)!6N9AWT6kLfbN#-u^A4I zpRYk5xDor~d+3r?IvP&GYtYYIpzUqZZQJE2``^Mq8VuRP=$bu^e$#m!9l$p9;Mk3> z{kK>Ne~e!KO{lku4o9zl4o$kX=)^Xl$-WIeN51+d8Q$A}(O{^vz74-}c|E!WJJ121 zz_xe}?V$B{;Q_sIBlY3vwyJR~}b(;vNI0Xmb#=q`8>vy;W^V*92O;k@_&eeizt!C#<}J&i^rr7VG8ckX=rxON6-GHXoqXiWLb~X@e`bn-G53?d_xZWhBc@kI1_$P zFxT0zo%=-RU{yZ<7;E7_Xfjs)CGP*)6kOAW=!mQWSo3$@^SBOOf{}lOtezTu7TqOp z;Q-w1Zmzg&$tGM33ZW(d6BUS$G()$8+d|+nx)*5!oGYbpQWO!6UWR`7n@P zXvg_QEr0e>Y}iq-OpoI>G0#2Cl(R z@dPG4!PaMHBzECWw8N*fWu(4PyoJ@MA4DIVGkZpADe|Ksu7l=GWAqD1OEj1IqBFk_ z?QbG_-Lq&8y@+nx*Rp4X-~WAwhHGf}5FJojju6Vi=!46k9alkTQa{$OM?-lFnskHF z2aQ7?FbN&#lUNR)MhCVn`gx9Ic))2IT*F_{ndHbBEREjK44p|A^nt_BlW{7#kC&lK zw+($ae2-2fGgp|%WoZB9W4#fYlzl=T zuUMZH>q}yNd#oRe^;~(v{bkVmlkH-|-LYYMtiK%VyJP(a%;1JgE($X$gf2yCw4=Ic z$U9>_?1NeOG#aUmXk@-Xm+CiUxA5=(^M-~3XsAn~YhF9r2<^B9x^Hhn-vPJA&+m@) z`_Q$%AI*V>@jIM`Cf(qCA%{kw{XK-A`u=}{f-~uTaYpLDQZo!4aqIkXn_+G0i_vYi zAKPQDOF}MmMF%tpJs-xPOF9*s;$rkQ{tf!BIe|X!JXUl6=f5-~^#!3RI)l5>5f4E- z8igJ#kHz}avHm(5sV(S?K8o!J@h$5A!wUFZfzaP4XoNpQlkqsFzW@JCp$QF%f?+02 z(T=Z2w_Rtv0efL*T#46VW}%EkA8dt>lF_7&p?-K9{S)VXr$i2&A7QR``-sV zR3szyx}A=O>XM?t!e~gZKtomu-DcOK9rnTgI0D_4U!#%wBi6HDmXZ4Eb`|=0cQjH% z(8wk)WB*sAFgt#*8COx?g(gw*^04-gpgFMtJ@Y?D&+@;pI$m)_M(P(3+N0V33TEMP zbQ@>CGR(XbI^n9Z-XKZAnY2XLzFV{pmZ3fX4cV;dA}mY&CG;Jz2Ro+mHoPh%SI=T0 z0>jb%9!4KH9o=^G(FweS*_j{Wbx97uyF z(!+QL=b<5-Qa*I_6dLkp&>616*0>2rVU7x6hDkJ%v!jd92QNb>unHaE`|XjSJakJ<$FAXQgm`^~&KJQZxLJ_TgwUH>#46`j?MW&`uXu4Mx{yH2U(HjP8Qz=u*58>#w6n^hapNyU@rT zKqGe&9YFS4;kvwNKbNBYS3vu#hiuDaq6LMr>4X*?(Zo7ot>#5vL6c<@+VO651_#iA zoMbO2?s95zPpyBjmz|AQ!)B*V~-AH*g&9dE~7*a@p#6O!j4 zbOw(_=b-~!ihe_S1C7vI(M{-q_CC6MPN3KSibdT2ne{@FT#1IXCVD{wbbDTp9-)Kq zAzXqruvGof-W97+pN762H=z9-MI&<(jm*FJG-fsk19=XUhH3=`L%$h)@P0gmC(seU z*D!=|H+t~=4^6s^M&bJM=-SptBiIIga5uaR??spH5p?@b$1=FE5&Pe5_8tvB_#1RU zzn}xkyf%dHGW5oVXp*%>A9OeRpwUOITiZo{b`*NsB zgZs1%dSNg0+v*VXHTxL)(%FvAa6wIU=1tHGZ$t-nI~vlv#Z_MrD4Ky%_4djGHJ zlI3h3+KVE)h=2b_o$L$~k$FuVKzR|+Q2KWK-gTZZgzgeKb^=l~x=x8Y25rrXdN?uhj-(T{i2(V1P^Iy|@(8uAM0z^X@^ zqTB68H0cJQyK5Ty;Fr-Q{Ru1KpP2ghf2G=lh8xk2$Dt#h6zen44(FmXTZhhkE1Ge-NGNTy$bcMD#qp$;xLnFEi?f+|B?EXJZ!I@3#7_xm4y7sT5 z57>&1_z3zo{1u&1p&NrG(X6hD-giy39Xjya(2(DauK9R$U>h-y`+qA1vwaV`c8Aab z{e`Y+?oQ!lQ3_{MZ-Oq#el$1Epdrt3Q&_q}=s+r<{WL=R?SQ56UUXZ}!mD_GVi|>2 zxD|ciMV-Tl%b=mX7G0~`V*3N=TFyp0S`*!lzN`*mEi8OpYy2nr;B4K(1Fl3PR}HKM{uRsU3ElI((J&T6q;_hMJS4BJM9_#m^5m<;mU>(}=9yHXa(Bw?- z5w4qye!d2s*iQ6;hp`Ig?3t1Ji;ZMm3cknxK!1<_idz{Ww!Mu|WAED;IX>JggZ~;D ze<112&wMcN9egXs`}z_Ae7|2t>UYI=-kFj5C!4R_75ce=4y17ZkaX4XDe9e(B}gVt zQSgFa(WJ_I4+}zv70@-RI3Od@7;B*+9**wchhu#jIb4Z;$56-RKgHK+l24 z(TO~VCgscM?%ITfd46I~yx@Q6TAo3(Ip^TeQ4O@Cc4(w-!!kG;E8$`^a-X2P=X><} zf6$!DdtZ20R7Usx&FBEfVCwh(W>IiNFQB1WhYn;Ldf^dthJQpa84~`2p%T`k{SNdT zS%fapHuV1e=zxEW?Ky^qFP%luoNF?a{cm>mqoFbmM>|}Cc5oP-;cu9QC5DB8T!(&s zEBfFO=y|aSjl}!t+w&-TU7q1#>8_4eKqFOsIQu^jh3jbW!W+<|_)c`qR-kLT4&TGA z=zu4W2p!HrkK#r67H&WzHgaT`=@V$~tj8R<6Fs2z$M!Fi6kO|{(d@izROq-kdJvUC z2T(nFZESCccGLyEuLnAj-sk`aqW3+3_A>>&el~jje7qf#izz%z;R3c~+dVuweC66P zCR}(PUHif>JQf?ii)To_1QY(Tv={*Di0 zarggNlCTsmz&7|UW?`=JA^R&}Q|evudYq5D@C5e5Hy#QI8Y@y)HPNQpc7MtPUXm&SxIBc_?=yeaHGn{}_!-;YUJbD&a=ztpp94q z52HzU@zjjeKf`T_KKNbqsLnGjB;TcIy;!W5j#i&WsGU(G8m_};=!x|RR>x=2Z2k;Q zru4_c_9}qZOU8OlH0iEGBi9Ly&>S?Uo=3OktFitL`rNHa3SRgz`f@mkc61sY$iHX^ z3r){R@Ly?7R78{P>LVnGurR1XcFIp4qz}E!EtDkCl^sLgs-3@`W79) zNp!9LLPPiFjIez+qBHt1`YCpy{w4ar>NCT3yEfVr?Qbmlz^Q2D<{{fVnOIK28NP!? z;8XMrKaO^oJ}caCF?tYXVSOUe0LxJy`DEBVi_yqzMGvT>=#2ly!kBY*=)X8Rftpy< z_kTkQ4&Y|&iUTkU-$%FSvG{r4r^2=wi_YX(G-4~z17dqI1GQRvJA= z>Y@W`i>aUg_oh&ihEaGcF2Kj|FYJet=7uFWjXwAnbgdKfGE%<}loNgM9Q1*2pbvTv z-QN4rNL)a7QNH;hl2tHiNZU{_+4{y0#-U#n=3@qKMAvK!8sg8;rTPg?uJi?A$#S3% zD1~LQIr{m%Xvl}4?}D-D(f-H+_Wwc(^Js7hYAp;iXp4rZD|$2!LOU9bcJLq?fhp)r zXJQjviaz)_4#&JthZA%HR-?WWAH<`$25(!${=b33rO$+;wKx7qeMR)?#o_a*&xXHf z_yPy<`Hj!7_71+{Jj4qbT|Bilf3Tv@NM`Y=5_ln4Uww%LYQ!uBn4-BZ*(I1 zMPvb*#jDXT5IfKa9YsU`2ad(u%fc?0guXjg;P?0!UW?zp7;>P*OZ?>)185h0b9snJ zvcxMHssH41Cwz|^j^ko{>D6#!>(|1OIuxtYz6odIPdFaOuLyrbnzk|{^-nYFVsF}C zM3Xw#s*J=`tb|T<9X7yS*wFo-`}Hu=R#=`9K7#IoRjb4I_IztXy)*WpeKk7Md~3t+ zjNF25x0z^?u8)3%=E9d~1k>LL5iNpVUky|L{;w+qZ@deg;b`oDFQGH|3my3tZ)T+a ziFFO^OZ^LUdtSRPocT+!IrWohf0fsVCA${AzcZSw1JLXr=jR?UGbp(Imf-;0jBd+H zZ_!RfTH#RYz26R5yAQqo(RacRB$r@$>IbkQCN_k>O|OKzsjfmFJbq)yttZj`U%{ju zeGnUtqV<2#5f<8%k$4`kQ*n_eu}-9 zk?4i*p}X$t_u2nfQyBVwSj#zBiu!K!Ao&e_V8N{!iA7iztKc?tfWM)k&Au(n>?(A3 z)W#v$28ZE0*dMEY5RUly(X$^ULq~14hh*u2Cf7u4jXTki7XC0qpdZ@N$M`JP`Y1$f zKRVE#(E+4?9O{L!I`#7C5#0lC#<7@%dy*7NP&kVVu)vP+MPvnDY&)98X`h4+%cBu! zh(>Mz8mT9+8m`0&codCLo}J;otI(sn8rH?@(Or>zn1Tn(eDsEucol9zJNz1bK>l4} z-&e!-)ZfEbZQq@d`bEQyXonN_gp+bE)}(&%rx~gLMr1P_L;YEtf|q}m;s3!|GO?6G zJsK|A8#-=>zUAhlp?nb?@jF-tf5q}xVPB|s#wOIK;VgE`C-?*P+Ye-<{=X!zKbVnt znf8p&!$4Mi!S&Shd};Es|E@p85lX{8^x!#nIQ$(>k0WF`?Z@yp+J}D40Yd$*qwxoc z--L*4ME^lShi@|y-LU6(A<5o6mXTP`eff@OBu?XY9EodAgm*-R|M5kJ=O-Sb&>J_P z+ppNkux+lvho}!i-vwvTCCc@EI6|+$)zrJ<5X^llBe4!2Kto;YbU2b%;3(?Fe#l7u z68juHPW>B9R$|24e+*~-Z$E_x&Hg#Oy>E*y^gu?U33?HggKDkzYZ7XL?2iXUGt*oceXpRFb+l| z^9Z`n=b{gKHMYNnHK>0a>*u2Ra);}SV>Ujog#)oZvb~dumnb;$4d?@RV^jPb`GSzR zJWm*TS9C_b(SZz%^>JtfrlK>PiAH82K8DYt{Z+mw3}i6+`NMdL`+o`rXSfhOSXQGa z;9)F{|DZF@%A1+`<9BUzCKJ%mK8h!B4lc(B^JS*a`mz^?3AIF*tOJ?@1JIN45v<_; zf15%U9!K|o_WU7Bv#=EP=CR%%OHiMVS-3K`??IF8x7c3ylJJ0AupI4=q36dN=(}MT z+V9_(%%V{2(#+IXqQ>X}b0_+s(P$(VpkFN3V{tr&B{8!=h(uY;N4+w-L=DlUXpJsu zr&#Y1?T2Rn-~#;j&s>YKG}vJhjldE#xi(-HeuU2C6uR~W3TCE$lc5w=qP_*M!Jp9k z%NEK^y}X*DGaZU%`&=x7i(~t`LhOHEuZQCYnT5j*SEB7r(f!>&nnY*x6guE%&_Aqh zK@XO%(1@iM2|193e%=_fuqT=W526vCm!x2Fyp3LX03GqKXop3MhI&J^-W$Dc5_;bf zw4+V2eiR+pf9Q3^FAD=|h%Q}sG(uxB3zM@cIHEVu4)>rl{s9eH`sHDF%+1BGy26P+Z7?lY9Y_%|NohS+1VQ%;aIfe1?V@R73fSh zp#wM++jCqQJ}-hspe&kvZO{qbj1K5NbU=@zYrhm-!VSp3f8om{1(WJSbiaRr&in%Q z!W>tH8}3HihoA?}7_5!s(fi*-2fiH};~{h@uP7F_V-s{&3`Zj~4paaCe>39;uV8OJ zcmthDk>X)nUX30=ZLu2Oj?Q=n`oPub%sxQ3;aBL4f5b+Zkrg7<6y0_=q7&(fNl(7M z6kLM)(IuFTCed2-i^W0gh;2%QnJz%jiC55>Y(xjRC$=At^*`h17nKa37e`ObTIjaF zt|a^4ecp-&XVMuxTJJ`eVi1~?v(ckITN)KN47mzE7{R|P!>>Y>-)iau~CnuIgZ zfj@^v_GN5}>u@;!jW^+-a$&&9_b8YY+tGo1h9=PkG!psBhZz(`XOM-jr19Mi9q4Bj z!gXJuOYsdFkvtW{z-pk8>WKAl3{Jx}IM@B(xKd`~Ga3$}f7*Sya%SoW5L>J8Almy@ z%}o8D#^$ebYB{#4w*MrP_e<@2eRGIs={995gb|#rD;)eLXgG z|G!Vcq)F5Y-+T(Aq3w%ZaSXa0KSgJJB-W3i4>*JFo`0hSYlq~jjGlNMu`(vngXuMN zyMBm8d4A$31w;0C{2;4NxZoOeU>(t9x)VJK$D`T12z~HoEP-F3YyNLEXWg*f3Zcn) zH9FvOXumZv=~>=}f;ZkBFBpLiXgqr1i_wkfK=z`^`D1J^eobcTzkpI3+p~nvp#A<( zFPsy3>Sw0@!O>OdfPY5s&)Igl6YA=na44jo7ViW@0J6f*vp(+XcI!=R_Yg z$?l2mgVB?3bo_imY@ZtIPvSxM|HAmeujBlA0a0*klLO#QaY zO7w(0g}xoL-w;Ay7rlN2UW>2C`WZAQDs}K&NiuQ@X8GUf33qYFkSvAp66#l?NmB(k zU=1{4Kcl%({>IG2N7w}mU{i9HAN#e1XKHe2?a;E z1>I&pquVL(&Ed6L5>2l5Xh$QlEG~$?hi=C! zXz(03fR6k)rsKt3!xCJIe$gm}CSP52AWhJu>l^KlF2NvlX(pikuS6ra4n4s3p-b>n zSN6Xr(tk7<(n7a{4=SQdQ4bAq6Erfn$My%&89$63sV~O%)#w1h11b&UV+Z!1J-=oQ!=o$Vv zo*RwWTqMHD#1aaw;c~R26_|#b!v%@=;^!Zs5!i(e^au2T7tmbEc54V}POM11EIRX> z@Dz^3yRi3dnf%@lf2PFL-~TVUJr1{2T$Oo=W)50F>TcI*M7N;tf+6T@_#t#4^JDwV zXh`2iJNN`WO20rudmfEMdcQD`{OI*X(S9nR$=U$jMadf}IMTl8(R&Zt;cRS%Z^h5g zp)<|6GlVoBdfz2z4i!O{C<}d1Rdh+4pbxqOP1ccUgziTol1xktg~W7p=5x^py@<|m zH9DYo(Iq&BhBWQ2&{0uz##!ittHgR^%%a{N?Qak|&@t!$CSWe#|5GVA(%I2<=mWk) zbK)#IgKT$)1E?rE^E&8^8pigfXsB;TA2bBbk+J9lA3_H@1s%{_O#S}f5(=*MTWAt} z>IZlPYvONM0n7Cd54;IYrd!Ys`=CjAADZ<;(OejTCHY`X{QT*ALVwSo6Z#BO|NYP7 z6dd^I*R&Qoqh`_T(V5*G>pk&a>iw`keujOp;l1HRU5qZ_`b`5|*RB z2A$Ah?2D)GWB+GS=r|<&;c*DIp*|Dq;vqB#3JeV)FN>9^S4WfcHZ(E=(2x#C*LE^` z-z+q#m!Zk|Cc1Rn(IfrSB!#OfoQNOf9u{(-AbMjK+EF!hiJGGwbwNXV7y4d*41Fhj zfDY&=I-u{-e*Qyq?4seBssDC#Dg1_d@(cxM`q_x^pxh%vh>ArkPF};XoL21BXSTW6TK;T!>H(l=yY@!%tLQjiM}@9 zMIZbn8p`j``+r1}@-K9aFQ5<1cYhc_;b=+p{wi3&{a=@Y7q&w?xCuRIy2tvc`1v@r z<43SKK84Qg4fMV(Xij{HF42Chf+x@c7J48oNfvqp*Tg)2|8GOV5#5Y-bQ?OLe(0JH zjGrgb89$0yI19agP4sQ_zAe#@&;fsn_J0%|*!Sp{&wnuW?|(0QFg&OM`hfQ6$<`H3 zqMqnl4vwEsi9U%AU=e!V(pX=IzJ@oU{e6kP+>W6K);V;bdB(B-4OxM4VT4)e2j$Vw zR*&^Y(H58*AR5xHXej%{_R;9TC!mp=j1F*qY=0IVzzb+UYsRtveb7c4+-4u4Hy%Ml z^)q^uCb-UlWuiA;god;*+F@}tNh`;8f3D#EZi)8OBevg*_A>&F(1S?|-Z(!tEJye0 zHgxTdpbz{39pE4619OiL122kpSPGqKC3Ijl(Ijq&-q#I{^gy)#v1q@^SrokSX|$u~ z(YMdGbO(+=Z zR_MsPpdIv#-iapFedx<-1Xjg)vHl@mL;W;X#8MN(ORFQ6p*|XG;bL@2_F*+Vi>ZJA zSMuTT_jlc}EFV0LCf!zaKp&zr+ZF2v&>T37Cf6x6691x0l4DYcWLdPm7P@pz(9m~A z`@I#DhWri+X?P!U)F+0<`Uo_ON5%SM=)fLFvv(F6xfRikm|7Ba7kwT*72E$qBboD& z&`;h+*#CBTNo*(-y)1fFv_!OYw0yKOI+N;XMCwLcplg3qtlt?O9-V+rc*Y}aC$oGO z4UTLHy7n)k1A85v$s3r3+tKS!qS^fydf%m!!{2y$yYNJ%~nV9(r&s zO;T{AZ=(;|8S7ui`Y-6(Wj-2iEE+9^u4OfJ!1b^cHp4o2H<}xZqpQ#vZ^19{eS8y> zi>73ze(9|9)bQnSGn&o6#d_sw;Rgx5u{!N@aXNm44YBKEnW^9NpN%7_{||TIZPP=9 zDm)&pYmS}+51})khYT>8SP?&X7u{Y5V*PJ)yX1c&+)x>d$r&qfsN=ms=|{bGG88sg{BBzqa%hO46MM&fn!Cnr16gX=Wf?-ftR@Bif~RHmUmmczTT0?x!N+<->r2zo%J&kh5u zfLBwmi&@wM{rmx(k4v#4Ui(z|{2p}er=d&z+*9oT(iFDR@Bp5|I(XNd(9tvK3_d_l zwr|mqr_YVKf&b^~E})}2{=biJ5;luVaVcz|2@--sarY41-QC?6cMtAXDDLj=?(SB! z6fO3Df9?#wr{~#o!t2i5dq=-BccZAnF!W+IbYcRvag9Zd#6sMJn^DWM?Q|3DL#MO; z)#GhsXvpuQ*7a-Dx{Wr&toL-NbZ#t$H82~_LS26vC*V`mI`1{p8bd1iykf(pW-sD?$LD(Ga-_p;|l zqjtursB&kare-5*gic_D*8gJ;%8`*{zWGdMAZ91M12x32t*IB7x6{>7BQXRuq>E8o z@&@$c0nCICQ9~Smp?Tc?h6>_pm=AlS^ZtLcbHLYfthZ4GzD4bX{)^1#eECp4Xo>2X z54B|v!HPH)yWtZ&hV>RlasF?pw11fVMcA4Aq)SYYkHHpN{|7iIilIwQ587MDqn6KF zREuw-dX(f(^F5*TsG#j;(}Pe`a~c&x*HBaQ5!KKis9=w`EQ+f*=0%^=6ArZT3_>j#`E%P|NL+&HsXm`k1Rt&?Ur4 zq_dzJa$q(6FU7$rGBnf)*O=v01Y41=j|!Tjs91Pu(;;h30pX|$s-Y^bk6!GG8o?>3 zU|ojV*p8v5%(c$!C$W4Sr~w&K!PONtccW1iFGDY$My>PLsC^;kdh@-Vbg27Upw9QV z=~<`-t+)9{t&dP!um1*fpD&mL4Q+m#Q6E)MH=CY>+9;OcKHP!}u-8TtOvyKy3T=;u0)~r%}NjYqJ^Qim0LQi^QJKHH-r-x6!DIW})VC89H->di#6|72W<@OwVGW z8kz)zbF%g0ZL@ zC!q(Y+x+=9{}0qMTY*{yyHUY-236iw)LcJ7ja2jM4!R-~VjEK?O4UqW0>O zsEQw2x}>{V|7uAp zGSuRNsQn-UwZ0ozo1;dcojuhNkT?9a*@C z^{*S&lc5uPP!EsexE?>FVqoQ7(}4ZfChbp6DqZTT- zC;K>1@XW=2xEs}={QFIXWiXO-B~*_ep@#Yc7Qko+%+K?b!t|tP;qQ0|wby?`#X!hG z)3GwB`g&q8`lfS`g@fIwz5X?3#-KxH$E$?dNRL9bd>3jtenRd2VTaB7ZiH&UV(V!v zsq0Y7uFw&4z7ZBCJsP>+=Q_!ODsUY&EzORqs5)v(o`@R4U8t!zh8lr8HvcVZ#J;2U zkr>C!4=f}{^{^ePp^;b^k6;mudR!f4{gvfF(cc?&!*LA5H&_}|o-hxO7WfLjI2``v} zDx!K&3l;5CQ2W6WRK;7Z=TI^5mrZ{|H7L6vWarZY$W+nEv72Q&q>Ri8#p$t_etA21olxM`w01T|un zQTKJns<;LfD^YGaQ_kOi<)9cD2~a0$qUN%JO?N}Jyf4$aJiWT+U*hqc((X)DA>#Ad^s0 zzXdf?$5A734mB0GQP+P&MS0YR=5xeUs1d4*dMHgpt*SNX{Qp1uIM5s(!(Z_>y74Qj zLjOl*!$^pl`yf;WSx`e;3UyruozH%574f+jj@qiKM;u_bDRx}bWr%(@RlNMA$kh_0t5MoOTjxH;u_!%`<5zkD1Z`4jX1PkK?)O)>isCPgwQPJ=D%aoTIr;#p#nwo3a0N-Lu zto+=>)D9m9s^|e~NaMaRBajvq6J=3D+zq|B05uZ(QFDI+_xkf*5BuYc*JkLGyfyb_ zLhT2&QT2?(aNLXvcAx)0X4&LGWwb$UBy+G1o<@yKhIhsssO4JFItaC#4&yv@y*FPU zoR1o@Odm``^WrhmrBM4yypPUQ^7H>3=nX<8)KGOn-8cr-fa$1>;~i?K%X~6hZWGjf zgHbW_2YT@+YJ{Glg6%CTs6V5EH1TIM_Zcv;p8w^Y1A+q;B>izduEfO{@vm9;Z*e&3 z3}2$S9^iV^$V~leoR6Bq<*29LKGeQ(+Zy=Iq%)y9SRILfK7rsM7Pi1z*bUXAGw8*) zHXZ-FX?ZRTCcm~#4?yh?i!l_B;Xr(kDyPQ}GsQEpBs)rj;F>wd=zu@F>yImzn=L>W@JKI3i1{8@! zaT#h#UZAEZn#b*I!CsHg?d;_Z$as0L(5Ew_BAXGVEc)Yn7pl&z2r$;aR6cRM@OI@FDKQ3XClEw3M_ z8=}QF1^k8zzAShTYodCVH;!pQ1x!V{CF(ui2wa3qQCoI+Tywq!F3|cP&VedSAJ1u# zt1xEp;}Zu|3{3yU?QAr2P(!x|HJ3+GbAK7r;Zsxv@#32Xg`r}nsI@lgomOYmhz~>O z@Bhr^Kn3kY4cTd(zz5^??R2pdDPH9v*{>_Ob?S|F7kiJLf9VFqt&Q)LI+XhzC$%2 zZeq9dxXy$c!KPRc+a+fG>*=(T3=QcG%!=*1zIxDJ&i%~n* zc2p1JCpS})8NH;7pw@e1RJ3=-nb;o{%t=$2)s+Ud^OpA6gZ5a1jLE3w@&Z#5gkMna zXp*Hg1r$MzL^!H|>ZsuBi(1crp!R{?s93s+VfY*sBS}-ao!_bnK{d#Co&yzd6BQh8 zuUYp=QFGM<2Vh&&P`|_=j1pu%Sxi zrF9`HSiWH`OrFN={I+^GTupi}hGU1{Ov84dR>MIofS0iWCI~ho*cCPRgHi8%JRxQz za-gQTF*;xW@4|t4G#nLN%TPPpF)WYYumYA#Yldt#Dma&*8oV1dQa4dS{0KGo|DdMw z2WqNfr!&{(K#g<(bpHRJN*n}`(FC>Ov_KWu7WL5ShS{(Wro+`X{|c%Bw@?LsLB&R# z^rpwjP(xk{dtyUWOk6{i{{nrw;JwX=ox$zAw@Zwwuny|Naj58@h6Zj^4Saxl z8a~6O_y#rS)k01F1XPSnLj~b_%!hkIS^ru_U&zq1Nu1FPRa#Vj1gdAP@Hgy-8i9qV z<$40OjxV65?t?v_D9i+LAykh?qGDh+YPlanjoj@ppPBowWDF!DWhR1zWj7zypwpR6 zLvEug{1>$)`)4sD5`ub5l^<2nV9bnDQTHFl4tN=xVacp+=lcpPQOh)uFPqs4v!K># z2kRWvkexsU=VMe)qh>ehP}KPd)L+ADiN{GV%3-$V_Bl-t|3LNp0BY*qpr-s^)avoY z&t>K;7*)Y2)X=X&4bd^wdVYfb82G!H!)T}xNrWmWC8otJm>z4QMqm&sh9;q=au#O5 zHAu|(T-Q0!oZdsVGO1E^(s12tmz(fR!U69)EFvC0PHe zxHcKGDXOCOSQkfPK75RNCZsOuc0R4{i|R>&QYJ`~qbkmWYIq4$kISQit~n|=d!w#f zXkA^(XL`7u4E5|B=Eaw&8`G6G>pDLwNGqTU=!qJcA*fX{3pHii?D=Qb_o(aq%DA0h zI81^H$}Xr?GsDM$*5eA)vN(up>1zzd#AVGK7Q@`6TVi!wfQpq*s9*{SH#=Z`Yk%up z>uwC;y4$FZxXYOl_hsThJryBFc53tYfsVM!hEWg9F=Z_+WFd|g3*WS z*>2Pbo<+^|L(~)plsBs;7P2~c|Hpv}s)%Y?9n`uXf||=eQA55CweEMJ3VvaARWKu% z0M(H&R7GV_QC`KSTcJj}3u;Qnp!4^?7IC1xc!NE03R(89hp4%Ij0&bG6-^YUKt=s; zSO#;TrmjC~Dwd%}@}5n{uH<$;-7bkG$RCXA$T3W-_5X;PkHD;W5es2pRdZiSEJ?aMs)4&O4?ab0OsT7}{&k`_2hPI>)03Wq z%0Gfd@hxf&b5=JEsER7MH!4{7p|;{@SP|3KFgs{ZRQ_qy`-zw}O-Bl$g1dQ5*1vi_ zi3|nLY1AGctCra^GoX6h05x<&Q9V3i(=lqBf-9khbO@>=8?ZRuLsb+~$HY`+REN5w zI=Zb6>tB2F12R-V(zd-^yN?6Sahe9EXH`%`6^WXH!>Cp9w@oK&Xhx(2YCmX$YT#m+h4K(a*)!-o*1vjHMupOw4=O8M$Z`t&}Sd;o)@!RqS!jCN!6_tD2 znGNYL^pK9y-t2fWQ9Gd*wJI{A-e^?Dc-RD0VK>wc*B`a9O~GWi27krlHvJTRsmKWE zV7AUQs9-CEYH>>(g9B0PKXyk`Q5Y&+2(>fTxB1;Mi1Y}IhRZP!H=?F)2Wr*4M#WBW zC)U4u(z27eU>wFFy&qN3c~q3Yv-x42&2qSpGxRx7 zQ(7KVV^35}%|bPBzmEeIbOlxLZR>MX)PF)f)v|Rr!BZYJmu*l{J`5Y-In0RJdzkAQ zqUOFIY6PdDM)oYKyt`K4R}K`dNqU;#_!YJ8^PyVW7S-}dR6{qThHe+CzzeA5_W-qT zBu{{77t3g+S{PNXI#w2oI{E4+id zvCII|(5M5=GE0TpqSIkltbz)zqo_A9Pf#NkW02eV3F%)jfOIp|$h5*(3a(Bz!-pzx zIBGqw#}RlCweBMZyIr5K7AgiR4>9{dJJd3aL`}^KRK@#nCLYC9*kq^~!NI60iA0}n zSjmA3*pC{@>o)xwwdZ?=nHb20+QDj}f~`9a$3>|19y;87j+hhG!`!IlSJe6o2cv>{6{gkt-^PJjeh*vX8`LtXHPJMv9;$-o zsJZKl6>$Pi$9p!v_axK6ai}SniW-4MsGgre#lmA$Iew8EdDdS-4kF1YhwABF)CG@G z%j945V*JTwWOASiEQuPzddNE&S9??sSD=FH5^7a^MNMts6x$)xea$hZ)_)HUbi)w* z6IY<7r0P_&ch|x~q$i;YJdYaMo2a?=n`R1(gC$9OQ6ts@)scRvDV>PgUlyT)_B1;G z|HlIk^akVuYQ2`7VS=U}YDD^=3LJ=T$} zW8TP=LPdW^^v7|i4Q(Q7mF=Cw`d3dLlcBi_m}^=ZhT7rs;C5_|Ss9_AdE{f2`Q|Ge z0~VN1Oitlsu8Y5r25|mQ)U)L5A~P~|7Mpic^RXTIVSl)tKhr(S$H5gchAweCe?+q0 zQn%|f>EeHy^Zbq$guD(!ObH%!S`jJ5}4Yd{)Z^^RN`@XY1UqkC=76+xb(<={J~fr_Dj-7um>A za($jn=CRsfv)i?X{6t&a&fktZjNM7+-s*Ps$2F*+&$P{HD8K*1!5lKGZ+E-i;yY}O zPjb>f&0xqFd4NhXX8!0hM95m z0kf(eV_G#O)j>1VrBFdQ6BSg~QLz#4kXde-P|;fj6-2F2!8RTBjM$6XLGPfp>ZhoO zk?XLDtu&|xM4;AxKdGS@$ANaHd8qZe9ldxO_4Ip<1u@zY^BgaYTF)&}524fu5hN6@W66`c2s8G&$X1FX;aE~o~bKWpAq-$mUY@0|HeD4CA~ZH*OC7uH2J zsI|=>ieAzaQG51!)QBBH1=n3vg9FZ+m`ILlP#9_}E{H)m5H;kBQ04DOO}X!u&4_!! zJRCwX9Ve<|Rb7B8;3B5N52#>DbkS6h!`cJWkiQ+Zwcf_E80C^#jukMJ5vhT3$RB*! z`LZ8>|CxgTGUlSQr=yqjN^FX!@H=L^Vm>3vdeuDT+MwogJ$lf6&8&u4Sd4Uf)D*Tu zHEfbSzZun`^G=%e_s(X-y>1G~hPt4QFt@vt~d3qV@lRgS_|yqhsEiX8Dys71Y_<3pG*$P|IrwYVK#DR>20;esBua z&}a61lv^ftQlMfdE9$lE~oUTf3mP!+te2HrN;dr|l2LseYGraM@N zqn7bJo8E+q{!^$CyL_AVuY$jjp`b{3$84#=sQd`jx^H3ajansRQ5(=K9E;1b9_GGl zuAhpkXc=k**P}M5Z8m)hbCSMz*Jmn@e$VavhEp<(!ig!U2F*k*qvfc_?@QEHo9Din z!|JGgVF0SaVb<}e3a49FqDE>jYDBJDU->xDjZq%h=tcD`J!%AU+jM1A&l{okfexrC z8-g18d8mf%Kn3MhRD~Z<(I5MvsV5sYA)ODkOnvh>&<%%BQTYJ1&SO0?8%CJ59IBu; zsDj6%f^{kO#r3G=oB6TZH5BupMrIFcc^sE+0MoAs{(N|K=)D%cBZp(<=@?S#6nzjZh|4YucJqwZg3&u_5lov7$PjH>vw z^%|<94}BbH$lqdXjP};;{5P6iu@&jc|Cp)Si3*~9cmgk>hH}9>v%{^mZb5CWyD0|iHSR1nQT?SR`*8_;g+Rn#(kiweeo59TdbFlyr|hpMO* zYM&TkU1{^rqV9i<3U=2==P~YcrQkp#(8Su?I??(kY8C83Ezd`&iV}P>X17+hc0zSz z0#3oTs0Nq(Y(}Ids=i44;>Y@1&VhQmjjcFg?D(beN0{*!lZ^#W)y9Mmbc4r&0UDSJY6(^b2&ppPvy`P%q4ngHUt2 z2UYM{RFwaV>bcuL(21q^sOyrTrY^lrm-grHALvu4T4ZRB2cm*wDQYMWpmw~+=*6$7 zE%eubK9(jK zoa5ubnJd%{_fSLZif)E38fqwGqvkRNYVJ~_mRUIJ9Zm<->gbMY*dM43Y7J^5+ku** zqv*xASQdTpW0*Osk6QPwa2U2n&DncY&jMqb1|&f>C?zU3GNOjO9I8Q`ZT?i$`-IJ? z>rbQJeBMOG$a`cYSbwq1kYu$swnn1n{vfJ=>!^`=ieCI1gYcKwW(spyYvFwI``dJ? zIHsK9SdaYLsQb2J0@Z(=gR5k`Mh)T7xMrw6qLx!oJX1h0Y6|k9@{6F}Sd_qKSQ|A0 zdr@2OL(GS9ela}`M@>m}REHX45}zMmo#H?RkBo1Id_1ax`KTaSjM}Srpoa9aO}|3T zZL|bt&J$U^sERUR1m?mVI0Us%Y(p=;MW3QNenQjYyr`BnLp`;+pxy`cK?UawR7`9| ze>{e|{v_tX>!^JpK_b)RO4yuqT`YkIP|Gk{ViOC&iCO>JXbO@MhUHODx4!rkOD8eQ zGHX&3Bh4@;`BSYYQ9bid7U+Dj>UUI7`cNY<5A`%$frarb7RPwW&HAsN+^+v&WaQF? zsG+})&c=gUUSClK1*9-jkPcNrVbs)>LybgbRCG7A={BfU)eAM1{qYh`!ROe<_iLc5 zC}UY8WuWsp;7o6z^MgW{P{ETW$n>}^YKRwNA-svII7MpHz|^RyPLEoy;ixIAhYH5N zsHt3vy6zAzLf;b(&T%k0O`!7zquy`EPS&B;8P-+Seb!5;pnQg!TfbnF{uQ-4a-!CK zS)1Pk70i8*jmqbm%7M1b`PS{I0xw!$pr#^9h{;ceDj*wbr;EVUSObHxH&(&Cp7%sn{0PpjW714a{IxM(Ikqjtv2s2+T?`AKq`q0ESCcpX%9cSdb2qcIfEVoCgpdj1#773h2gwL5BO z-Go}syL=pIJ$^(DebV0pov+*1!Mvo8qZ;PUZF&@h5u|^|*nWK90M&rWc>-Pk;40Ke zEy!!i-Gka$@1ZJ=lh3S@#HgpKuK))c>XMiqE24s?H>&5uP;<8cwG$pk1<^UwP+ma= z-!rU?A5aY{li#e0#;A&Wqplx>UYu;wKG!A=w6z{V&D{%B%YLBdHfjM=P*N;LIxA}E zyP>9P3@Ym9qef~qDn^c@7vG{{A$~!VPLJwnSxl|xe^(CF!)cfX_oAZrA?n6}LZ*VG zs31yf)A>;qmbLlKF%{`PsEueAdT}2rmhRj0(F&XM>CyT9p9(gkgEF{qicN2_=^Hlv z#ioObm;#ERu5V$}!)#qCRsOGZHybu~7&0i9{#VNG(9Eo-?Qh-$0G%L(~ZQmo@3+s94J5 z<3P)*JZgxlp?cOFpJOjni<^a;224fG`D|1JccSjUjHU1vssX{}%(Bjk+9~s43oMHb zaXm($FMdRz^Oes=IFgK;sG(_I-V|^UHJ7JRLwXHW!8?3`t_r57FL5%-52yx>u4tTu z>d*|-h^<6T#eU?e>2tm0pe-5hN+u{eqo!aSs;3LFylz1CI9_G*7!F09&xd)i4yvLl zcntqUHN10`KSH0?hgs3DnwhigsD@QS1zR&z z@b*A$NJCLQpN*RPMVJv+q8f6|`Vd1&zs7RZ?@C@h&^6SLZ=0c()vFq&g6K6(k5Zs2 z%8ZJU0vLqlQ5#oBRD))q8n^RY-TkT6hfAkTmtoev%V4CG}7Z?}%Cj15x|Q%zCVU z4b@&UwDlfCy_I^2snK2Em<}~1;iw8mqk?e`s)1WkTlRJAfuB+LcWPi7Fd22xfzLc9R^Ep&SPf$<6=#9)=C&rhgQ`>ah z#-@SEQ4P+E8u7Y54%Fj;_QVWS#XC?#bsiP1&+U146EpN_tu?J9Q3Y;CZAf>lahjTR zAyhpbP*XD8>YK@dhH@1un2w@??QhgN|A8917|qO$zoMop3u*|fqDHPOY9waj2i%3) z;WjomBXSH?&P7!DkFk!{|2qx_lTopS>G4I>GvFmEHr``2{Epg6qqZ~!hM@AZqI#4M zHB#kK4Qz>O*ci-?>+z)@6=NCF7h9`=tiP0P%-)?HPjR9VR>aJ0jRR22@*JMVm$(9V zwln)f%l2l=95_LTUQV31 z7yN^6(w|Vl^&J)UX}XvK^PqyNG*0*DvtHDYf9__=N!8s{SQs^ewNV}Ej;hbso%OGl zOeI5eILltJ8r736HvcSUA^iX~mkD~9hLuKbt>sa{Rm<82%aQJfo$)xf!U8=_1D2wK zdu>nFzlLrn8S2SlRPf!l7d}Rfz-!b9yvI10te0tE22@ZMvo=EY(1%_ef!aToVNpDb zOEG@$K<9^2clbCcM8;<gUxXf>*5r%^lM71WeGMK300 zBvo-<)P0pv`$`*3hr>|iu0ib+yO9p~T=zIoP`$&f7=3^Vmi(v!YN876VjYbdkwqAU zn@|nBf?oWH8kr;mO@1gACmoJDKLIu6>oA$t{|*i`B$rXa^bV)u4^)s$9b}%@3vn#z z(^v`X4mQ!f8nyQyMNQEq%!Id4&;OW1%>8*VJ?Unskr3KGYOlLN)9$YQOjgHIh+>nTC7OreygzRiz1$}}JZwYsW~BIqPa-l zn8L?_w#L-ff~X5?qvp07Dv16-Rd^n?3`546)sorT$Qp?X!b7MIoI*AHDr$rtqJl5_ zIMZ=oQVtYMnNZ8A6lx!6g_^@2s39GVnyO{!L_2C^E}^b}jw<*wrp2h^&BH1S<|ZA1 zYWOe=!0|{&`S~9XG$gB01#Co3!2xtCKt=a+d;U9Wy~mnhzQhuSYG_yV;s{hZ%TU*C zMLjjIqDJyPYKl@%)YP#4vU8A=jBwP215s}v=As&~9~G@vQ4R5%WGYI4swgKahKi%^ zuZ5cX?pOlHq8f4m_4xe1XRLn$RR&0Qp>xnkK8#TpmZ~}(RFeABT2J1hRj9X-=XVGSwIZS2E zkD9YusO!357MzD#HD_)58CE2nY?g_YHmF#bjCw4uL#?jMHvI|Jz+Zi{P4JXORn!2> zV=vU)A4L@$dyXlv0qP;r7q!fmU8^wX< zW*KVZ*@YVVtEdaVpe{^0&rD5jR6#XSBhn2OlnYSrBaWc%yMh|>_o$!_oo`02DCQ&G z1$h?uTx&Q`%Wq*ee1cIh*#dK8DlAAk7i#0_hFW%mP(eBo-8ci)(0Qna>_#oi)2I=7 zfa>Ub)OFDoYJ^yS={V30MNloRgqo|CsI7Sv>V_rg#Y3n$eT)S##v+q0gV{;9$Nabu zH4=9)FMdPqE4de&_k?vN^}7ahpbD4c8a#=*uMV9l11(&Y~o)y2YBl_@ z=@h%n)MY?D^~$66i{YqpwxSw#0k!_$`#8`#Prcg=T}xDyjz&?K2mKpq_r= zsFCT4itbXUPf*L$f4})ES`k#k7NhooBdGGfp;k}&1J0EAT;(~?hR_~063bD0 z_!}&QsSlbVY>avsMOtT~rf31iz&)t-egd^R?%Mp!hfIg^;S2J^QP<@@tnyfY5gaIL ztKv!QgKBx{BPRITp!WJ%sERhCf@m*ls1Kp$@+vB--AB#SFb1lk6sVZVYAtQ^8=&*| z|GILZr(ZAB5D&t*I30E4GSrT@7gfO-)b*FJ1>VL;EO{)@HHFo19W@mlPnalQgWABh zpr+t5>e=CclK!hl88}eIxlkKSIniNDERlxyNi!Y-Z@*TaH=!}_)-%;y7 zzqKT4ETcDn<9Z)ee5;ejT&iG8v7m%S~+JeD&3IE0~s20CGYi{_8;iO}oqoE9S zE!660bKWek$yl58Zd5r*FPMi~AuLR~Ggik9_za`_E(SWkR`U*40(LI;$JaAS_CzcolrgQftorW>RECXb^lk?NTt7OI^@gF!Fe)@ z<1|cs&8+V=*p>7HR1a%jHzPC> zR6{)mVEUuMs*iCW*IPz_j! z8i9SNr{Ou&!{#Nb=TV=VxsHpvFB7)Il9&TG;!1pmT1``5m>}GSYS7~s^j|~qnGDVC z4^#_7UYc}i)DGDJQ(+%eMYB-Bv;j2|Cs9Fm8#R*gUYQ@S>4>dJCwOfd+#kK9hoN@R zr9KXpaj+KCV(mAk;6dnAgaygpVAF3gJ?ZFwn`N2mbYd{ z%z<9g;i&R`Z8=a6hoB0cfLf>9F*iOz#fbMG(}T3A>ocQzo)6bx1ZqUSp<*b}J2Qo8 zP{CXj_0)_&O=)Fh3Vp7|9O%Z@SRMysFrLSr_zBg+PVdb|vODm9%o+|>+v`n z+951Xe$uEO=hOE3=$l4Hf@mJ+`~54i3+azo7u!VlIIH3)P9*&rwF(Bt@HlVP7FeHP z0rJCQnufK(I;1bh@;J|cY_UDg|BN&UJCpwj%VC>19-s4>%hos^C;Gpjh9*s1kIRdB zF*DXd#l&dqI@G6FS5O;Hf_NThBg%@|NteVb*c-K~PNSX)A8;!s_{HP=QtGK+`1@z- zS@HND=R25}tyvOyoIQIKYA)xZ=5jk~F0Y|>w%4eJeaAfbTSC**`lt#oqP_?87Kf0| znbX+Q4gRDhR z*EhoD*b6l!zojrEJOEX`ZyE<$zgd6vIPXaA;SbU$QhJ=_cp{a@*;tZ!J+3|EhhsO4 z5#({+=?p{#?@jz2qo+3MqNpvmBWlDVaXv0Xb+Bw2kM;qdt1ky?=@``Bz8HVOJ=g}% zqts!ts93m$jW8^&$N6dc@pxDz2B$MY z@&ffVOOW0SQF>Iv3ZsImCTdQ{pbA=!K^QZGiH%ISiF5=ix&uN@M=GLXqzQU)Bxb_p zm`**q#({>)KcmO_j3*cs_03QfPQg^T0Tt~RFeko21!qW@X+TlbNHjt(_CSrubo>nu z;2eC4wQyJ_M)U*+cR7$NGn*;snZ@J$;gLwxV>CrpkMmxz5{@K&7?)zjY-SmKLS5G( zyT|!&w-=*UN6H*#B*Re4wKx{VfvD>b=3xCR7(SDstv56$!RNLHDd1X!X7YH}2WIA@BoF}Nc zu2IhPv>!&2-iykw8e#U8-dK$EI3EWaIXI8HaCmtxprYgzJkBqnWv=LPEhPUE&cdFR z%m^f?>~a21Knv`}^^K~SjpasFkMkIxT+QQriDox8scEVb}~0A{}>S=wen?80w8qY1DFV zgwE&x13A!JtYN69-&l-=i;*qTwcffPRpEIofp?I%P_E#vrU7B7Hmf>0q z!ab<{2cm_4L~(y5~jiF zsGV>pX2z?S4x{!mJ788+4Ae!v!|I3{@iV*2nh5NBgXyn(4PYCp3KLs1Q?hI%>mt0Q1<+j5^;CH6mkC4cd%((D#@F4W)OWdD?}b z=CmMcDk`BKDs@l|=w$OFQByYuHI#p12(Ce0cNz6*_9xU{A8n8sfr6;m>W;g${wHvt z5vVZOY#hT-7u-a(@B z))=#Y1fy0(LDb{E5o-NMj$!>PNEVTyPd+!IcC6c|hP^~p5IEMX-%!*JSqNidbyV;+ zLG`c|s)vJ76>P^rcpP^&P zsGgs~Sojci-CNYq`cE>~2V)k}B{38Bz_GXlYhjK^v%JTlI_z6uGd5rXG7j4lH*ESP zYA*dJ88N*YXj8K_CQT(KUB~zMXiR5s95r!;=GaZxqjn78$=IO5Uxbc z{UdyX-%-ou^;A<}!f7TZ3Zd40Q;dNVP$M!MH5DsSTlYp(Z0tgH@Cs_gUtm71f7f*L zDOi3~%X^}RuD^8^s>e4`75s(u@n0;3wPu)&XaTC=s2|H4eF3^~uG#BXqjs*XsIBz@YF)>iXVRfqk#to&jDO%>Y&+lMx{qNCJg&kN z9CslVkgl}IoKLpcJjQRJ{sv6{KNwM5zJ&GPn+vxtHBp-VPgBu8)DZrK8uB-&m~bsK zbDI>^vmmU1nNZ8HKWYSKqek)pHpG8XJ7JyWX2hDKVy4}4pE=Qs49(FHR6+Am8_#ak z96rFzm~e%O-V&&-x&`WSI|vo+^HAj+vp&L9r2ST!>x0lsIzMWstmorE1q?+E`9jp= z_XMivx2>;GQT^Sf16P?ICc+T%!%%Zx6?I>8)KqpyHEaO};R#g5FR=jn60SDOqYAbs zqaChbZf>GRV8mLpY*yjlr1zsnWaB#HW7JS5S#RDEWyZXuyPzsujauGkQ5|$|FwdAw z$a43&T5_NQ7oawp3#jGy94BD1ji%rg7=`p}RM5V|M)(O8q_sD(jA?i;tU`LzW{>l$ zmeIDDec}%4`WRcyCpPWS`TKv{Inc)QH)`+Bu+4nxvWc}+P zn1g7T6E(zzP{CFlqhdJ>#A-IbE^0$*idx5AP|IoHArlK@QOk2N>Z!L5wPPMZEzgj{ z=2NzIhgtu6IQSnibDkNsr`N}tI12UDdVqDYz)|xaaV9GN4KBs9$4peeMeQ5OjvKwG zEja`gGkH-PQ$fsyo)fHpEr)_9JkDPxZH`(-xlWp%lt#^U15}Jmw&_!-W$J&*?hB}q zEP>8Qp+>MS>bj=(d=FHx4oB?^OMD!t$A?i-|JGg*blSWDDU1pxA8MqIVKMxGijBNy zO#TQ|3~fR^|6igiN_p1g7r^|ayV>-5)I-Sk7YFL0_naxH8U~RbgbK#Rs0N-vjldVw zb3Dg+v(6i%dOQc!fyEe(7tkM5T`-UD)R=^HX;iE=LK@_Awc$WP_osCgYNJ?>+3^O( zz&IDpR3%59FNO)QEvlyjQA0W(HHCXo!FwLH!``rdLd8hJOWHYEf5|z}g+)<42}fN} z8MQIhM74YrrpHC7^?nL9q%kg=hfrw@Aw3<{kUgm2yMua*_7A4PL|06Q^CI!ja?=5p zLN%lUYKUs0=D0B`NY|nszgJN)k^ZWg!!D?Y&NAyER50E{HT-YX!z%hUvmAp_4a|o= z4OJZu^wevIYRG8RNJOF+XQB$)fiv+Us-YdOn~~~i?T>mE3_-R9*DQ2m12x5qQ6sbr zwJ)5#PXBemV={EZOVkj(#zGkXhOr9jt74JZmHeeQJ{p zVPjMf4?<1lDpbteK~2rO+pPcM97Mfif+PYp033Js*gQ_ED(d+h+5x z+Vnlt{jR&l0Mwh%Kvajls1Z-=<3K}G0#$HXdqEYOU)$Qi<~K!M*9O(FuBce)joOlj z*mNYSBXdyK{egPAu0U-_2e2yoE_0v)LhqTD<+SEUExTfiPqyIlh95otLPJ1Mi!1lOp%=_un~)&WTK@3-X|1pd4xlJ6gM-dej|*us>=F z=A(A9GpOKmKQIkSfhsQ;)$rV?Wmpy!YweJ~e?=5?pkV2S>d6%61mE+)0Md(5bNnZ2 z?vB{=r%@wt5ewrZ^kT?EQ(-C8va5w^NLTA{)CkQ)=l6eBb5M|s-KYw`p?d1~$QTVZ zl<_bYrbP{DPMcpIH6=|k9kxbwC=#_5Z$LHt2ddn_$7Td#Bme&`@7Fm{0SQsh?c}Iv zO^2G(qL>~#qOPBbDsY~42`YwGp*Ef^s3|>yD(^f7;~mu0xu2MkN&AHLuM3Nkp`naG z^|U_f!mg<2^i)*OPoaYH2CBj*s0#kZ5d4lBf#9d6g7TN8VOJk-!7M>QY~s;8MzBUK2Uxkd$VSDQZ_^{iNr3eq>I5e)gu z80zCdJ3v=NmKCV&WBkaVr zKVLhk^d?c;iF>trGT?FwpU*bfOBZR)@yg1*bLc?`omooHyAw!PHMG2T>*sI&;bcw< znrjP>0?AVLwwx#ExoM{vyv3K?b_dxFA}(ujtnt1&w5C^()ymzHbSabJ7x+iEK# z>H3%aq+AnA(atM}kBpzMO0-n3cy>5-Jdws+qM`#7^uykCk#t)ca-Rmb;d~;_Eh1f% zp4TP)l>9&bQ)v;7r_q_(TsMa6^!l5!mQj!I9tTNic`g$ETo6Vfjk%$Lx$b}eCgqyL zG;k>+v)9hwI~vlH0xM9)T|0VNNGIcdy)#-!ekrb z&&|#&Yi#Nd(9*HP^(PjhSD$J5&(|St%s>T2Y%dy7VJxocMc(feRFmEmqR=QbDl?Tf z$5S+74rNTY4V_21m$@z)_a>vhxtuS-XvWpoUq0A^3)>dzyI{O~c8%laxwe3FR5*}) zy`oWRO!CK3*m(+iL>XJizfU@xMx~&lE0p<_>-#VQ0W|LC>pA&3xVJ6&Yq{39hl};n zTjUVtIGs)NQ#1d2@za*B>{O&zB#qR2K)$fye0i=Qjafp)JMHz?XpCMS(x<3Euh~?l z*JB&ttr?lceB_VG`u~T_Qk%6w$CAKi9B>u_Hb(5)V1%X9(}u*6W%@ zR4|T0%5Z!{J*Sar$NseFTo2+uIbB%ULiDUAm{7b`%NxSLeBT*elO*(qO4?k|5f=vt(|1&DHVk_;kYN2 zrlZwCq^IyPnzUY5Io9hT1#V)P1E}aO#h9+_+}zUkuAwbd_mtqCDE|pq z<#nL}{9K}I1`YW6YR(8rae#Dm3SQ60TJ?y^_fu&$&iCN_ z1dPiyRrt{B4;+BmZCZJHwPv`3X?z3jnf{;Yc*u1v`1w=UdkXDC1^H<8QhJ`!4xMh! zV+%_{<&PPezVzTM1^q*#hSQ@lTz>@pIImX+?!8Sp@wjf^f65t4Bev1GmNxGr^%bBD z?LV%^9O#vv%3}TJrqZ-_5$X1ri))h5(A|ty1P)@lK5=~>DvC?PI&*&#Dn7?`y}2hF zd3t4}qR}+?n@PI9a{oj-4LQ00*CJfZ=Zem&2u>yQAs6MdLzR&96AICbPj+2($>-;X zU11zQqr%5grnS!Im)fTvPSGnL_hz;oQo7=QI+UM^ds5!dS0Ei3LOLVU^Mo?>T2J}{ z>5-JZguKJHv3?gsRf^8k zWhzqPb6j96Zpv{Au8&3sTXXIZ<&5RrcC1Qz0q0KGL8(fa(-?r{q}_Dx(kWOs#{-v?O9OtBhJ(TsB>km^= zR2q`WHn=4D56SazZ8m)wr2_@`;)3H87KMh~=jOGX+`-MKxj3PnmRK|_D%bpc{bNUF zm(4qfJ8Yh=S-|lT%GzP4av}};Xd61&<~iekmWwCQ0jKpm5+S3S7mGiV$+x?HUM>PYRaI_|GmC& zeFvwr^nWU?9ZfIha{4r_`i=A%DqBqYC>OP-qMxq?6tsqG9@>h=bKO^a{-Pbd;Wqt? ztuZGJZcAf|b58;~b>0^Cff0P8PouB>r=_L1>7E)xVFS2f5+7S>?N!^u+?>}Z6ngq&}dx$_kX5B?eOiPpm1(XORvguQ54c0R1k$+ z=2)*Rd{pPgexzU1yP6dK7uS!XH-1#C*HJ!tb3E7v)(Wm|$wxQmtoeuk{lit9JTLXk zy?aidF}Cf(!n;!)>6=J8oYuL`bHUV z=%rr#{JN_!y&q(+t8VYDPre`5X5&M@M(oPOoIbS|6~dPcoBl%HZ{%mAap!2rGmcBz zq02?18dAYw^50PC04l9yr$-gH=iWGc?4+k<=~!*be9SfZsCXzArpzal*O+qp>CdRl zq#!Q|y~c5(C50v6;E9$k1InK>BgZS9ZHOVlT-kqmW(`m#v&i{O^;P@W*6{Hb* zHK!plxaShrO~i~Qo1e;N{_U|V7IW#LwOP3!ln=e`^U;t(DpJuJ3JIepwYjbljSeBd zIYV8Lb9!Z?u`kKb%Evs)`O`M&D80?aM^5to`%24oynL=z6vChOc3q`4i?}Hge=s5u zG@=59E}+$ak(Zg{*|yM7dUutc@1oFnwz1jB8_9L^X`o&yaT#g75^-OD8b6kgq*Q#J zk5c4K^QZrNDd-s$Cd3;Q_QJHxb&DSBwULT@a^nFiD1e`BBOY=6&({Mx|9k1oCVM`K z9hslkEav*clySjMOKHkq`}1x5&xq{?qOi^-C1J8aH3y zWU8o2C!Y4EsGsxuMlbBu)9K+X3fVm0{Lj}0I+2pb=#`l3BZ-?F)K!(vM4{34<#Ua&LmibHs?oAr z^f1UasK0IbK(21Z@vk<2GzCneLG?%v=YBsb-pfZ)8Xb>OsrdgYaP^_gR<>dJZO?z! zo=6+jF$yZfG~M7Pe~ts}lDa{U{-uKB6xfDyiB$9K_Dt=DTkOCB}|9?)el@#296MZ?Km_ie9Z3LBW!XSE2h#?43qC|-(BWhSeM2RGbPNXRzq9qahzvrGa zGV#7op6B_$=kvMtzOPe$=XcI^-DTG9f@Cfd6l2`cwjP4WJxDIVe|u1Z49Fz0?k_M# zfG3iRWvNK4nV9?X|Gh;(U>Bew%L(|7qx{BfVbzJg0ias}s0e}W5ZXqyH+6kOwSa;6 zSI4&*^V2L#KwO-s5dSB!wdlqa#%azAu-wM}&!-jkMv;Tyxd4}e@f=9}qDfj3bQyA4 z(Z?%tTh4>!0QOhG_*U_}bfX}oGC?*&@aR?xjx$MKQ3E{(mFWl=rgHu%1imL(0xfzU zCx?RF)+V`;6ln+Za;2!M_2KL11Ks=w;5c8K3tF zeu#4cT}uJ$NI+E*bptFX9Y|uWvJx09ZCQ>ox~8uHDDpiq74Tor{5Y`znSx(q;%hNJ zW=w$WI0(HiFDfSi7nunO5&rj{XVO7+-SwCT&^rL%A<+kPNn`?*1mq9xMolFq`u+G0 z*La!#41s%eCJfzX4*`vE_%O)fH=Ou06d}>Ha~sb2=*BvHc9XClYZs7A*uU1wYf<%5 zeC8^7{^UT&0t(9kxefSjCSgfk>M_`QP{d|{Ja0o_kQxLyfpIq|$z=#w2;MY;C1-KiuVCw%%?f}9s+lG8fqGdQ`rn>A>1u_Ki9@uvh7!HZs%;%Eq zp{~35oWOq-2^XSU#P|WfcNvu>4x+Ko?S=Fl-2cu4bWPW#5r9!RwI)d@$HoL!MR$Oa zh)-@!mae-z8t_bzeIK%2InPdoe}Wf~D6O&|wki-PN!;3ikz)MmT5Oy&f_~EqO5wPLu@OLixjJMoiB6E@09Cw&-w@(T1H6+?b->4EAksnNeb_1y zdl>r#?bhqsjmFq>(zT*s8S8(OYSK}b)(UC^*n@;Q0jR=xA?)V~$VbvvjH60$3T+=o zqNMGwgGAvgTuz(@b9fu5# zr3gCCu?GMZNpclJSpls@f^N*y0AI?8g{&37PT1rJW<@rEH3$C(nxh9;B5SZ8p^(Ay z|2;1w@J%Mosp>}!+(QL_;Mfe^8=Qa6c|3kkIA5ccCUY+GB}wj(q%?$H(ggXnLtQDt z4xy#QhG9>~zZ3o!@tY_e2wZ<_Njw{t@c?zlAt3KlSq3e=g<>jW5Um?W;_o@{NyoP1 zyA%5Wz~_&&O_*T{L;b8jqNm8`?1%D?B~o!kjsb9ADO9t zJgr)Sb7hX-lE{srFhisSffn>T>5dn$Jyg*XABWmY19%yG6-W$1KhPf*az{HDi%p~t zqe2kzeGnCyC(nP8Y$TWjfXFzO;WqP)%-b;kRzVt~Uk(Y8JlaklV-;9xsJoJxS>w;Wca66Icrgo#Z=9#7i0^td1O64_mM}CCE zLC(D-p1^rtl8HnBHl87}h1S=EKp6$|YiXx;B9)jW6d`{aVhK3$LF9Kr{kNTwU0Za9R<@<(xgm6xF^1%4XlIC4@ra5;LV4^>fq;T4x=1^G|)BN0JC_4tCFZo&_g*3unOQysNzSz zOUOrnuOw+*^zxh2^)>bh^U_olN2M3R2!p^@wP~pF3)8QIl@FiU#J-hVum4b#hfvHQ z@f|=!Qkbt$fC(gB=2wSY#ixw6vo0NQE7_^|-UR0+UCN>ru7kvnoaY6z7#JcYwOevN z*!X*2oUG6m#gSBGCr%3ioCcW4ZUE9a--d26W2Pn;s>@aYA^{mp*SbMunELc5@l@vX z0+%UR&6taL_Rz|7fSXg%Q9$0q*aye2NYa4nj6e ziNA+^npQfAbCEontf(v}`DSYe>hSZ9hQkOHvoSU#`BRP}VYF5L_P|kW`OrO7z1Zpi zoXALl$OFbPP4KdIs|hi8&}|iGguj6ka$m{Fd^Gcy@J*4=|BJQtsU)mRRjDM6!Z{~Q zMIO?H)7r|s+6BLb4;`E|K^F(ccMz1{uoroQaaVL;zJk3U<5LLb)x9#B`$z@mXXNJ% z?$NFRB-uxs2N~h)cx|Ul7m$1*oe?oJmg#wSDww1syO8)NumVyN@B+-=0OuY=fHtHi z=K)y*j_0#LmC_Pr|1sVzVVI2sziCU~qce4teQ&^z;QxVkWr?C+C0T3$o#V^+KjJtF zB4_AmWiT5wgQyFMw|)cq5Fu(2WrU?jz_Z!JnaT$2^JiZj5c5pCe`` z08IfZiLN=oy}-!MI14e6!4S_1v6zeI#rXca-{1K9opxh6Y|U(< zl|i;RfJdSiDTUuEKm&4~lLV6AVi~*AmCqr)1ONGo_a}*SQCJim9*U2M4f_y}I$Q;K zKUF!XKAM0_|fezsY%L&Tm2RBi34EKfc|tRfXh9Ax-6Plk7uc4=J%a z_`Xf-YQ_L!e`oB&w=sJ8+ZG}T=<>?-e}tebuq=V|>j1y6%xiJ}209DlQ-4gzU33)z zx~OwGG!+smnW%h6(7XZj8q6P%^c^Y}nX277LC(zb^M)pEhu_S%Rj4SML|q|PgP>D5 z&c-+!_P+r19rhQ{C8JxTUAdu^2QVIE|9}n!WIai%u@@eb>ok=I#B)h^^qe{}e5(3?0b8hd*8ROezsST0Z~h zu@XejSksnk#3ix3dCE@%v39^wO6ONskPs3>=1X|!D(ii(k5)EXCi~;mM6?GEbHwk)jwZW1QLcAQotj;jI91k3LMs07$C z2+U%(wse}Y$4JFu2~yO{5jfBE{F zz$Q2bWEVz}Sp-$4Vv%b2<>7oUqn>WmIL`THUZ z<&u_Vc(;7@gp52C+B)f3d3YenZip*z<(uBOG88GGntd3-)+^niqj zi{l!`X0SvOiKl+rP4Ep8y$e`55`Rc#6*XuRReYiwt{WZlN`OiRi3(~rMD;oZ-$C~c zL{?DU3t;}nyau)^%m;E_AKOsQo1<%+oBU=#eL)~awXGv@JO;6I%C-W8jzZ>LDjR^m znNdfVp2(~OQBrusXO{gNE7N&jaMJUED% z02I=I9;zQt68_F*$S8tEn&>edASYuyy8ax0q65vrD?{ZINi5Qj^HC&=V3Y^%D8+VJ#^s>l7^X48xosIP#&YmFaVA~pf^r+NjgWt#deUn$glYSz_Gus z?@)Y2iZN=FbTXLlW1CDj%9A5b?c(ERz8U+w^6x()Zv`cg(~W%jj!^~XcQwH!^vwVh z`3U_@?M!+6_R*1ej$I+$kLtd}mYpIpF%L*)5;jGb8FC_hz&PT;u^Y-C0ZxV0R#@)m zd@l}8<|C+fKI0WYmytl^Fv;?B-xdN@0hvz+-qST~71Tz*CpVR#{V*Tk6v$0udDcO06k{Fn zO~C66_8rcX!1|Ho9doh%Z2+v#7@$mhV%&#O%SRQyHHetwMd2@`vLMTfObIM;J6GjV|6_z zGq+;TO_G4bE9pT>VgiKtz37n4%-_+3qsSEv&MIu5;J-%R|9jKEtW3T}DY9A#yv_M~ zUEgo<3y2Lu0Vza+$y(tboPVOp#a@hRe_;&8UVM0pY8 zD#laDoFk|O!C&Awi{Lwu%ZqIg>@P9C!@dIj1;!z4-{Ct8{Wrw6Af}CW>R0X1L+mDD zrIJX#MS&kwZU(cttb1pU*=f}#z#9=Tl7znk7?54sg-!%dBta>XKh}*|2R}KTOiU5< zqw%f9zRIbs-v-Gs=q!xN=*B>7tvvsGkmxriH85Nua1SF`)&p3QmbU}oMO~WfbZryh z%^|UuQGnz-7>O`QW+Z_3CviW4-3hQ)HBNBXYG<-gGrs1@< zJ)mVVe#bGE3UZMs29N?uI5FsoNQLl1d`}Sjfbkk+7eOct-?fYt#OGEh|JM=Y z7Qiw%W~RC+K|A~g?fM$_Z3%jb#77_!kM0i=uTxSZ@!w4R5;8~w>yx+@gf@X!lW~zT z6AY0l93zR{3Z7f;|E-Bw14Hr}(vRTdv}Ya1Tj)g+1QqEJ)Z%mKUJRPA)2>YB*pcLK zGJayCJ}-MAaFzmk2{!pdRPO&#? zb6h|-MiDndNqw%Q8-hIsQqj^Se2XexEeLqNgynn!`!YF!@n@~LH@a8?oan|80Ingu zATWojniAJqt7|~QiNu*m^oZkDl6^{rsdTU~IAfL2Qm`^(YxCFgdO{8n^iVBOnw!pJi&)JUL?U3O|q4$uP`<;{}#K*ACM4nD9)5XyU=CF z&q;DSwm*oQ47q^xlkfk337a;oRj3-?A^8M6=0fJFuGJVe&19H=1&9~_lbXm)Oq%+X zLLUL%2I52(N#`i03ch`nsOU@Sl_2My)fmolavn#K9e{nQM6&Dg2Te8--*74$E_$lE zLP9IY=>R^avPA4t!TA=wTe?P3ZyKmPa5$DwqFsqkrpq7uD*DkfIyOKy`Jh8zNqsx_@_GA}>&ZnWUA`e+&5Q z03XIbR6B4Fy;b%ak`9UAA=Do13Fy9K-kSKjU_U_LgY%|xH4P_0B>>7(aT?-Gn8D8`bF!D26lQ2b`koCl51G5}>BH4(08v^UW z^>ig@zqYNLw$p*`1*r(;HEDNqjt+e40rFV)$ze9@eEcdiss}BDNy$$oCRheSDl=q7 z-h|vle~c&OW2!0!NI(+QX#;GBLgEElD)K1+LrA&;;9SI<2fzi;_nPoUzgtKFs(M7l z8|hecVhSssnnR`#6Aku9VA*|ohI~&4Y7yK{0ZWr43Ht?n z|3LQ^^MLGU{%ar*Wn26nQsl?zT4}LsC8y-SL`&ZznTQ3)StL5c8tw3_LRwPk392dc zTua3~kZMJ20FMnKP@E)_)D}kE7;?vC)(Cw5PO|*jv_w6uLXt7!0#=Hje@Ai zA|a3eXU1R8=KM_(Tqmg=!&7bBasa$A@9f{H633m2YgXqcIZh|R3$$&T@X1){470}xn~bRLT(;FKVvjAv7uW*@Klav znHR&B0Z6=V(znpt02#^rHS}Yo6673(^yD}g+piEfh3$8IzQn#&ZN z3ItCXohAQd057vSMsvJIP+g8YsJcr~qJmV>2U`V>@f;s(+g~HmDArVDI5EG1(;1t5 zljJuDy#k>~V!A3;etbk)vP_TAjh25+9ij~5aPIE68()6`U^sxsU_OHiKZdajpJF7u z2#NY6Da%siVm^%|KXZN&dkWwQ%?@s3?sp7kbHo_4Vhj5#{$-hYTgHE10w;yOIpYqB(054C&-9gM?X<3_iMPa$XhS) zX(|iOt+8w%;UIwT6BtWS1#MeVNS!5#NKMFmj9+6a*`=UuATF{S|9kj0N52H!bZ~xS z{)yUsU zB*i`s|FR_gisL8fpKv^kZ&@&Z*S+&K_H_B}cahUnSDBV9;QSi!Bu`j|mSVmApX_ja;$=)RK7D&z@M=Cfs(bdE*@`3*l;;9MX%T%xzpsJ8K$UGXB z-Eho;ex6oU2|@!%xE!!1=sN*co|sfdU*@X-Y(xQV(Tl|6{{goA{%OcIh}6awgYRN6 z2av0%{4~`Y%BTm<6{)b9Ts}BI03av2U@0eS55cz~DB=Ss8@hmuBi4?s2Z?$@W;w?k z`0ooi=y5MO|D;RTLs|ctBsxgq(^Mz2f>vG91TApPz}Awg?_qb6YzejpN?QCsrjkYw z-A~+Zk_DuX;sxf?7!!s0@E18pUgQ2Rlc$W11XPmbFrQ3ijnHjiF0zQEM>&_DzHdO4 zQv?lpNx@nX6GlZF0o{i^AT{uN8+|p#VD#S*f17cgqC`A}324X3Fqqu}L<(EY`4-Nv zYVxJ%UM08=zI}1Xg-s+5!sQro0Pf@{(g*uXkQe!#uH40Dob%-k@JfJPPId3fzos8X zkyqO-jz`%bBHdMIrRB|-ZwGiCfODw$G-T4$uO^@uvEAor1*3OEtK;a`2l>HHNT8wTL2RPUZkw+L8v#nQ|LsNYPC~zo(|Sr z;>svN@mbAWD~mo)t@|L<=4J(h&c~1qC*g;Hh_vCnKJnv-J;`}5?bZ{LH3d`T3h|#2Hwe2ikJkL_sa|9j zOdr7dpg5}27uarVYlmac3W0odVg$?3nS@IrI)fySh*^tWzNLDBjrtLZGNH@KajbUk z8hR1iv(8a}85GkrnPKJ2SAaOR(pRYP9t3hx#Zj%Kksdb#*aiPjB{5Q0*Ljo1_9t-< z2#D-bn+071#tq0n>;DO93#?*cEYhC&N|G!lXe;1zNc01psE0ifzmxc!kj}8q^8ot* zf;EYm#dwwBh4e9WUuseVlrIxlmQm=6V{gQ{XEKxDsD2MYLjfAXQAGZkw-`xZ0^~M& zkv>#aRM%DJ>BL@zOj(H5CN3-Uf{Yg-nFMAL;@ymD_*{i-c5EUMV8*a~2>&}1;GyBq ze!o1E=NOsCg7_*3H9?Be-ku}#HEgF?@b&2b0C_AZe{#$Z$aU!_QW9G6Z=QU>OP60m^QT?W!ghd!oOzkc;>a z0IQ$cK84T|<|1Z}oggl9lab8%Vf;JFzwi7^_3fE_$XKbta-lAT)BzZqICjP-AAQV* z{Zj~t)Mnlcdjo9CA)Q7Cd#Y_EMBl_FQh;uagXB&nFbSIt{T>Q>SrSD`JJl!wuaeNA zKeK3L_4RB0U&n!+Laq{EKBX(39R!w# z{R|SmOUuqug~&D7O~=Wl>$MKB7fEyi67!`K%!}hQhDez);R-tD|AyO9LEZ0XYD$kMo(@ zk(tK*>1F z18e~LE`UuXxF8PONj3zqB2;+{y~q=d?PFBK& zX_8wY8O7Y#|L-vonHkicKRJI2$T4g#s#>Z(nb6ONL=+=}^TEWOCCNy}6#Q~X$Iwe* zJ+NiM?;r$bVb8?)5X=ea=7IOQ{Cr119%2lZoB)Y*!8wTvFT#8jzya9;Xiq9>K%&+x z&szZBXZ;s)K8*2@1cSj$CZ+;G`S2^I-3egK2;~2Sb{8gShLY&3j;%;6Vglq0b`$m* zwE7NY$`X@6#pSg#^_1LFj%&6368j2?os3v?X5yQu|1JEE$akD(QRxP%6j@0{J8+(f zV?IdSCP50erJTQ_d*KE|V$tp8_%P5V{6r3L^x^kC{^vD*(8wFVFIgrso|Z-Q+qvp4{zku-|7uLQI&w#9zOknfp)2`Q1U@DE4~Cq;K#TrTe!lxnl8wiCks`hi(2r6z5~<1C6YvE|io?7c z_JI7r5+pGS6aO+~1CovS0VFC<((RD8a~>?U@y{Yl7uf&lfQT$a`8&aNN%SKLf5B0t z5=17Un*q@G=)Z@=42@YyOgoaC5kO=&F?%ImyVZ_)HT3nA_#on5H9X1x9?5J3ngPB= zlBuj&OM*p?>bm_-hsFZdTlH4}9Ih=KLd-6Fi!;xu9r!^L3&v>dA2ENG92=Ow3Hi^6 zKh09i&Po0E)Oo&mBcCg})N3ag*QpD4ZLbCqB(nJ##LYbSuIFij$VDa0?{5`sH6u@JEO@&Bt=B-J(m-8q1 z9H*lv7*6JGHJQZr#OF3xwW<69RyUK1X42+G_|*j?Al<;~1@1$RneYk7dUASxLV1GmgSNB%O1 z6Z3fhj8FwQLc%4?UxfWcj%g5yp_N0a{u*&(u#cAY zMB32$c>Dr#l|q){A4Q?xa|}pzVy?>f-g4?%mC&GXFtj9z$Rw(LUamnZ5?>1yT?Med zZd&o{gzi;h*MYlAD}E85TaYV2xAKzf5&qkhtO4H%W_<}hlgaIHyvt(Pf18j;5;B*Skq#Xm_(^Tl_t}Hp-Sc(usX;l1n*}sjx&D6b`gCJa_yAw zQl|rICDBk4tk(o92xv`U5{?xaA{`ZU66d$^|C;0?D@b@70(0a!PUkE2D7H@W>a5+%@!^ZNKSpmW#p z+sqL0V$TM-?Ih~Sx%?wke_giXU|gURJG8qmGd~~>B9~y*nX!?;9t2L{yf){zsqk9> zN^l;K@gx^Xfbdm7o&s16`v~H`R=jmuv3%FLExvEym%`Xjj7WPh(jfo0XX5Vw^u}o; zt!as#I&gMlBrqM7}F55%arIyvnQCW zc2k@s(c!f8x0#1ooc)vH9SN37rXk7J_+*pSg+1Ppl4^Ea<7^hw5UV@cWR7z=Y-w(b z$uiXKOiQphP3D9Ir^V&6+LK~K{`VAq><0fwa9@ilp*M?%Io-Z0t3&VQ@Ysf!hq+8< z*C1+fn$qkpbGjwL6rXIiCs~BKDHU24w~J~lc2m65LK*fXlie}|i({ZA-W}5Dzr%1@ zY(yzYC&f3B+(={?%&Ps*p{3gvdtFm>Ws~>7PodQ_SK_R#!<^tP78O>|`#3VJP>=rz z%_u1dt%=Pci(=~FOmmq#+pO^xX8>B%(2nO~-?(+8C8Cul$U}xwTVZHzV`}|LfWbpRx-4mLx{~(jwVUl(H_sglpxs&0Xno4!7 zuEQ=>8Ov>>fl{S8c)fjJk|c8;mzxruiRO5VX>gj^W_1tqT|F53C{I?a-DR=6tZr+% z#rMtG&~-(8uRjRg5)&CyrdpX8U-?2|X-(@Sn5wYcsWyq`!f;!hc4M=(s4SO`$!4{) z`OI8e&$?(aK{6%QH@|P#schMwsinETq=8}W3V4E6h>MIBh_jd+scc%aTVhSAETmDL z)oon6@f2@K2x*mQve?aBnF*DG7ugSCcewo+$-`1DPG}7>Xby9vIZbg+#}Jpr8LJ4s z4P(Mu*T^kxH!2OF`W|cv+ma<`TgMO!E$d}Uwpf#r-M%$@!hVX#&iz4l7qK$&Lhn58cjTvLO?#ET^o)->8v6bjnAV zyB%rq$+GE;HFH{_5l8LTM3dcN;_^!O7fBLsOGZh)X^+CzmaQM}G`o`Vw3#WLI=R)# zElYM+3Uv!2mxYDJhlzvRm+pty=qTLJltt^dTtv=UsBmbtcBdS zx%%B^Zi*>sHn%m^W~rRwuv^`*1~)C0KD@?LKyF^~R+ohxZgz1s8C6lFL9niWcf>|F zCn`m}t&%RqsLBHl&0ur2u)15O#qscPrO{WXIew7EDWNZwi7~E=m@?JN#6(ATahS~M z4y!blhHyh>AE#6@#j|;=@>EH%y4c!MdrX-cghD;0gVU18zOu(#Trshx_O#hK1h$pH z@W#9qnl~oJK?7~pK~lZJ*vU)s5(3%KlR2s?{r3tzoKGt8Ue5-uHS%ob+w( z9Z@srP1RK{+00GE5yy@=S^F1LMV2^O9?R;~nnah2Cw9wKRSpOlBFCFEbk_y3>q#!G8Fw;OUP zig{ofSFzC(9!z$*-MHmuYdHL6{8vfJ5Mr^(P5T+qO41;EUEW-q*|}ZXwCn72o z{tL_{@17X3P`cUaeQ-CTvM0zM(%E6#=i^1r>NW?O5^uJr^K{_xnP735{rzAu0$tFo z^6K10avBu{y-Z2UCK*eNgeLAOJk{c@8JpMu+KA`?Qb=d-D_5h6`5w-Wutj>S%#X-Y zz|DJs%Vc8&UfHCHE?=AZ5tG8hxsiEG?1;)=on8d>;Xhe0e_&SjY#_V$@WP1V*_v8X z%yzR;snc70N7M@~{%4;B-``%@+s13JQIWBXf!4}02cTuw_;fW4kLpjb2nqF%Jx! z`|j+HC>E2YiNlU#8Y|lIN<=eXrz;UXE9Oi#$60x?X3P2ComXa!eB8B}Go*>d8E@td zI?z&q=PlYPuZ)yt%UEZ((s7vaHf=SvFjCoRJ%g zcz>85nY(t-7BIQWIpUmFXT}l(pL-qePDaZ}H#jY06%KNXk?rI54tOUrf0f{9c3vPn z*-ER@`9LgNg2l7*)|q5ZaQH4vk37^ce^W{^`>W+S=&#=GTYfBZP`2E!Nm+E>Y~xmx zU^eygcB9?tQ+?a&0dTk+mz;=?sJAMrPPue6RT=sSElGIvZ_d*EH#|1#iz z$A%A(JnxNHVheB9i^HSZ`(nbQhM7EO1>?qHGJ?3hnNt3FI|N?2-NWT( z7z7qT;`%4Q+hR9v8^*R`Bk&>*@;ZA>sh4F;ryjPF%i*Hi@-XAwjSn-jv!A_%8|%$Z zR1&BAN;>tU^w2b0?vr0wvt>Q`7cRR~Kpy)$_+`gP< zld<+@*;4^}Qjq^9irceYCZx>r2|~&>$40j`Zc>&M+4tvGdBz0rFeYYyJ# zo5`cWCEVzf(^|=RpbMOQz?Hq@-90_BP*ML!C0z{6?7_fd#Ck7xifR+t%y_py(J88g zw{GXCTsh*M8SC8E_`u73#m-U3!)crM#m-SBqUDJ}^@$d%_t@@;Qoe_sqppWm3%&yw zw+E+%$8o&XxM#XjoziQ0hOn@Fzl1gOUG5sSCc0P$i(NWyEP%1`Wifb2re$n!yL^)e zM70QuX{N9LY(l$yc(UoIfV7ad`m*9RU5@g97T~iEJM*un^Ya_)*?Ww90+AaFo0z@# z*Q!WB#wuq*nsF`4_OKe;pIyldHuP} znJOpqNyFmw<+Vj!3$5HqHauHaHu%5T@9?s*nP}b0M=4Q}Rb<2YKP?DJ|Gk5qs<*}A z{#_hrmOH7H+o8AG(#U-IjjheqpK48r4e117xkA0wTv6qGWnEF9W%Hf!M0E=-VQlBW zy_6W8@PClty{pWasChNKxso$QdG~FJ$`k7Lo!k<&EG9qCI%ADf9Z7t6phtFI8NJ7M zN5q82`i6WH6}2qXxo#KW><3!S@l0bt1EAw d+8lZBEEx1&`L_lcZ=G3#tiB(YXG$*r{{YyxK??u? delta 101910 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 Hd%phxaU%(k diff --git a/resources/localization/ca/PrusaSlicer_ca.po b/resources/localization/ca/PrusaSlicer_ca.po index b4f99487b7..39fe9b44b7 100644 --- a/resources/localization/ca/PrusaSlicer_ca.po +++ b/resources/localization/ca/PrusaSlicer_ca.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-02-09 09:04+0100\n" -"PO-Revision-Date: 2021-12-16 18:50+0100\n" +"PO-Revision-Date: 2022-03-04 17:01+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: ca\n" @@ -90,7 +90,7 @@ msgstr "" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 #, boost-format msgid "PrusaSlicer has encountered a fatal error: \"%1%\"" -msgstr "" +msgstr "PrusaSlicer ha trobat un error crític: \"%1%\"" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 msgid "" @@ -1887,7 +1887,7 @@ msgstr "Imatge del firmware:" #: src/slic3r/GUI/FirmwareDialog.cpp:813 msgid "Select a file" -msgstr "" +msgstr "Seleccioneu un fitxer" #: src/slic3r/GUI/FirmwareDialog.cpp:815 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:297 @@ -3495,11 +3495,11 @@ msgstr "Preparant pestanyes de configuració" #: src/slic3r/GUI/GUI_App.cpp:1334 src/slic3r/GUI/Preferences.cpp:287 msgid "Restore window position on start" -msgstr "" +msgstr "Restaura la posició de la finestra a l'inici" #: src/slic3r/GUI/GUI_App.cpp:1336 msgid "PrusaSlicer started after a crash" -msgstr "" +msgstr "PrusaSlicer s'ha reiniciat després d'una fallada" #: src/slic3r/GUI/GUI_App.cpp:1337 #, boost-format @@ -3513,16 +3513,27 @@ msgid "" "To avoid this problem, consider disabling \"%4%\" in \"Preferences\". " "Otherwise, the application will most likely crash again next time." msgstr "" +"PrusaSlicer va crashejar la darrera vegada en intentar establir la posició " +"de la finestra.\n" +"Lamentem les molèsties, malauradament passa amb certes configuracions de " +"monitor múltiple.\n" +"El motiu més precís de l'accident: \"%1%\".\n" +"Per obtenir més informació, consulteu el nostre rastrejador d'incidències de " +"GitHub: \"%2%\" i \"%3%\"\n" +"\n" +"Per evitar aquest problema, considereu desactivar \"%4%\" a \"Preferències" +"\". En cas contrari, és probable que l'aplicació es torni a crashejar la " +"propera vegada." #: src/slic3r/GUI/GUI_App.cpp:1349 #, boost-format msgid "Disable \"%1%\"" -msgstr "" +msgstr "Deshabilitar \"%1%\"" #: src/slic3r/GUI/GUI_App.cpp:1350 #, boost-format msgid "Leave \"%1%\" enabled" -msgstr "" +msgstr "Deixa \"%1%\" habilitat" #: src/slic3r/GUI/GUI_App.cpp:1677 msgid "" @@ -3805,6 +3816,7 @@ msgstr "PrusaSlicer recordarà la vostra elecció." #: src/slic3r/GUI/GUI_App.cpp:3101 msgid "You will not be asked about it again on hyperlinks hovering." msgstr "" +"No se us tornarà a preguntar al respecte quan passis per sobre de l'enllaç." #: src/slic3r/GUI/GUI_App.cpp:3102 src/slic3r/GUI/Plater.cpp:1738 #, boost-format @@ -5008,15 +5020,16 @@ msgstr "S'ha produït un error inesperat" #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:21 msgid "Best surface quality" -msgstr "" +msgstr "Màxima qualitat de superfície" #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:23 msgid "Optimize object rotation for best surface quality." msgstr "" +"Optimitzar la rotació de l'objecte per a la màxima qualitat de superfície." #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:24 msgid "Reduced overhang slopes" -msgstr "" +msgstr "Pendents de voladís reduïts" #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:26 msgid "" @@ -5025,14 +5038,20 @@ msgid "" "Note that this method will try to find the best surface of the object for " "touching the print bed if no elevation is set." msgstr "" +"Optimitza la rotació d'objectes per tenir una quantitat mínima de voladissos " +"que necessiten estructures de suport.\n" +"Tingueu en compte que aquest mètode intentarà trobar la millor superfície de " +"l'objecte per tocar el llit d'impressió si no s'estableix cap elevació." #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:30 msgid "Lowest Z height" -msgstr "" +msgstr "Mínima alçada Z" #: src/slic3r/GUI/Jobs/RotoptimizeJob.hpp:32 msgid "Rotate the model to have the lowest z height for faster print time." msgstr "" +"Rota el model per tenir l'alçada z més baixa i un temps d'impressió més " +"ràpid." #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:59 msgid "Searching for optimal orientation" @@ -6985,7 +7004,7 @@ msgstr "Voleu desar els canvis a \"%1%\"?" #: src/slic3r/GUI/Plater.cpp:1732 src/slic3r/GUI/Preferences.cpp:222 msgid "Ask for unsaved changes in project" -msgstr "" +msgstr "Preguntar pels canvis no desats al projecte" #: src/slic3r/GUI/Plater.cpp:1735 msgid "" @@ -6993,6 +7012,9 @@ msgid "" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" +"No et preguntarà pels canvis no guardats la propera vegada que: \n" +"- Tanquis PrusaSlicer,\n" +"- Carreguis o creis un nou projecte" #: src/slic3r/GUI/Plater.cpp:2197 #, c-format, boost-format @@ -7622,6 +7644,9 @@ msgid "" "- Closing PrusaSlicer,\n" "- Loading or creating a new project" msgstr "" +"Sol·licita sempre canvis no desats en el projecte, quan: \n" +"- Tancament PrusaSlicer,\n" +"- Càrrega o creació d'un nou projecte" #: src/slic3r/GUI/Preferences.cpp:233 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:897 @@ -7629,6 +7654,8 @@ msgid "" "Ask to save unsaved changes in presets when closing the application or when " "loading a new project" msgstr "" +"Demana desar els canvis no desats en els predefinits en tancar l'aplicació o " +"en carregar un projecte nou" #: src/slic3r/GUI/Preferences.cpp:235 msgid "" @@ -7636,6 +7663,9 @@ msgid "" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" +"Preguntar sempre pels canvis no guardats en els predefinits, quan:\n" +"- En tancar PrusaSlicer mentre es modifiquen alguns ajustaments,\n" +"- En carregar un nou projecte mentre es modifiquen alguns ajustaments" #: src/slic3r/GUI/Preferences.cpp:242 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:896 @@ -7647,15 +7677,20 @@ msgid "" "Always ask for unsaved changes in presets when selecting new preset or " "resetting a preset" msgstr "" +"Preguntar sempre pels canvis no guardats en predefinits en seleccionar un " +"nou ajustament o en restablir un ajustament" #: src/slic3r/GUI/Preferences.cpp:249 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:895 msgid "Ask for unsaved changes in presets when creating new project" msgstr "" +"Preguntar pels canvis no desats en predefinits en crear un nou projecte" #: src/slic3r/GUI/Preferences.cpp:251 msgid "Always ask for unsaved changes in presets when creating new project" msgstr "" +"Preguntar sempre pels canvis no guardats en predefinits en crear un nou " +"projecte" #: src/slic3r/GUI/Preferences.cpp:258 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" @@ -7688,6 +7723,7 @@ msgstr "Mostra la pantalla de presentació" #: src/slic3r/GUI/Preferences.cpp:289 msgid "If enabled, PrusaSlicer will be open at the position it was closed" msgstr "" +"Si està habilitat, PrusaSlicer s'obrirà en la posició en què s'ha tancat" #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -7779,7 +7815,7 @@ msgstr "" #: src/slic3r/GUI/Preferences.cpp:384 msgid "If enabled, PrusaSlicer will not open hyperlinks in your browser." -msgstr "" +msgstr "Si està habilitat, PrusaSlicer no obrirà hipervincles al navegador." #: src/slic3r/GUI/Preferences.cpp:391 msgid "Use colors for axes values in Manipulation panel" @@ -9224,19 +9260,19 @@ msgstr "Ajust" #: src/slic3r/GUI/Tab.cpp:3938 msgid "Find" -msgstr "Cerca" +msgstr "Cercar" #: src/slic3r/GUI/Tab.cpp:3939 msgid "Replace with" -msgstr "" +msgstr "Substitueix-ho per" #: src/slic3r/GUI/Tab.cpp:4028 msgid "Regular expression" -msgstr "" +msgstr "Expressió normal" #: src/slic3r/GUI/Tab.cpp:4032 msgid "Case insensitive" -msgstr "" +msgstr "No distingeix minúscules/majúscules" #: src/slic3r/GUI/Tab.cpp:4036 msgid "Whole word" @@ -9244,11 +9280,11 @@ msgstr "Paraula sencera" #: src/slic3r/GUI/Tab.cpp:4040 msgid "Match single line" -msgstr "" +msgstr "Coincideix amb una sola línia" #: src/slic3r/GUI/Tab.cpp:4143 msgid "Are you sure you want to delete all substitutions?" -msgstr "" +msgstr "Esteu segur que voleu suprimir totes les substitucions?" #: src/slic3r/GUI/Tab.cpp:4275 msgid "" @@ -9512,12 +9548,16 @@ msgid "" "You will not be asked about the unsaved changes in presets the next time you " "create new project" msgstr "" +"No et preguntarà pels canvis no guardats en predefinits la propera vegada " +"que creis un nou projecte" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:899 msgid "" "You will not be asked about the unsaved changes in presets the next time you " "switch a preset" msgstr "" +"No et preguntarà pels canvis no guardats en predefinits la propera vegada " +"que canvíis d'ajust" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:900 msgid "" @@ -9526,6 +9566,10 @@ msgid "" "- Closing PrusaSlicer while some presets are modified,\n" "- Loading a new project while some presets are modified" msgstr "" +"Preguntar sempre pels canvis no guardats en predefinits la propera vegada " +"que::\n" +"- Tanquis PrusaSlicer mentre es modifiquen alguns ajustaments,\n" +"- Carreguis un nou projecte mentre es modifiquen alguns ajustaments" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:903 msgid "PrusaSlicer will remember your action." @@ -9617,7 +9661,7 @@ msgstr "Comptador d'extrusors" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1454 msgid "Select presets to compare" -msgstr "" +msgstr "Seleccioneu els predefinits per comparar" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1503 msgid "Show all presets (including incompatible)" @@ -10245,24 +10289,26 @@ msgstr "" #: src/slic3r/Config/Snapshot.cpp:584 msgid "Taking a configuration snapshot failed." -msgstr "" +msgstr "No s'ha pogut prendre una instantània de configuració." #: src/slic3r/Config/Snapshot.cpp:598 msgid "" "PrusaSlicer has encountered an error while taking a configuration snapshot." msgstr "" +"El PrusaSlicer ha trobat un error mentre feia una instantània de " +"configuració." #: src/slic3r/Config/Snapshot.cpp:599 msgid "PrusaSlicer error" -msgstr "" +msgstr "Error de PrusaSlicer" #: src/slic3r/Config/Snapshot.cpp:601 msgid "Continue" -msgstr "" +msgstr "Continuar" #: src/slic3r/Config/Snapshot.cpp:601 msgid "Abort" -msgstr "" +msgstr "Avortar" #: src/libslic3r/GCode.cpp:539 msgid "There is an object with no extrusions in the first layer." @@ -10313,7 +10359,7 @@ msgstr "" #: src/libslic3r/GCode.cpp:1236 src/libslic3r/GCode.cpp:1247 msgid "No extrusions were generated for objects." -msgstr "" +msgstr "No s'han generat extrusions per als objectes." #: src/libslic3r/GCode.cpp:1445 msgid "" @@ -10706,18 +10752,25 @@ msgid "" "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" +"L'adreçament relatiu de l'extrusor requereix restablir la posició de " +"l'extrusor a cada capa per evitar la pèrdua de precisió de coma flotant. " +"Afegiu \"G92 E0\" a layer_gcode." #: src/libslic3r/Print.cpp:665 msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" +"\"G92 E0\" s'ha trobat a before_layer_gcode, el qual és incompatible amb " +"l'adreçament absolut d'extrusor." #: src/libslic3r/Print.cpp:667 msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" +"\"G92 E0\" s'ha trobat a layer_gcode, el qual és incompatible amb " +"l'adreçament absolut d'extrusor." #: src/libslic3r/Print.cpp:809 msgid "Infilling layers" @@ -12309,11 +12362,11 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1361 msgid "G-code substitutions" -msgstr "" +msgstr "Substitucions de codi G" #: src/libslic3r/PrintConfig.cpp:1362 msgid "Find / replace patterns in G-code lines and substitute them." -msgstr "" +msgstr "Cerca / substitueix patrons en línies de codi G i els substitueix." #: src/libslic3r/PrintConfig.cpp:1367 msgid "High extruder current on filament swap" @@ -15587,7 +15640,7 @@ msgid "" "theVariable layer height tool. (Not available for SLA printers.)" msgstr "" "Alçada de capa variable\n" -"Sabies que pot imprimir diferents regions del teu model amb una alçada de " +"Sabies que pots imprimir diferents regions del teu model amb una alçada de " "capa diferent i suavitzar les transicions entre elles? Proveu " "l'einaAlçada de capa variable. (No disponible per a impressores SLA.)" @@ -15624,7 +15677,7 @@ msgid "" "threshold area. (Expert mode only.)" msgstr "" "Àrea llindar de farciment sòlid\n" -"Sabies que pot fer que les parts del seu model amb una secció transversal " +"Sabies que pots fer que les parts del teu model amb una secció transversal " "petita s'emplenin amb farciment sòlid automàticament? Ajusta elÀrea " "llindar de farciment sòlid. (Només en mode Expert.)" @@ -15837,13 +15890,44 @@ msgstr "" "Sabies que pots posar el PrusaSlicer en mode de pantalla completa? Utilitzeu " "la tecla d'accés ràpid F11." -#: ../src/common/debugrpt.cpp:586 -msgid "" -"\n" -"Please send this report to the program maintainer, thank you!\n" -msgstr "" -"\n" -"Envieu aquest informe al mantenidor del programa. Gràcies!\n" +#~ msgid "" +#~ "If enabled, the descriptions of configuration parameters in settings tabs " +#~ "wouldn't work as hyperlinks. If disabled, the descriptions of " +#~ "configuration parameters in settings tabs will work as hyperlinks." +#~ msgstr "" +#~ "Si està habilitat, les descripcions dels paràmetres de configuració a les " +#~ "pestanyes de configuració no funcionaran com a hiperenllaços. Si està " +#~ "deshabilitat, les descripcions dels paràmetres de configuració a les " +#~ "pestanyes de configuració funcionaran com a hiperenllaços." + +#, c-format, boost-format +#~ msgid "" +#~ "PrusaSlicer detected another configuration folder at %s.\n" +#~ "Its version is %s.\n" +#~ "Last version you used in current configuration folder is %s.\n" +#~ "Please note that PrusaSlicer uses different folders to save configuration " +#~ "of alpha, beta and full release versions.\n" +#~ "Would you like to copy found configuration to your current configuration " +#~ "folder?\n" +#~ "\n" +#~ "If you select yes, PrusaSlicer will copy all profiles and other files " +#~ "from found folder to the current one. Overwriting any existing file with " +#~ "matching name.\n" +#~ "If you select no, you will continue with current configuration." +#~ msgstr "" +#~ "PrusaSlicer ha detectat una altra carpeta de configuració a %s.\n" +#~ "La vostra versió és %s.\n" +#~ "La darrera versió que heu utilitzat a la carpeta de configuració actual " +#~ "és %s.\n" +#~ "Si us plau, tingueu en compte que PrusaSlicer utilitza diferents carpetes " +#~ "per desar la configuració de les versions alfa, beta i final.\n" +#~ "Voleu copiar la configuració trobada a la vostra carpeta de configuració " +#~ "actual?\n" +#~ "\n" +#~ "Si seleccioneu sí, PrusaSlicer copiarà tots els perfils i altres fitxers " +#~ "de la carpeta trobada a l'actual, sobreescrivint qualsevol fitxer " +#~ "existent amb el mateix nom.\n" +#~ "Si seleccioneu no, continuareu amb la configuració actual." #: ../src/richtext/richtextstyledlg.cpp:210 #: ../src/richtext/richtextstyledlg.cpp:222 From 66fa2b1e2685b9b01232b89488a97d6d413ea240 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 10:57:43 +0100 Subject: [PATCH 082/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: mm_contour --- resources/shaders/mm_contour_attr.fs | 18 +++++++++++ resources/shaders/mm_contour_attr.vs | 16 ++++++++++ src/slic3r/GUI/GLShadersManager.cpp | 4 +++ .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 14 +++++++- .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 4 +++ src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 32 +++++++++++++++++-- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 9 ++++++ src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 21 ++++++++++-- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 21 +++++++++--- 9 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 resources/shaders/mm_contour_attr.fs create mode 100644 resources/shaders/mm_contour_attr.vs diff --git a/resources/shaders/mm_contour_attr.fs b/resources/shaders/mm_contour_attr.fs new file mode 100644 index 0000000000..a8f0a05549 --- /dev/null +++ b/resources/shaders/mm_contour_attr.fs @@ -0,0 +1,18 @@ +#version 110 + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +uniform vec4 uniform_color; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +const float EPSILON = 0.0001; + +void main() +{ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gl_FragColor = uniform_color; +// gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + // Values inside depth buffer for fragments of the contour of a selected area are offset + // by small epsilon to solve z-fighting between painted triangles and contour lines. + gl_FragDepth = gl_FragCoord.z - EPSILON; +} diff --git a/resources/shaders/mm_contour_attr.vs b/resources/shaders/mm_contour_attr.vs new file mode 100644 index 0000000000..871fbb14b0 --- /dev/null +++ b/resources/shaders/mm_contour_attr.vs @@ -0,0 +1,16 @@ +#version 110 + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +attribute vec3 v_position; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +void main() +{ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +// gl_Position = ftransform(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +} diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 091e59818b..c565957a90 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -98,7 +98,11 @@ std::pair GLShadersManager::init() // used to render variable layers heights in 3d editor valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("mm_contour_attr", { "mm_contour_attr.vs", "mm_contour_attr.fs" }); +#else valid &= append_shader("mm_contour", { "mm_contour.vs", "mm_contour.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // Used to render painted triangles inside the multi-material gizmo. Triangle normals are computed inside fragment shader. // For Apple's on Arm CPU computed triangle normals inside fragment shader using dFdx and dFdy has the opposite direction. // Because of this, objects had darker colors inside the multi-material gizmo. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 24e90fceb1..ec5eb94e57 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -188,7 +188,7 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const const Transform3d trafo_matrix = mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() * mv->get_matrix(); - bool is_left_handed = trafo_matrix.matrix().determinant() < 0.; + const bool is_left_handed = trafo_matrix.matrix().determinant() < 0.0; if (is_left_handed) glsafe(::glFrontFace(GL_CW)); @@ -197,7 +197,11 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const shader->set_uniform("volume_world_matrix", trafo_matrix); shader->set_uniform("volume_mirrored", is_left_handed); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); +#else m_triangle_selectors[mesh_id]->render(m_imgui); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); if (is_left_handed) @@ -568,7 +572,11 @@ ColorRGBA GLGizmoMmuSegmentation::get_cursor_sphere_right_button_color() const return color; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void TriangleSelectorMmGui::render(ImGuiWrapper* imgui, const Transform3d& matrix) +#else void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { if (m_update_render_data) update_render_data(); @@ -589,7 +597,11 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) } #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_paint_contour(matrix); +#else render_paint_contour(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else if (m_paint_contour.has_VBO()) { ScopeGuard guard_mm_gouraud([shader]() { shader->start_using(); }); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 6f357bb6f1..21835f902f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -66,9 +66,13 @@ public: : TriangleSelectorGUI(mesh), m_colors(colors), m_default_volume_color(default_volume_color), m_gizmo_scene(2 * (colors.size() + 1)) {} ~TriangleSelectorMmGui() override = default; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render(ImGuiWrapper* imgui, const Transform3d& matrix) override; +#else // Render current selection. Transformation matrices are supposed // to be already set. void render(ImGuiWrapper* imgui) override; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES private: void update_render_data(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 7910c6eb1d..a9e869601b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -126,11 +126,13 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const // wrong transformation matrix is used for "Clipping of view". shader->set_uniform("volume_world_matrix", trafo_matrix); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); +#else m_triangle_selectors[mesh_id]->render(m_imgui); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -908,7 +910,11 @@ ColorRGBA TriangleSelectorGUI::get_seed_fill_color(const ColorRGBA& base_color) return saturate(base_color, 0.75f); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void TriangleSelectorGUI::render(ImGuiWrapper* imgui, const Transform3d& matrix) +#else void TriangleSelectorGUI::render(ImGuiWrapper* imgui) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { static const ColorRGBA enforcers_color = { 0.47f, 0.47f, 1.0f, 1.0f }; static const ColorRGBA blockers_color = { 1.0f, 0.44f, 0.44f, 1.0f }; @@ -963,7 +969,11 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_paint_contour(matrix); +#else render_paint_contour(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else if (m_paint_contour.has_VBO()) { ScopeGuard guard_gouraud([shader]() { shader->start_using(); }); @@ -1340,6 +1350,10 @@ void TriangleSelectorGUI::update_paint_contour() init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(2 * contour_edges.size()) }; init_data.reserve_vertices(2 * contour_edges.size()); init_data.reserve_indices(2 * contour_edges.size()); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + init_data.color = ColorRGBA::WHITE(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +// // vertices + indices unsigned int vertices_count = 0; for (const Vec2i& edge : contour_edges) { @@ -1356,16 +1370,30 @@ void TriangleSelectorGUI::update_paint_contour() m_paint_contour.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void TriangleSelectorGUI::render_paint_contour(const Transform3d& matrix) +#else void TriangleSelectorGUI::render_paint_contour() +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { auto* curr_shader = wxGetApp().get_current_shader(); if (curr_shader != nullptr) curr_shader->stop_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); +#else auto* contour_shader = wxGetApp().get_shader("mm_contour"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (contour_shader != nullptr) { contour_shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); + contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glsafe(::glDepthFunc(GL_LEQUAL)); m_paint_contour.render(); glsafe(::glDepthFunc(GL_LESS)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 7949e26572..e3b5d0ea72 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -77,10 +77,15 @@ public: : TriangleSelector(mesh) {} virtual ~TriangleSelectorGUI() = default; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + virtual void render(ImGuiWrapper* imgui, const Transform3d& matrix); + void render(const Transform3d& matrix) { this->render(nullptr, matrix); } +#else // Render current selection. Transformation matrices are supposed // to be already set. virtual void render(ImGuiWrapper *imgui); void render() { this->render(nullptr); } +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void request_update_render_data() { m_update_render_data = true; } @@ -117,7 +122,11 @@ protected: GLModel m_paint_contour; void update_paint_contour(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_paint_contour(const Transform3d& matrix); +#else void render_paint_contour(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLPaintContour m_paint_contour; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index e67a9b7a7f..252f5a1859 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -737,12 +737,12 @@ void GLGizmoSimplify::on_render() GLModel &glmodel = it->second; const Transform3d trafo_matrix = selected_volume->world_matrix(); - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo_matrix.data())); - #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES auto* gouraud_shader = wxGetApp().get_shader("gouraud_light_attr"); #else + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(trafo_matrix.data())); + auto *gouraud_shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_DEPTH_TEST)); @@ -759,16 +759,31 @@ void GLGizmoSimplify::on_render() gouraud_shader->stop_using(); if (m_show_wireframe) { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); +#else auto *contour_shader = wxGetApp().get_shader("mm_contour"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES contour_shader->start_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + contour_shader->set_uniform("view_model_matrix", view_model_matrix); + contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const ColorRGBA color = glmodel.get_color(); + glmodel.set_color(ColorRGBA::WHITE()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.0f)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); glmodel.render(); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glmodel.set_color(color); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES contour_shader->stop_using(); } glsafe(::glPopAttrib()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index 1e49ebc8c3..705b541ad6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -209,10 +209,13 @@ void InstancesHider::render_cut() const ClippingPlane clp = *get_pool()->object_clipper()->get_clipping_plane(); clp.set_normal(-clp.get_normal()); clipper->set_limiting_plane(clp); - } else + } + else clipper->set_limiting_plane(ClippingPlane::ClipsNothing()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL if (mv->is_model_part()) glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); @@ -229,7 +232,9 @@ void InstancesHider::render_cut() const clipper->render_cut(); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL glsafe(::glPopAttrib()); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ++clipper_id; } @@ -410,11 +415,11 @@ void ObjectClipper::render_cut() const return; const SelectionInfo* sel_info = get_pool()->selection_info(); const ModelObject* mo = sel_info->model_object(); - Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); + const Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); size_t clipper_id = 0; for (const ModelVolume* mv : mo->volumes) { - Geometry::Transformation vol_trafo = mv->get_transformation(); + const Geometry::Transformation vol_trafo = mv->get_transformation(); Geometry::Transformation trafo = inst_trafo * vol_trafo; trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); @@ -422,14 +427,18 @@ void ObjectClipper::render_cut() const clipper->set_plane(*m_clp); clipper->set_transformation(trafo); clipper->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL clipper->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); clipper->render_cut(); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES ++clipper_id; } @@ -520,7 +529,7 @@ void SupportsClipper::render_cut() const const SelectionInfo* sel_info = get_pool()->selection_info(); const ModelObject* mo = sel_info->model_object(); - Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); + const Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); //Geometry::Transformation vol_trafo = mo->volumes.front()->get_transformation(); Geometry::Transformation trafo = inst_trafo;// * vol_trafo; trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); @@ -539,14 +548,18 @@ void SupportsClipper::render_cut() const m_clipper->set_plane(*ocl->get_clipping_plane()); m_clipper->set_transformation(supports_trafo); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL m_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.f, 0.37f)); m_clipper->render_cut(); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } From 3e47253725bb8293c06f23733a61b3580e557199 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 10:59:12 +0100 Subject: [PATCH 083/149] Follow-up of 66fa2b1e2685b9b01232b89488a97d6d413ea240 - Cleanup --- resources/shaders/mm_contour_attr.fs | 9 ++------- resources/shaders/mm_contour_attr.vs | 5 ----- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/resources/shaders/mm_contour_attr.fs b/resources/shaders/mm_contour_attr.fs index a8f0a05549..14477a59e6 100644 --- a/resources/shaders/mm_contour_attr.fs +++ b/resources/shaders/mm_contour_attr.fs @@ -1,17 +1,12 @@ #version 110 -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -uniform vec4 uniform_color; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - const float EPSILON = 0.0001; +uniform vec4 uniform_color; + void main() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ gl_FragColor = uniform_color; -// gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Values inside depth buffer for fragments of the contour of a selected area are offset // by small epsilon to solve z-fighting between painted triangles and contour lines. gl_FragDepth = gl_FragCoord.z - EPSILON; diff --git a/resources/shaders/mm_contour_attr.vs b/resources/shaders/mm_contour_attr.vs index 871fbb14b0..370eedb72d 100644 --- a/resources/shaders/mm_contour_attr.vs +++ b/resources/shaders/mm_contour_attr.vs @@ -1,16 +1,11 @@ #version 110 -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ attribute vec3 v_position; uniform mat4 view_model_matrix; uniform mat4 projection_matrix; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void main() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); -// gl_Position = ftransform(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } From dbdc272c4e4de52bb6a86946dfc85e47e29951c8 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 11:17:34 +0100 Subject: [PATCH 084/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: mm_gouraud --- resources/shaders/mm_gouraud_attr.fs | 63 +++++++++++++++++++ resources/shaders/mm_gouraud_attr.vs | 28 +++++++++ src/slic3r/GUI/GLShadersManager.cpp | 7 +++ .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 18 ++++++ 4 files changed, 116 insertions(+) create mode 100644 resources/shaders/mm_gouraud_attr.fs create mode 100644 resources/shaders/mm_gouraud_attr.vs diff --git a/resources/shaders/mm_gouraud_attr.fs b/resources/shaders/mm_gouraud_attr.fs new file mode 100644 index 0000000000..78181e1d7e --- /dev/null +++ b/resources/shaders/mm_gouraud_attr.fs @@ -0,0 +1,63 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 normal_matrix; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(normal_matrix * triangle_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/mm_gouraud_attr.vs b/resources/shaders/mm_gouraud_attr.vs new file mode 100644 index 0000000000..76101b7670 --- /dev/null +++ b/resources/shaders/mm_gouraud_attr.vs @@ -0,0 +1,28 @@ +#version 110 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +attribute vec3 v_position; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +uniform mat4 volume_world_matrix; +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + model_pos = vec4(v_position, 1.0); + // Point in homogenous coordinates. + vec4 world_pos = volume_world_matrix * model_pos; + + gl_Position = projection_matrix * view_model_matrix * model_pos; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index c565957a90..6dfc9f9366 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -109,10 +109,17 @@ std::pair GLShadersManager::init() // Based on https://stackoverflow.com/a/66206648, the similar behavior was also spotted on some other devices with Arm CPU. // Since macOS 12 (Monterey), this issue with the opposite direction on Apple's Arm CPU seems to be fixed, and computed // triangle normals inside fragment shader have the right direction. +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) + valid &= append_shader("mm_gouraud_attr", { "mm_gouraud_attr.vs", "mm_gouraud_attr.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); + else + valid &= append_shader("mm_gouraud_attr", { "mm_gouraud_attr.vs", "mm_gouraud_attr.fs" }); +#else if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}, {"FLIP_TRIANGLE_NORMALS"sv}); else valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES return { valid, error }; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index ec5eb94e57..abff4248c1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -170,7 +170,11 @@ void GLGizmoMmuSegmentation::data_changed() void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const { ClippingPlaneDataWrapper clp_data = this->get_clipping_plane_data(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + auto* shader = wxGetApp().get_shader("mm_gouraud_attr"); +#else auto *shader = wxGetApp().get_shader("mm_gouraud"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!shader) return; shader->start_using(); @@ -192,8 +196,16 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; + shader->set_uniform("view_model_matrix", matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader->set_uniform("volume_world_matrix", trafo_matrix); shader->set_uniform("volume_mirrored", is_left_handed); @@ -203,7 +215,9 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const m_triangle_selectors[mesh_id]->render(m_imgui); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -584,7 +598,11 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) auto *shader = wxGetApp().get_current_shader(); if (!shader) return; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + assert(shader->get_name() == "mm_gouraud_attr"); +#else assert(shader->get_name() == "mm_gouraud"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) if (m_gizmo_scene.has_VBOs(color_idx)) { From 65b5af9561a94d47fb9937b7a0268dcafc6e5217 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 12:48:21 +0100 Subject: [PATCH 085/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Shader: variable_layer_height --- .../shaders/variable_layer_height_attr.vs | 60 ++++++++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 71 +++++++++++++++++-- src/slic3r/GUI/GLCanvas3D.hpp | 11 ++- src/slic3r/GUI/GLShadersManager.cpp | 4 ++ 4 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 resources/shaders/variable_layer_height_attr.vs diff --git a/resources/shaders/variable_layer_height_attr.vs b/resources/shaders/variable_layer_height_attr.vs new file mode 100644 index 0000000000..40609bd0d9 --- /dev/null +++ b/resources/shaders/variable_layer_height_attr.vs @@ -0,0 +1,60 @@ +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular) + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a056dc1bd9..ac0e1734aa 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -263,28 +263,29 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) GLCanvas3D::LayersEditing::s_overlay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; imgui.end(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + render_active_object_annotations(canvas); + render_profile(canvas); +#else const Rect& bar_rect = get_bar_rect_viewport(canvas); #if ENABLE_GLBEGIN_GLEND_REMOVAL m_profile.dirty = m_profile.old_bar_rect != bar_rect; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL render_active_object_annotations(canvas, bar_rect); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - render_profile(canvas); -#else render_profile(bar_rect); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLBEGIN_GLEND_REMOVAL m_profile.old_bar_rect = bar_rect; m_profile.dirty = false; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) { const Vec2d mouse_pos = canvas.get_local_mouse_position(); const Rect& rect = get_bar_rect_screen(canvas); - float x = (float)mouse_pos(0); - float y = (float)mouse_pos(1); + float x = (float)mouse_pos.x(); + float y = (float)mouse_pos.y(); float t = rect.get_top(); float b = rect.get_bottom(); @@ -310,6 +311,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) return { w - thickness_bar_width(canvas), 0.0f, w, h }; } +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) { const Size& cnv_size = canvas.get_canvas_size(); @@ -318,6 +320,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); return { (half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom }; } +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bool GLCanvas3D::LayersEditing::is_initialized() const { @@ -350,9 +353,25 @@ std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) con return ret; } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas) +#else void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Size cnv_size = canvas.get_canvas_size(); + const float cnv_width = (float)cnv_size.get_width(); + const float cnv_height = (float)cnv_size.get_height(); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + const float cnv_inv_width = 1.0f / cnv_width; + + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -363,13 +382,23 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 shader->set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas)); shader->set_uniform("z_cursor_band_width", band_width); shader->set_uniform("object_max_z", m_object_max_z); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); + shader->set_uniform("normal_matrix", (Matrix3d)Eigen::Matrix3d::Identity()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); // Render the color bar #if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_profile.background.is_initialized() || m_profile.old_canvas_width != cnv_width) { + m_profile.old_canvas_width = cnv_width; +#else if (!m_profile.background.is_initialized() || m_profile.dirty) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.background.reset(); GLModel::Geometry init_data; @@ -378,10 +407,17 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 init_data.reserve_indices(6); // vertices +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const float l = 1.0f - 2.0f * THICKNESS_BAR_WIDTH * cnv_inv_width; + const float r = 1.0f; + const float t = 1.0f; + const float b = -1.0f; +#else const float l = bar_rect.get_left(); const float r = bar_rect.get_right(); const float t = bar_rect.get_top(); const float b = bar_rect.get_bottom(); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(l, b), Vec2f(0.0f, 0.0f)); init_data.add_vertex(Vec2f(r, b), Vec2f(1.0f, 0.0f)); init_data.add_vertex(Vec2f(r, t), Vec2f(1.0f, 1.0f)); @@ -447,7 +483,11 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) #if ENABLE_GLBEGIN_GLEND_REMOVAL // Baseline +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_profile.baseline.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { +#else if (!m_profile.baseline.is_initialized() || m_profile.dirty) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.baseline.reset(); GLModel::Geometry init_data; @@ -473,7 +513,11 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.baseline.init_from(std::move(init_data)); } +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (!m_profile.profile.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { +#else if (!m_profile.profile.is_initialized() || m_profile.dirty || m_profile.old_layer_height_profile != m_layer_height_profile) { +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.old_layer_height_profile = m_layer_height_profile; m_profile.profile.reset(); @@ -545,7 +589,11 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G if (current_shader != nullptr) current_shader->stop_using(); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); +#else GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -559,6 +607,11 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G shader->set_uniform("z_cursor", float(m_object_max_z) * float(this->get_cursor_z_relative(canvas))); shader->set_uniform("z_cursor_band_width", float(this->band_width)); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + // Initialize the layer height texture mapping. const GLsizei w = (GLsizei)m_layers_texture.width; const GLsizei h = (GLsizei)m_layers_texture.height; @@ -577,6 +630,12 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G shader->set_uniform("volume_world_matrix", glvolume->world_matrix()); shader->set_uniform("object_max_z", 0.0f); +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + const Transform3d view_model_matrix = camera.get_view_matrix() * glvolume->world_matrix(); + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + glvolume->render(); } // Revert back to the previous shader. diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a1dd213162..bafcfa9ba0 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -245,9 +245,15 @@ class GLCanvas3D GLModel baseline; GLModel profile; GLModel background; +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + float old_canvas_width{ 0.0f }; +#else Rect old_bar_rect; +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES std::vector old_layer_height_profile; +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES bool dirty{ false }; +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES }; Profile m_profile; #endif // ENABLE_GLBEGIN_GLEND_REMOVAL @@ -277,7 +283,9 @@ class GLCanvas3D static float get_cursor_z_relative(const GLCanvas3D& canvas); static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); static Rect get_bar_rect_screen(const GLCanvas3D& canvas); +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES static float get_overlay_window_width() { return LayersEditing::s_overlay_window_width; } float object_max_z() const { return m_object_max_z; } @@ -287,10 +295,11 @@ class GLCanvas3D private: bool is_initialized() const; void generate_layer_height_texture(); - void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + void render_active_object_annotations(const GLCanvas3D& canvas); void render_profile(const GLCanvas3D& canvas); #else + void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect); void render_profile(const Rect& bar_rect); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void update_slicing_parameters(); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 6dfc9f9366..abc4cd9a6c 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -96,7 +96,11 @@ std::pair GLShadersManager::init() #endif // ENABLE_ENVIRONMENT_MAP ); // used to render variable layers heights in 3d editor +#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + valid &= append_shader("variable_layer_height_attr", { "variable_layer_height_attr.vs", "variable_layer_height.fs" }); +#else valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); +#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render highlight contour around selected triangles inside the multi-material gizmo #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("mm_contour_attr", { "mm_contour_attr.vs", "mm_contour_attr.fs" }); From 31c3952e2d0290cc03ecc86066b82a67fc147c7a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 12:50:00 +0100 Subject: [PATCH 086/149] Removed obsolete shaders --- resources/shaders/options_110.fs | 8 -------- resources/shaders/options_110.vs | 22 ---------------------- resources/shaders/options_120.fs | 22 ---------------------- resources/shaders/options_120.vs | 22 ---------------------- 4 files changed, 74 deletions(-) delete mode 100644 resources/shaders/options_110.fs delete mode 100644 resources/shaders/options_110.vs delete mode 100644 resources/shaders/options_120.fs delete mode 100644 resources/shaders/options_120.vs diff --git a/resources/shaders/options_110.fs b/resources/shaders/options_110.fs deleted file mode 100644 index ab656998df..0000000000 --- a/resources/shaders/options_110.fs +++ /dev/null @@ -1,8 +0,0 @@ -#version 110 - -uniform vec4 uniform_color; - -void main() -{ - gl_FragColor = uniform_color; -} diff --git a/resources/shaders/options_110.vs b/resources/shaders/options_110.vs deleted file mode 100644 index 5f2ab23504..0000000000 --- a/resources/shaders/options_110.vs +++ /dev/null @@ -1,22 +0,0 @@ -#version 110 - -uniform bool use_fixed_screen_size; -uniform float zoom; -uniform float point_size; -uniform float near_plane_height; - -float fixed_screen_size() -{ - return point_size; -} - -float fixed_world_size() -{ - return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w; -} - -void main() -{ - gl_Position = ftransform(); - gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size(); -} diff --git a/resources/shaders/options_120.fs b/resources/shaders/options_120.fs deleted file mode 100644 index e9b61304f2..0000000000 --- a/resources/shaders/options_120.fs +++ /dev/null @@ -1,22 +0,0 @@ -// version 120 is needed for gl_PointCoord -#version 120 - -uniform vec4 uniform_color; -uniform float percent_outline_radius; -uniform float percent_center_radius; - -vec4 calc_color(float radius, vec4 color) -{ - return ((radius < percent_center_radius) || (radius > 1.0 - percent_outline_radius)) ? - vec4(0.5 * color.rgb, color.a) : color; -} - -void main() -{ - vec2 pos = (gl_PointCoord - 0.5) * 2.0; - float radius = length(pos); - if (radius > 1.0) - discard; - - gl_FragColor = calc_color(radius, uniform_color); -} diff --git a/resources/shaders/options_120.vs b/resources/shaders/options_120.vs deleted file mode 100644 index edb503fb2b..0000000000 --- a/resources/shaders/options_120.vs +++ /dev/null @@ -1,22 +0,0 @@ -#version 120 - -uniform bool use_fixed_screen_size; -uniform float zoom; -uniform float point_size; -uniform float near_plane_height; - -float fixed_screen_size() -{ - return point_size; -} - -float fixed_world_size() -{ - return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w; -} - -void main() -{ - gl_Position = ftransform(); - gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size(); -} From 80717bbdec99bf3d9c1ac4e76513f278a45e3ca7 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 13:27:51 +0100 Subject: [PATCH 087/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Some code cleanup --- src/slic3r/GUI/3DScene.cpp | 14 +--- src/slic3r/GUI/GCodeViewer.cpp | 142 ++++++++++++--------------------- src/slic3r/GUI/GLModel.cpp | 90 ++++++++------------- 3 files changed, 91 insertions(+), 155 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 9269458df4..725f5f889f 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -714,15 +714,10 @@ void GLVolume::render() if (this->is_left_handed()) glFrontFace(GL_CW); glsafe(::glCullFace(GL_BACK)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - if (!use_attributes) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(world_matrix().data())); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL if (tverts_range == std::make_pair(0, -1)) @@ -733,10 +728,9 @@ void GLVolume::render() this->indexed_vertex_array.render(this->tverts_range, this->qverts_range); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!use_attributes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (this->is_left_handed()) glFrontFace(GL_CCW); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 2cfcaa71fd..cfef613aed 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3196,16 +3196,13 @@ void GCodeViewer::render_toolpaths() #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES int position_id = -1; int normal_id = -1; - const bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - if (use_attributes) { - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("view_model_matrix", view_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - position_id = shader->get_attrib_location("v_position"); - normal_id = shader->get_attrib_location("v_normal"); - } + position_id = shader->get_attrib_location("v_position"); + normal_id = shader->get_attrib_location("v_normal"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { @@ -3246,34 +3243,24 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); - glsafe(::glEnableVertexAttribArray(position_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); } +#else + glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableVertexAttribArray(normal_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); } +#else + glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } @@ -3301,20 +3288,15 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (normal_id != -1) - glsafe(::glDisableVertexAttribArray(normal_id)); - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); +#else + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } @@ -3339,49 +3321,36 @@ void GCodeViewer::render_toolpaths() #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES int position_id = -1; int normal_id = -1; - const bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - if (use_attributes) { - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("view_model_matrix", view_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - position_id = shader->get_attrib_location("v_position"); - normal_id = shader->get_attrib_location("v_normal"); - } + position_id = shader->get_attrib_location("v_position"); + normal_id = shader->get_attrib_location("v_normal"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); - glsafe(::glEnableVertexAttribArray(position_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glVertexPointer(buffer->vertices.position_size_floats(), GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableVertexAttribArray(position_id)); } +#else + glsafe(::glVertexPointer(buffer->vertices.position_size_floats(), GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const bool has_normals = buffer->vertices.normal_size_floats() > 0; if (has_normals) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); - glsafe(::glEnableVertexAttribArray(normal_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glNormalPointer(GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableVertexAttribArray(normal_id)); } +#else + glsafe(::glNormalPointer(GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } @@ -3396,20 +3365,15 @@ void GCodeViewer::render_toolpaths() #endif // ENABLE_GCODE_VIEWER_STATISTICS #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (normal_id != -1) - glsafe(::glDisableVertexAttribArray(normal_id)); - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (has_normals) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); +#else + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 13606cb655..44d0eb78d9 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -982,8 +982,6 @@ void GLModel::render(const std::pair& range) glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - bool use_attributes = boost::algorithm::iends_with(shader->get_name(), "_attr"); - int position_id = -1; int normal_id = -1; int tex_coord_id = -1; @@ -991,53 +989,38 @@ void GLModel::render(const std::pair& range) if (position) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - position_id = shader->get_attrib_location("v_position"); - if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); - glsafe(::glEnableVertexAttribArray(position_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(position_id)); } +#else + glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (normal) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - normal_id = shader->get_attrib_location("v_normal"); - if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); - glsafe(::glEnableVertexAttribArray(normal_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + normal_id = shader->get_attrib_location("v_normal"); + if (normal_id != -1) { + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(normal_id)); } +#else + glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } if (tex_coord) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - tex_coord_id = shader->get_attrib_location("v_tex_coord"); - if (tex_coord_id != -1) { - glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::tex_coord_offset_bytes(data.format))); - glsafe(::glEnableVertexAttribArray(tex_coord_id)); - } - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES + tex_coord_id = shader->get_attrib_location("v_tex_coord"); + if (tex_coord_id != -1) { + glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(tex_coord_id)); } +#else + glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } @@ -1048,24 +1031,19 @@ void GLModel::render(const std::pair& range) glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (use_attributes) { - if (tex_coord_id != -1) - glsafe(::glDisableVertexAttribArray(tex_coord_id)); - if (normal_id != -1) - glsafe(::glDisableVertexAttribArray(normal_id)); - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); - } - else { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (tex_coord) - glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); - if (normal) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - if (position) - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - } + if (tex_coord_id != -1) + glsafe(::glDisableVertexAttribArray(tex_coord_id)); + if (normal_id != -1) + glsafe(::glDisableVertexAttribArray(normal_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); +#else + if (tex_coord) + glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); + if (normal) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + if (position) + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); From 05efb88e3f6deebd64685b2439247432b941cc2f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 14:08:11 +0100 Subject: [PATCH 088/149] Tech ENABLE_GLBEGIN_GLEND_REMOVAL renamed as ENABLE_LEGACY_OPENGL_REMOVAL --- src/libslic3r/Technologies.hpp | 6 +- src/slic3r/GUI/3DBed.cpp | 44 +++--- src/slic3r/GUI/3DBed.hpp | 32 ++--- src/slic3r/GUI/3DScene.cpp | 60 ++++---- src/slic3r/GUI/GCodeViewer.cpp | 16 +-- src/slic3r/GUI/GCodeViewer.hpp | 8 +- src/slic3r/GUI/GLCanvas3D.cpp | 84 +++++------ src/slic3r/GUI/GLCanvas3D.hpp | 12 +- src/slic3r/GUI/GLModel.cpp | 132 +++++++++--------- src/slic3r/GUI/GLModel.hpp | 36 ++--- src/slic3r/GUI/GLSelectionRectangle.cpp | 8 +- src/slic3r/GUI/GLSelectionRectangle.hpp | 8 +- src/slic3r/GUI/GLShadersManager.cpp | 4 +- src/slic3r/GUI/GLTexture.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 16 +-- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 20 +-- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 8 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 32 ++--- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 24 ++-- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 56 ++++---- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 28 ++-- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 4 +- src/slic3r/GUI/Selection.cpp | 72 +++++----- src/slic3r/GUI/Selection.hpp | 8 +- 32 files changed, 397 insertions(+), 397 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 88ca571781..0c2d2f6909 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -66,10 +66,10 @@ #define ENABLE_OBJECT_MANIPULATOR_FOCUS (1 && ENABLE_2_5_0_ALPHA1) // Enable removal of wipe tower magic object_id equal to 1000 #define ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) -// Enable removal of old OpenGL render calls -#define ENABLE_GLBEGIN_GLEND_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) +// Enable removal of legacy OpenGL calls +#define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable replace GLIndexedVertexArray with GLModel -#define ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL (1 && ENABLE_GLBEGIN_GLEND_REMOVAL) +#define ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL (1 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable using vertex attributes and matrices in shaders #define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL) // Enable show non-manifold edges diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 64bc8c7dfa..7981bd9009 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -31,7 +31,7 @@ static const Slic3r::ColorRGBA DEFAULT_TRANSPARENT_GRID_COLOR = { 0.9f, 0.9f, 0 namespace Slic3r { namespace GUI { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL bool GeometryBuffer::set_from_triangles(const std::vector &triangles, float z) { if (triangles.empty()) { @@ -100,7 +100,7 @@ const float* GeometryBuffer::get_vertices_data() const { return (m_vertices.size() > 0) ? (const float*)m_vertices.data() : nullptr; } -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL const float Bed3D::Axes::DefaultStemRadius = 0.5f; const float Bed3D::Axes::DefaultStemLength = 25.0f; @@ -144,11 +144,11 @@ void Bed3D::Axes::render() shader->set_uniform("emission_factor", 0.0f); // x axis -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::X()); #else m_arrow.set_color(-1, ColorRGBA::X()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); #else @@ -156,11 +156,11 @@ void Bed3D::Axes::render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // y axis -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Y()); #else m_arrow.set_color(-1, ColorRGBA::Y()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); #else @@ -168,11 +168,11 @@ void Bed3D::Axes::render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // z axis -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Z()); #else m_arrow.set_color(-1, ColorRGBA::Z()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin)); #else @@ -231,7 +231,7 @@ bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, c m_model_filename = model_filename; m_extended_bounding_box = this->calc_extended_bounding_box(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_contour = ExPolygon(Polygon::new_scale(bed_shape)); m_polygon = offset(m_contour.contour, (float)m_contour.contour.bounding_box().radius() * 1.7f, jtRound, scale_(0.5)).front(); @@ -248,7 +248,7 @@ bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, c m_polygon = offset(poly.contour, (float)bed_bbox.radius() * 1.7f, jtRound, scale_(0.5)).front(); this->release_VBOs(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_texture.reset(); m_model.reset(); @@ -307,11 +307,11 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.set_color(picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); #else m_model.set_color(-1, picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL switch (m_type) { @@ -352,7 +352,7 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const return out; } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::init_triangles() { if (m_triangles.is_initialized()) @@ -483,7 +483,7 @@ void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox) if (!m_gridlines.set_from_lines(gridlines, GROUND_Z)) BOOST_LOG_TRIVIAL(error) << "Unable to create bed grid lines\n"; } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Try to match the print bed shape with the shape of an active profile. If such a match exists, // return the print bed model. @@ -596,7 +596,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) canvas.request_extra_frame(); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL init_triangles(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -701,7 +701,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) shader->stop_using(); } } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -714,11 +714,11 @@ void Bed3D::render_model() return; if (m_model.get_filename() != m_model_filename && m_model.init_from_file(m_model_filename)) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.set_color(DEFAULT_MODEL_COLOR); #else m_model.set_color(-1, DEFAULT_MODEL_COLOR); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // move the model so that its origin (0.0, 0.0, 0.0) goes into the bed shape center and a bit down to avoid z-fighting with the texture quad m_model_offset = to_3d(m_build_volume.bounding_volume2d().center(), -0.03); @@ -780,7 +780,7 @@ void Bed3D::render_default(bool bottom, bool picking) { m_texture.reset(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL init_gridlines(); init_triangles(); @@ -856,10 +856,10 @@ void Bed3D::render_default(bool bottom, bool picking) glsafe(::glDisable(GL_BLEND)); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::release_VBOs() { if (m_vbo_id > 0) { @@ -867,7 +867,7 @@ void Bed3D::release_VBOs() m_vbo_id = 0; } } -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } // GUI } // Slic3r diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index d5ce0c511e..fbf7d0c7d8 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -6,9 +6,9 @@ #include "GLModel.hpp" #include "libslic3r/BuildVolume.hpp" -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "libslic3r/ExPolygon.hpp" -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include #include @@ -18,7 +18,7 @@ namespace GUI { class GLCanvas3D; -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL class GeometryBuffer { struct Vertex @@ -40,7 +40,7 @@ public: size_t get_tex_coords_offset() const { return (size_t)(3 * sizeof(float)); } unsigned int get_vertices_count() const { return (unsigned int)m_vertices.size(); } }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL class Bed3D { @@ -84,38 +84,38 @@ private: std::string m_model_filename; // Print volume bounding box exteded with axes and model. BoundingBoxf3 m_extended_bounding_box; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // Print bed polygon ExPolygon m_contour; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Slightly expanded print bed polygon, for collision detection. Polygon m_polygon; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_triangles; GLModel m_gridlines; #else GeometryBuffer m_triangles; GeometryBuffer m_gridlines; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLTexture m_texture; // temporary texture shown until the main texture has still no levels compressed GLTexture m_temp_texture; GLModel m_model; Vec3d m_model_offset{ Vec3d::Zero() }; -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL unsigned int m_vbo_id{ 0 }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL Axes m_axes; float m_scale_factor{ 1.0f }; public: Bed3D() = default; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL ~Bed3D() = default; #else ~Bed3D() { release_VBOs(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Update print bed model from configuration. // Return true if the bed shape changed, so the calee will update the UI. @@ -150,13 +150,13 @@ public: private: // Calculate an extended bounding box from axes and current model for visualization purposes. BoundingBoxf3 calc_extended_bounding_box() const; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void init_triangles(); void init_gridlines(); #else void calc_triangles(const ExPolygon& poly); void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL static std::tuple detect_type(const Pointfs& shape); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, @@ -180,9 +180,9 @@ private: void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_default(bool bottom, bool picking); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL void release_VBOs(); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL }; } // GUI diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 725f5f889f..b586848f65 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -334,16 +334,16 @@ void GLVolume::SinkingContours::update() m_model.reset(); GUI::GLModel::Geometry init_data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3, GUI::GLModel::Geometry::EIndexType::UINT }; init_data.color = ColorRGBA::WHITE(); unsigned int vertices_counter = 0; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL MeshSlicingParams slicing_params; slicing_params.trafo = m_parent.world_matrix(); const Polygons polygons = union_(slice_mesh(mesh.its, 0.0f, slicing_params)); for (const ExPolygon& expoly : diff_ex(expand(polygons, float(scale_(HalfWidth))), shrink(polygons, float(scale_(HalfWidth))))) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const std::vector triangulation = triangulate_expolygon_3d(expoly); init_data.reserve_vertices(init_data.vertices_count() + triangulation.size()); init_data.reserve_indices(init_data.indices_count() + triangulation.size()); @@ -375,7 +375,7 @@ void GLVolume::SinkingContours::update() init_data.entities.emplace_back(entity); } m_model.init_from(init_data); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } else m_shift = box.center() - m_old_box.center(); @@ -402,11 +402,11 @@ void GLVolume::NonManifoldEdges::render() glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.set_color(complementary(m_parent.render_color)); #else m_model.set_color(-1, complementary(m_parent.render_color)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_model.render(); #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); @@ -430,7 +430,7 @@ void GLVolume::NonManifoldEdges::update() const std::vector> edges = its_get_open_edges(mesh.its); if (!edges.empty()) { GUI::GLModel::Geometry init_data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Lines, GUI::GLModel::Geometry::EVertexLayout::P3, GUI::GLModel::Geometry::index_type(2 * edges.size()) }; init_data.reserve_vertices(2 * edges.size()); init_data.reserve_indices(2 * edges.size()); @@ -465,7 +465,7 @@ void GLVolume::NonManifoldEdges::update() init_data.entities.emplace_back(entity); m_model.init_from(init_data); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } } @@ -1087,7 +1087,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab if (shader == nullptr) return; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); @@ -1096,7 +1096,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (type == ERenderType::Transparent) { glsafe(::glEnable(GL_BLEND)); @@ -1111,28 +1111,28 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab volume.first->set_render_color(true); // render sinking contours of non-hovered volumes -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (sink_shader != nullptr) { sink_shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (m_show_sinking_contours) { if (volume.first->is_sinking() && !volume.first->is_below_printbed() && volume.first->hover == GLVolume::HS_None && !volume.first->force_sinking_contours) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL volume.first->render_sinking_contours(); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL shader->start_using(); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL sink_shader->stop_using(); } shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); @@ -1188,49 +1188,49 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab } if (m_show_sinking_contours) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (sink_shader != nullptr) { sink_shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (GLVolumeWithIdAndZ& volume : to_render) { // render sinking contours of hovered/displaced volumes if (volume.first->is_sinking() && !volume.first->is_below_printbed() && (volume.first->hover != GLVolume::HS_None || volume.first->force_sinking_contours)) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDepthFunc(GL_ALWAYS)); volume.first->render_sinking_contours(); glsafe(::glDepthFunc(GL_LESS)); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL shader->start_using(); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL sink_shader->start_using(); } shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if ENABLE_SHOW_NON_MANIFOLD_EDGES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (edges_shader != nullptr) { edges_shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (m_show_non_manifold_edges && GUI::wxGetApp().app_config->get("non_manifold_edges") == "1") { for (GLVolumeWithIdAndZ& volume : to_render) { volume.first->render_non_manifold_edges(); } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL edges_shader->stop_using(); } shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_SHOW_NON_MANIFOLD_EDGES if (disable_cullface) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index cfef613aed..5ad37d37d2 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -313,11 +313,11 @@ void GCodeViewer::SequentialRangeCap::reset() { void GCodeViewer::SequentialView::Marker::init() { m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.set_color({ 1.0f, 1.0f, 1.0f, 0.5f }); #else m_model.set_color(-1, { 1.0f, 1.0f, 1.0f, 0.5f }); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GCodeViewer::SequentialView::Marker::set_world_position(const Vec3f& position) @@ -1628,7 +1628,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) const Transform3d trafo = Geometry::assemble_transform((curr.position - 0.5f * curr.height * Vec3f::UnitZ()).cast(), Vec3d::Zero(), { width, width, height }); const Eigen::Matrix normal_matrix = trafo.matrix().template block<3, 3>(0, 0).inverse().transpose(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // append vertices const size_t vertices_count = data.vertices_count(); for (size_t i = 0; i < vertices_count; ++i) { @@ -1661,7 +1661,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) vertices.push_back(static_cast(normal.z())); } } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // append instance position instances.push_back(curr.position.x()); @@ -1672,7 +1672,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) }; auto add_indices_as_model_batch = [](const GLModel::Geometry& data, IndexBuffer& indices, IBufferType base_index) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const size_t indices_count = data.indices_count(); for (size_t i = 0; i < indices_count; ++i) { indices.push_back(static_cast(data.extract_ushort_index(i) + base_index)); @@ -1683,7 +1683,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) indices.push_back(static_cast(entity.indices[i] + base_index)); } } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; #if ENABLE_GCODE_VIEWER_STATISTICS @@ -3074,11 +3074,11 @@ void GCodeViewer::render_toolpaths() } if (range.vbo > 0) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL buffer.model.model.set_color(range.color); #else buffer.model.model.set_color(-1, range.color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL buffer.model.model.render_instanced(range.vbo, range.count); #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_instanced_models_calls_count; diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index bdb3ed983e..678ccbd6e4 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -365,11 +365,11 @@ class GCodeViewer } case ERenderPrimitiveType::InstancedModel: { return model.model.is_initialized() && !model.instances.buffer.empty(); } case ERenderPrimitiveType::BatchedModel: { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL return !model.data.vertices.empty() && !model.data.indices.empty() && #else return model.data.vertices_count() > 0 && model.data.indices_count() && -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; } default: { return false; } @@ -421,11 +421,11 @@ class GCodeViewer const float radius = m_fixed_size ? 10.0f : 1.0f; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.init_from(smooth_sphere(32, radius)); #else m_model.init_from(its_make_sphere(radius, PI / 32.0)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } }; #endif // ENABLE_SHOW_TOOLPATHS_COG diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ac0e1734aa..2e09503398 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -72,7 +72,7 @@ static constexpr const float TRACKBALLSIZE = 0.8f; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static const Slic3r::ColorRGBA DEFAULT_BG_DARK_COLOR = { 0.478f, 0.478f, 0.478f, 1.0f }; static const Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.753f, 0.753f, 0.753f, 1.0f }; static const Slic3r::ColorRGBA ERROR_BG_DARK_COLOR = { 0.478f, 0.192f, 0.039f, 1.0f }; @@ -82,7 +82,7 @@ static const Slic3r::ColorRGB DEFAULT_BG_DARK_COLOR = { 0.478f, 0.478f, 0.478f static const Slic3r::ColorRGB DEFAULT_BG_LIGHT_COLOR = { 0.753f, 0.753f, 0.753f }; static const Slic3r::ColorRGB ERROR_BG_DARK_COLOR = { 0.478f, 0.192f, 0.039f }; static const Slic3r::ColorRGB ERROR_BG_LIGHT_COLOR = { 0.753f, 0.192f, 0.039f }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Number of floats static constexpr const size_t MAX_VERTEX_BUFFER_SIZE = 131072 * 6; // 3.15MB @@ -268,15 +268,15 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) render_profile(canvas); #else const Rect& bar_rect = get_bar_rect_viewport(canvas); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_profile.dirty = m_profile.old_bar_rect != bar_rect; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL render_active_object_annotations(canvas, bar_rect); render_profile(bar_rect); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_profile.old_bar_rect = bar_rect; m_profile.dirty = false; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES } @@ -392,7 +392,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); // Render the color bar -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!m_profile.background.is_initialized() || m_profile.old_canvas_width != cnv_width) { m_profile.old_canvas_width = cnv_width; @@ -444,7 +444,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 ::glTexCoord2f(1.0f, 1.0f); ::glVertex2f(r, t); ::glTexCoord2f(0.0f, 1.0f); ::glVertex2f(l, t); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); @@ -481,7 +481,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const float scale_y = bar_rect.get_height() / m_object_max_z; #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // Baseline #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!m_profile.baseline.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { @@ -576,7 +576,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) for (unsigned int i = 0; i < m_layer_height_profile.size(); i += 2) ::glVertex2f(bar_rect.get_left() + (float)m_layer_height_profile[i + 1] * scale_x, bar_rect.get_bottom() + (float)m_layer_height_profile[i] * scale_y); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const GLVolumeCollection& volumes) @@ -983,17 +983,17 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons if (polygons.empty()) return; -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL size_t triangles_count = 0; for (const Polygon& poly : polygons) { triangles_count += poly.points.size() - 2; } const size_t vertices_count = 3 * triangles_count; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL if (m_render_fill) { GLModel::Geometry fill_data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL fill_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::UINT }; fill_data.color = { 0.3333f, 0.0f, 0.0f, 0.5f }; @@ -1038,10 +1038,10 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons fill_data.entities.emplace_back(entity); m_fill.init_from(fill_data); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_perimeter.init_from(polygons, 0.025f); // add a small positive z to avoid z-fighting #else GLModel::Geometry perimeter_data; @@ -1061,7 +1061,7 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons } m_perimeter.init_from(perimeter_data); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLCanvas3D::SequentialPrintClearance::render() @@ -1069,7 +1069,7 @@ void GLCanvas3D::SequentialPrintClearance::render() const ColorRGBA FILL_COLOR = { 1.0f, 0.0f, 0.0f, 0.5f }; const ColorRGBA NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -1077,7 +1077,7 @@ void GLCanvas3D::SequentialPrintClearance::render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader == nullptr) return; @@ -1094,11 +1094,11 @@ void GLCanvas3D::SequentialPrintClearance::render() glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_perimeter.set_color(m_render_fill ? FILL_COLOR : NO_FILL_COLOR); #else m_perimeter.set_color(-1, m_render_fill ? FILL_COLOR : NO_FILL_COLOR); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_perimeter.render(); m_fill.render(); @@ -1267,7 +1267,7 @@ bool GLCanvas3D::init() glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL // Set antialiasing / multisampling glsafe(::glDisable(GL_LINE_SMOOTH)); glsafe(::glDisable(GL_POLYGON_SMOOTH)); @@ -1297,7 +1297,7 @@ bool GLCanvas3D::init() // A handy trick -- have surface material mirror the color. glsafe(::glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)); glsafe(::glEnable(GL_COLOR_MATERIAL)); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL if (m_multisample_allowed) glsafe(::glEnable(GL_MULTISAMPLE)); @@ -5437,7 +5437,7 @@ void GLCanvas3D::_render_background() // Draws a bottom to top gradient over the complete screen. glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const ColorRGBA bottom_color = use_error_color ? ERROR_BG_DARK_COLOR : DEFAULT_BG_DARK_COLOR; if (!m_background.is_initialized()) { @@ -5483,7 +5483,7 @@ void GLCanvas3D::_render_background() ::glVertex2f(1.0f, 1.0f); ::glVertex2f(-1.0f, 1.0f); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_DEPTH_TEST)); @@ -6007,7 +6007,7 @@ void GLCanvas3D::_render_camera_target() glsafe(::glDisable(GL_DEPTH_TEST)); glsafe(::glLineWidth(2.0f)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const Vec3f& target = wxGetApp().plater()->get_camera().get_target().cast(); bool target_changed = !m_camera_target.target.isApprox(target.cast()); m_camera_target.target = target.cast(); @@ -6076,7 +6076,7 @@ void GLCanvas3D::_render_camera_target() ::glVertex3d(target.x(), target.y(), target.z() - half_length); ::glVertex3d(target.x(), target.y(), target.z() + half_length); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #endif // ENABLE_SHOW_CAMERA_TARGET @@ -6099,40 +6099,40 @@ void GLCanvas3D::_render_sla_slices() if (!obj->is_step_done(slaposSliceSupports)) continue; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL SlaCap::ObjectIdToModelsMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); SlaCap::ObjectIdToModelsMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); #else SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (it_caps_bottom == m_sla_caps[0].triangles.end()) it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; if (!m_sla_caps[0].matches(clip_min_z)) { m_sla_caps[0].z = clip_min_z; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL it_caps_bottom->second.object.reset(); it_caps_bottom->second.supports.reset(); #else it_caps_bottom->second.object.clear(); it_caps_bottom->second.supports.clear(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } if (it_caps_top == m_sla_caps[1].triangles.end()) it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; if (!m_sla_caps[1].matches(clip_max_z)) { m_sla_caps[1].z = clip_max_z; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL it_caps_top->second.object.reset(); it_caps_top->second.supports.reset(); #else it_caps_top->second.object.clear(); it_caps_top->second.supports.clear(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel& bottom_obj_triangles = it_caps_bottom->second.object; GLModel& bottom_sup_triangles = it_caps_bottom->second.supports; GLModel& top_obj_triangles = it_caps_top->second.object; @@ -6142,9 +6142,9 @@ void GLCanvas3D::_render_sla_slices() Pointf3s &bottom_sup_triangles = it_caps_bottom->second.supports; Pointf3s &top_obj_triangles = it_caps_top->second.object; Pointf3s &top_sup_triangles = it_caps_top->second.supports; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL auto init_model = [](GLModel& model, const Pointf3s& triangles, const ColorRGBA& color) { GLModel::Geometry init_data; init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(triangles.size()) }; @@ -6173,7 +6173,7 @@ void GLCanvas3D::_render_sla_slices() #else if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && !obj->get_slice_index().empty()) { -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL double layer_height = print->default_object_config().layer_height.value; double initial_layer_height = print->material_config().initial_layer_height.value; bool left_handed = obj->is_left_handed(); @@ -6193,7 +6193,7 @@ void GLCanvas3D::_render_sla_slices() if (slice_low.is_valid()) { const ExPolygons& obj_bottom = slice_low.get_slice(soModel); const ExPolygons& sup_bottom = slice_low.get_slice(soSupport); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // calculate model bottom cap if (!bottom_obj_triangles.is_initialized() && !obj_bottom.empty()) init_model(bottom_obj_triangles, triangulate_expolygons_3d(obj_bottom, clip_min_z - plane_shift_z, !left_handed), { 1.0f, 0.37f, 0.0f, 1.0f }); @@ -6207,13 +6207,13 @@ void GLCanvas3D::_render_sla_slices() // calculate support bottom cap if (bottom_sup_triangles.empty() && !sup_bottom.empty()) bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, clip_min_z - plane_shift_z, !left_handed); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } if (slice_high.is_valid()) { const ExPolygons& obj_top = slice_high.get_slice(soModel); const ExPolygons& sup_top = slice_high.get_slice(soSupport); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // calculate model top cap if (!top_obj_triangles.is_initialized() && !obj_top.empty()) init_model(top_obj_triangles, triangulate_expolygons_3d(obj_top, clip_max_z + plane_shift_z, left_handed), { 1.0f, 0.37f, 0.0f, 1.0f }); @@ -6227,11 +6227,11 @@ void GLCanvas3D::_render_sla_slices() // calculate support top cap if (top_sup_triangles.empty() && !sup_top.empty()) top_sup_triangles = triangulate_expolygons_3d(sup_top, clip_max_z + plane_shift_z, left_handed); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -6303,7 +6303,7 @@ void GLCanvas3D::_render_sla_slices() glsafe(::glPopMatrix()); } } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index bafcfa9ba0..8e2496231a 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -239,7 +239,7 @@ class GLCanvas3D int last_object_id{ -1 }; float last_z{ 0.0f }; LayerHeightEditActionType last_action{ LAYER_HEIGHT_EDIT_ACTION_INCREASE }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL struct Profile { GLModel baseline; @@ -256,7 +256,7 @@ class GLCanvas3D #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES }; Profile m_profile; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL LayersEditing() = default; ~LayersEditing(); @@ -348,7 +348,7 @@ class GLCanvas3D struct SlaCap { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL struct Triangles { GLModel object; @@ -366,7 +366,7 @@ class GLCanvas3D typedef std::map ObjectIdToTrianglesMap; double z; ObjectIdToTrianglesMap triangles; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL SlaCap() { reset(); } void reset() { z = DBL_MAX; triangles.clear(); } @@ -633,7 +633,7 @@ private: } m_gizmo_highlighter; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_CAMERA_TARGET struct CameraTarget { @@ -644,7 +644,7 @@ private: CameraTarget m_camera_target; #endif // ENABLE_SHOW_CAMERA_TARGET GLModel m_background; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL public: explicit GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 44d0eb78d9..683d42c6fa 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -58,7 +58,7 @@ static void smooth_normals_corner(const TriangleMesh& mesh, std::vector= m_render_data.size()) return ColorRGBA{}; return m_render_data[entity_id].color; } -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL void GLModel::reset() { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // release gpu memory if (m_render_data.ibo_id > 0) { glsafe(::glDeleteBuffers(1, &m_render_data.ibo_id)); @@ -820,12 +820,12 @@ void GLModel::reset() } m_render_data.clear(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_bounding_box = BoundingBoxf3(); m_filename = std::string(); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static GLenum get_primitive_mode(const GLModel::Geometry::Format& format) { switch (format.type) @@ -854,14 +854,14 @@ static GLenum get_index_type(const GLModel::Geometry::Format& format) void GLModel::render() #else void GLModel::render() const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL render(std::make_pair(0, indices_count())); #else GLShaderProgram* shader = wxGetApp().get_current_shader(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (shader == nullptr) return; @@ -946,7 +946,7 @@ void GLModel::render() const glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL } @@ -1050,17 +1050,17 @@ void GLModel::render(const std::pair& range) } #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) #else void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (instances_vbo == 0) return; GLShaderProgram* shader = wxGetApp().get_current_shader(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced_attr")) #else @@ -1096,10 +1096,10 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance GLint offset_id = (shader != nullptr) ? shader->get_attrib_location("i_offset") : -1; GLint scales_id = (shader != nullptr) ? shader->get_attrib_location("i_scales") : -1; assert(offset_id != -1 && scales_id != -1); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, instances_vbo)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)0)); glsafe(::glEnableVertexAttribArray(offset_id)); glsafe(::glVertexAttribDivisor(offset_id, 1)); @@ -1118,9 +1118,9 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance glsafe(::glEnableVertexAttribArray(scales_id)); glsafe(::glVertexAttribDivisor(scales_id, 1)); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const Geometry& data = m_render_data.geometry; GLenum mode = get_primitive_mode(data.format); @@ -1199,12 +1199,12 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance glsafe(::glDisableVertexAttribArray(scales_id)); if (offset_id != -1) glsafe(::glDisableVertexAttribArray(offset_id)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool GLModel::send_to_gpu() { if (m_render_data.vbo_id > 0 || m_render_data.ibo_id > 0) { @@ -1254,9 +1254,9 @@ void GLModel::send_to_gpu(RenderData& data, const std::vector& vertices, glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), indices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static void append_vertex(GLModel::Geometry& data, const Vec3f& position, const Vec3f& normal) { data.add_vertex(position, normal); @@ -1268,7 +1268,7 @@ static void append_triangle(GLModel::Geometry& data, unsigned short v1, unsigned data.add_ushort_index(v2); data.add_ushort_index(v3); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL template @@ -1328,7 +1328,7 @@ bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_botto GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL auto append_vertex = [](GLModel::Geometry::Entity& entity, const Vec3f& position, const Vec3f& normal) { entity.positions.emplace_back(position); entity.normals.emplace_back(normal); @@ -1338,22 +1338,22 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl entity.indices.emplace_back(v2); entity.indices.emplace_back(v3); }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL resolution = std::max(4, resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL resolution = std::min(10922, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; data.reserve_vertices(6 * resolution + 2); data.reserve_indices(6 * resolution * 3); #else GLModel::Geometry::Entity entity; entity.type = GLModel::EPrimitiveType::Triangles; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float angle_step = 2.0f * float(PI) / float(resolution); std::vector cosines(resolution); @@ -1368,7 +1368,7 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl const float total_height = tip_height + stem_height; // tip vertices/normals -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL append_vertex(data, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); for (unsigned short i = 0; i < resolution; ++i) { append_vertex(data, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); @@ -1488,14 +1488,14 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl } data.entities.emplace_back(entity); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return data; } GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL auto append_vertex = [](GLModel::Geometry::Entity& entity, const Vec3f& position, const Vec3f& normal) { entity.positions.emplace_back(position); entity.normals.emplace_back(normal); @@ -1505,22 +1505,22 @@ GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float entity.indices.emplace_back(v2); entity.indices.emplace_back(v3); }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL resolution = std::max(2, resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL resolution = std::min(8188, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; data.reserve_vertices(8 * (resolution + 1) + 30); data.reserve_indices((8 * resolution + 16) * 3); #else GLModel::Geometry::Entity entity; entity.type = GLModel::EPrimitiveType::Triangles; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; @@ -1530,7 +1530,7 @@ GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float const float inner_radius = radius - half_stem_width; const float step_angle = 0.5f * float(PI) / float(resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // tip // top face vertices append_vertex(data, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitZ()); @@ -1820,14 +1820,14 @@ GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float } data.entities.emplace_back(entity); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return data; } GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL auto append_vertex = [](GLModel::Geometry::Entity& entity, const Vec3f& position, const Vec3f& normal) { entity.positions.emplace_back(position); entity.normals.emplace_back(normal); @@ -1837,24 +1837,24 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w entity.indices.emplace_back(v2); entity.indices.emplace_back(v3); }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; data.reserve_vertices(42); data.reserve_indices(72); #else GLModel::Geometry::Entity entity; entity.type = GLModel::EPrimitiveType::Triangles; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float half_thickness = 0.5f * thickness; const float half_stem_width = 0.5f * stem_width; const float half_tip_width = 0.5f * tip_width; const float total_height = tip_height + stem_height; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // top face vertices append_vertex(data, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); append_vertex(data, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); @@ -2014,7 +2014,7 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w } data.entities.emplace_back(entity); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return data; } @@ -2022,23 +2022,23 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w GLModel::Geometry diamond(unsigned short resolution) { resolution = std::max(4, resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL resolution = std::min(65534, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry data; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; data.reserve_vertices(resolution + 2); data.reserve_indices((2 * (resolution + 1)) * 3); #else GLModel::Geometry::Entity entity; entity.type = GLModel::EPrimitiveType::Triangles; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float step = 2.0f * float(PI) / float(resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // vertices for (unsigned short i = 0; i < resolution; ++i) { const float ii = float(i) * step; @@ -2098,12 +2098,12 @@ GLModel::Geometry diamond(unsigned short resolution) entity.indices.push_back(0); data.entities.emplace_back(entity); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return data; } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG GLModel::Geometry smooth_sphere(unsigned short resolution, float radius) { @@ -2169,7 +2169,7 @@ GLModel::Geometry smooth_sphere(unsigned short resolution, float radius) return data; } #endif // ENABLE_SHOW_TOOLPATHS_COG -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 3b268dab7e..baa050ee21 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -23,7 +23,7 @@ namespace GUI { class GLModel { public: -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL enum class EPrimitiveType : unsigned char { Triangles, @@ -40,11 +40,11 @@ namespace GUI { size_t indices_count{ 0 }; ColorRGBA color; }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL struct Geometry { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL enum class EPrimitiveType : unsigned char { Points, @@ -172,10 +172,10 @@ namespace GUI { size_t indices_count() const; size_t indices_size_bytes() const { return indices_count() * sizeof(unsigned int); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL struct RenderData { Geometry geometry; @@ -184,14 +184,14 @@ namespace GUI { size_t vertices_count{ 0 }; size_t indices_count{ 0 }; }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL RenderData m_render_data; #else std::vector m_render_data; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL // By default the vertex and index buffers data are sent to gpu at the first call to render() method. @@ -210,7 +210,7 @@ namespace GUI { GLModel() = default; virtual ~GLModel() { reset(); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL size_t vertices_count() const { return m_render_data.vertices_count > 0 ? m_render_data.vertices_count : m_render_data.geometry.vertices_count(); } size_t indices_count() const { return m_render_data.indices_count > 0 ? @@ -234,22 +234,22 @@ namespace GUI { #else void init_from(const Geometry& data); void init_from(const indexed_triangle_set& its, const BoundingBoxf3& bbox); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void init_from(const indexed_triangle_set& its); void init_from(const Polygons& polygons, float z); bool init_from_file(const std::string& filename); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void set_color(const ColorRGBA& color) { m_render_data.geometry.color = color; } const ColorRGBA& get_color() const { return m_render_data.geometry.color; } #else // if entity_id == -1 set the color of all entities void set_color(int entity_id, const ColorRGBA& color); ColorRGBA get_color(size_t entity_id = 0U) const; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void reset(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void render(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void render(const std::pair& range); @@ -265,7 +265,7 @@ namespace GUI { void render_instanced(unsigned int instances_vbo, unsigned int instances_count) const; bool is_initialized() const { return !m_render_data.empty(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; } const std::string& get_filename() const { return m_filename; } @@ -294,11 +294,11 @@ namespace GUI { #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL private: -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool send_to_gpu(); #else void send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL @@ -328,13 +328,13 @@ namespace GUI { // the diamond is contained into a box with size [1, 1, 1] GLModel::Geometry diamond(unsigned short resolution); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // create a sphere with the given resolution and smooth normals // the origin of the sphere is in its center GLModel::Geometry smooth_sphere(unsigned short resolution, float radius); #endif // ENABLE_SHOW_TOOLPATHS_COG -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 0dc6de9364..4044cddd89 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -110,13 +110,13 @@ namespace GUI { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.5f)); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL float color[3]; color[0] = (m_state == Select) ? 0.3f : 1.0f; color[1] = (m_state == Select) ? 1.0f : 0.3f; color[2] = 0.3f; glsafe(::glColor3fv(color)); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisable(GL_DEPTH_TEST)); @@ -134,7 +134,7 @@ namespace GUI { glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -184,7 +184,7 @@ namespace GUI { ::glVertex2f((GLfloat)right, (GLfloat)top); ::glVertex2f((GLfloat)left, (GLfloat)top); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index 39989166ed..71e663240c 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -2,9 +2,9 @@ #define slic3r_GLSelectionRectangle_hpp_ #include "libslic3r/Point.hpp" -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "GLModel.hpp" -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL namespace Slic3r { namespace GUI { @@ -49,11 +49,11 @@ private: EState m_state{ Off }; Vec2d m_start_corner{ Vec2d::Zero() }; Vec2d m_end_corner{ Vec2d::Zero() }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_rectangle; Vec2d m_old_start_corner{ Vec2d::Zero() }; Vec2d m_old_end_corner{ Vec2d::Zero() }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index abc4cd9a6c..7a20fef410 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -33,7 +33,7 @@ std::pair GLShadersManager::init() bool valid = true; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // basic shader, used to render all what was previously rendered using the immediate mode #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); @@ -52,7 +52,7 @@ std::pair GLShadersManager::init() #else valid &= append_shader("background", { "background.vs", "background.fs" }); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 8cfc8fd058..5121e2e7d2 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -3,10 +3,10 @@ #include "3DScene.hpp" #include "OpenGLManager.hpp" -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "GUI_App.hpp" #include "GLModel.hpp" -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -339,7 +339,7 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)tex_id)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry init_data; init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2, GLModel::Geometry::EIndexType::USHORT }; init_data.reserve_vertices(4); @@ -379,7 +379,7 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, ::glTexCoord2f(uvs.right_top.u, uvs.right_top.v); ::glVertex2f(right, top); ::glTexCoord2f(uvs.left_top.u, uvs.left_top.v); ::glVertex2f(left, top); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index a6d33d8065..de09628af6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -46,20 +46,20 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo // initialized at that point (on Linux at least). indexed_triangle_set its = its_make_cube(1., 1., 1.); its_translate(its, -0.5f * Vec3f::Ones()); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cube.init_from(its); #else m_cube.init_from(its, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } const float fullsize = 2.0f * (dragging ? get_dragging_half_size(size) : get_half_size(size)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cube.set_color(render_color); #else m_cube.set_color(-1, render_color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); @@ -152,7 +152,7 @@ void GLGizmoBase::render_grabbers(float size) const void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -160,7 +160,7 @@ void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) { @@ -169,10 +169,10 @@ void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const m_grabbers[i].render_for_picking(mean_size); } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // help function to process grabbers diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index a6d7f5f232..45012c905b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -106,7 +106,7 @@ void GLGizmoCut::on_render() glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -160,7 +160,7 @@ void GLGizmoCut::on_render() ::glVertex3f(max_x, max_y, plane_center.z()); ::glVertex3f(min_x, max_y, plane_center.z()); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_CULL_FACE)); glsafe(::glDisable(GL_BLEND)); @@ -172,7 +172,7 @@ void GLGizmoCut::on_render() glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_grabber_connection.is_initialized() || is_changed) { m_grabber_connection.reset(); @@ -210,7 +210,7 @@ void GLGizmoCut::on_render() glsafe(::glEnd()); GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -221,7 +221,7 @@ void GLGizmoCut::on_render() shader->stop_using(); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("flat_attr"); #else @@ -229,7 +229,7 @@ void GLGizmoCut::on_render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); @@ -243,10 +243,10 @@ void GLGizmoCut::on_render() #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLGizmoCut::on_render_for_picking() @@ -409,11 +409,11 @@ void GLGizmoCut::update_contours() const Polygons polys = slice_mesh(m_cut_contours.mesh.its, m_cut_z, slicing_params); if (!polys.empty()) { m_cut_contours.contours.init_from(polys, static_cast(m_cut_z)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cut_contours.contours.set_color(ColorRGBA::WHITE()); #else m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } else if (box.center() != m_cut_contours.position) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index feb23bf450..d81b53e5f0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -23,11 +23,11 @@ class GLGizmoCut : public GLGizmoBase bool m_keep_upper{ true }; bool m_keep_lower{ true }; bool m_rotate_lower{ false }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_plane; GLModel m_grabber_connection; Vec3d m_old_center; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL struct CutContours { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index b8c4ecd41e..bd0d87f0a8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -103,7 +103,7 @@ void GLGizmoHollow::on_render_for_picking() void GLGizmoHollow::render_points(const Selection& selection, bool picking) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else @@ -119,7 +119,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) if (shader) shader->start_using(); ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -166,11 +166,11 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) render_color = point_selected ? ColorRGBA(1.0f, 0.3f, 0.3f, 0.5f) : ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cylinder.set_color(render_color); #else const_cast(&m_cylinder)->set_color(-1, render_color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index abff4248c1..414f4de7b4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -614,7 +614,7 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) m_gizmo_scene.render(color_idx); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_paint_contour(matrix); #else @@ -634,7 +634,7 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) contour_shader->stop_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_update_render_data = false; } @@ -669,7 +669,7 @@ void TriangleSelectorMmGui::update_render_data() m_gizmo_scene.finalize_triangle_indices(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL update_paint_contour(); #else m_paint_contour.release_geometry(); @@ -690,7 +690,7 @@ void TriangleSelectorMmGui::update_render_data() m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); m_paint_contour.finalize_geometry(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } wxString GLGizmoMmuSegmentation::handle_snapshot_action_name(bool shift_down, GLGizmoPainterBase::Button button_down) const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 453b0c8378..325073fba9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -124,7 +124,7 @@ void GLGizmoMove3D::on_render() glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL auto render_grabber_connection = [this, ¢er](unsigned int id) { if (m_grabbers[id].enabled) { if (!m_grabber_connections[id].model.is_initialized() || !m_grabber_connections[id].old_center.isApprox(center)) { @@ -150,10 +150,10 @@ void GLGizmoMove3D::on_render() m_grabber_connections[id].model.render(); } }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (m_hover_id == -1) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -161,7 +161,7 @@ void GLGizmoMove3D::on_render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); @@ -171,7 +171,7 @@ void GLGizmoMove3D::on_render() // draw axes for (unsigned int i = 0; i < 3; ++i) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL render_grabber_connection(i); #else if (m_grabbers[i].enabled) { @@ -181,13 +181,13 @@ void GLGizmoMove3D::on_render() ::glVertex3dv(m_grabbers[i].center.data()); glsafe(::glEnd()); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // draw grabbers render_grabbers(box); @@ -198,7 +198,7 @@ void GLGizmoMove3D::on_render() } else { // draw axis -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -230,7 +230,7 @@ void GLGizmoMove3D::on_render() glsafe(::glEnd()); GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -285,7 +285,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); const double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else @@ -293,11 +293,11 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader == nullptr) return; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color); shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -307,7 +307,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box shader->start_using(); shader->set_uniform("emission_factor", 0.1f); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); @@ -337,9 +337,9 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (! picking) -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 7c7ee0486f..92729c1990 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -18,14 +18,14 @@ class GLGizmoMove3D : public GLGizmoBase Vec3d m_starting_box_bottom_center{ Vec3d::Zero() }; GLModel m_cone; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL struct GrabberConnection { GLModel model; Vec3d old_center{ Vec3d::Zero() }; }; std::array m_grabber_connections; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL public: GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index a9e869601b..e577218e96 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -196,10 +196,10 @@ void GLGizmoPainterBase::render_cursor_circle() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.5f)); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL static const std::array color = { 0.f, 1.f, 0.3f }; glsafe(::glColor3fv(color.data())); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisable(GL_DEPTH_TEST)); #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -216,7 +216,7 @@ void GLGizmoPainterBase::render_cursor_circle() glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { m_old_cursor_radius = radius; @@ -269,7 +269,7 @@ void GLGizmoPainterBase::render_cursor_circle() for (double angle=0; angle<2*M_PI; angle+=M_PI/20.) ::glVertex2f(GLfloat(center.x()+m_cursor_radius*cos(angle)), GLfloat(center.y()+m_cursor_radius*sin(angle))); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -968,7 +968,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) } #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_paint_contour(matrix); #else @@ -988,7 +988,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) contour_shader->stop_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG if (imgui) @@ -1082,7 +1082,7 @@ void TriangleSelectorGUI::update_render_data() iva.finalize_geometry(true); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL update_paint_contour(); #else m_paint_contour.release_geometry(); @@ -1103,10 +1103,10 @@ void TriangleSelectorGUI::update_render_data() m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); m_paint_contour.finalize_geometry(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL void GLPaintContour::render() const { assert(this->m_contour_VBO_id != 0); @@ -1164,7 +1164,7 @@ void GLPaintContour::release_geometry() } this->clear(); } -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) @@ -1340,7 +1340,7 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) } #endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void TriangleSelectorGUI::update_paint_contour() { m_paint_contour.reset(); @@ -1404,6 +1404,6 @@ void TriangleSelectorGUI::render_paint_contour() if (curr_shader != nullptr) curr_shader->start_using(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index e3b5d0ea72..b2742a9ad2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -33,7 +33,7 @@ enum class PainterGizmoType { MMU_SEGMENTATION }; -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL class GLPaintContour { public: @@ -69,7 +69,7 @@ public: GLuint m_contour_VBO_id{0}; GLuint m_contour_EBO_id{0}; }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL class TriangleSelectorGUI : public TriangleSelector { public: @@ -118,7 +118,7 @@ private: #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL protected: -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_paint_contour; void update_paint_contour(); @@ -129,7 +129,7 @@ protected: #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #else GLPaintContour m_paint_contour; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; @@ -212,11 +212,11 @@ protected: bool m_paint_on_overhangs_only = false; float m_highlight_by_angle_threshold_deg = 0.f; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_circle; Vec2d m_old_center{ Vec2d::Zero() }; float m_old_cursor_radius{ 0.0f }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL static constexpr float SmartFillAngleMin = 0.0f; static constexpr float SmartFillAngleMax = 90.f; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 8a7d784454..70c94223d7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -171,7 +171,7 @@ void GLGizmoRotate::on_render() #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -221,7 +221,7 @@ void GLGizmoRotate::on_render() if (m_hover_id != -1) render_angle(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); @@ -286,13 +286,13 @@ void GLGizmoRotate3D::load_rotoptimize_state() } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_circle(const ColorRGBA& color, bool radius_changed) #else void GLGizmoRotate::render_circle() const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_circle.is_initialized() || radius_changed) { m_circle.reset(); @@ -323,19 +323,19 @@ void GLGizmoRotate::render_circle() const ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); } glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_scale(const ColorRGBA& color, bool radius_changed) #else void GLGizmoRotate::render_scale() const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { const float out_radius_long = m_snap_fine_out_radius; const float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_scale.is_initialized() || radius_changed) { m_scale.reset(); @@ -381,20 +381,20 @@ void GLGizmoRotate::render_scale() const ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); } glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_snap_radii(const ColorRGBA& color, bool radius_changed) #else void GLGizmoRotate::render_snap_radii() const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { const float step = 2.0f * float(PI) / float(SnapRegionsCount); const float in_radius = m_radius / 3.0f; const float out_radius = 2.0f * in_radius; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_snap_radii.is_initialized() || radius_changed) { m_snap_radii.reset(); @@ -440,10 +440,10 @@ void GLGizmoRotate::render_snap_radii() const ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); } glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_reference_radius(const ColorRGBA& color, bool radius_changed) { if (!m_reference_radius.is_initialized() || radius_changed) { @@ -475,18 +475,18 @@ void GLGizmoRotate::render_reference_radius() const ::glVertex3f((GLfloat)(m_radius * (1.0f + GrabberOffset)), 0.0f, 0.0f); glsafe(::glEnd()); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_angle_arc(const ColorRGBA& color, bool radius_changed) #else void GLGizmoRotate::render_angle() const -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { const float step_angle = float(m_angle) / float(AngleResolution); const float ex_radius = m_radius * (1.0f + GrabberOffset); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const bool angle_changed = std::abs(m_old_angle - m_angle) > EPSILON; m_old_angle = m_angle; @@ -521,10 +521,10 @@ void GLGizmoRotate::render_angle() const ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); } glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_grabber_connection(const ColorRGBA& color, bool radius_changed) { if (!m_grabber_connection.model.is_initialized() || radius_changed || !m_grabber_connection.old_center.isApprox(m_grabbers.front().center)) { @@ -549,11 +549,11 @@ void GLGizmoRotate::render_grabber_connection(const ColorRGBA& color, bool radiu m_grabber_connection.model.set_color(color); m_grabber_connection.model.render(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) { -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL const double grabber_radius = double(m_radius) * (1.0 + double(GrabberOffset)); m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); m_grabbers[0].angles.z() = m_angle; @@ -564,7 +564,7 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) ::glVertex3f(0.0f, 0.0f, 0.0f); ::glVertex3dv(m_grabbers[0].center.data()); glsafe(::glEnd()); -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL m_grabbers.front().color = m_highlight_color; render_grabbers(box); @@ -575,7 +575,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); const double size = m_dragging ? double(m_grabbers.front().get_dragging_half_size(mean_size)) : double(m_grabbers.front().get_half_size(mean_size)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else @@ -598,7 +598,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick shader->start_using(); shader->set_uniform("emission_factor", 0.1f); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const Vec3d& center = m_grabbers.front().center; @@ -643,9 +643,9 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (! picking) -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 59a06524a4..8968fef8d2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -36,7 +36,7 @@ private: float m_snap_fine_out_radius{ 0.0f }; GLModel m_cone; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_circle; GLModel m_scale; GLModel m_snap_radii; @@ -51,7 +51,7 @@ private: float m_old_radius{ 0.0f }; float m_old_hover_radius{ 0.0f }; float m_old_angle{ 0.0f }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL ColorRGBA m_drag_color; ColorRGBA m_highlight_color; @@ -89,7 +89,7 @@ protected: void on_render_for_picking() override; private: -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_circle(const ColorRGBA& color, bool radius_changed); void render_scale(const ColorRGBA& color, bool radius_changed); void render_snap_radii(const ColorRGBA& color, bool radius_changed); @@ -102,7 +102,7 @@ private: void render_snap_radii() const; void render_reference_radius() const; void render_angle() const; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void render_grabber(const BoundingBoxf3& box); void render_grabber_extension(const BoundingBoxf3& box, bool picking); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 62239508d2..0dfe2e2d35 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -25,7 +25,7 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filen , m_drag_color(DEFAULT_DRAG_COLOR) , m_highlight_color(DEFAULT_HIGHLIGHT_COLOR) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_grabber_connections[0].grabber_indices = { 0, 1 }; m_grabber_connections[1].grabber_indices = { 2, 3 }; m_grabber_connections[2].grabber_indices = { 4, 5 }; @@ -33,7 +33,7 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filen m_grabber_connections[4].grabber_indices = { 7, 8 }; m_grabber_connections[5].grabber_indices = { 8, 9 }; m_grabber_connections[6].grabber_indices = { 9, 6 }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } std::string GLGizmoScale3D::get_tooltip() const @@ -263,7 +263,7 @@ void GLGizmoScale3D::on_render() const float grabber_mean_size = (float)((selection_box.size().x() + selection_box.size().y() + selection_box.size().z()) / 3.0); if (m_hover_id == -1) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); @@ -308,13 +308,13 @@ void GLGizmoScale3D::on_render() render_grabbers_connection(7, 8); render_grabbers_connection(8, 9); render_grabbers_connection(9, 6); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // draw grabbers render_grabbers(grabber_mean_size); } else if (m_hover_id == 0 || m_hover_id == 1) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); @@ -345,7 +345,7 @@ void GLGizmoScale3D::on_render() // draw grabbers GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -355,7 +355,7 @@ void GLGizmoScale3D::on_render() } } else if (m_hover_id == 2 || m_hover_id == 3) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); @@ -386,7 +386,7 @@ void GLGizmoScale3D::on_render() // draw grabbers GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -396,7 +396,7 @@ void GLGizmoScale3D::on_render() } } else if (m_hover_id == 4 || m_hover_id == 5) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); @@ -427,7 +427,7 @@ void GLGizmoScale3D::on_render() // draw grabbers GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -437,7 +437,7 @@ void GLGizmoScale3D::on_render() } } else if (m_hover_id >= 6) { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); @@ -474,7 +474,7 @@ void GLGizmoScale3D::on_render() // draw grabbers GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.1f); @@ -492,7 +492,7 @@ void GLGizmoScale3D::on_render_for_picking() render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color) { auto grabber_connection = [this](unsigned int id_1, unsigned int id_2) { @@ -543,7 +543,7 @@ void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int glsafe(::glEnd()); } } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index e0a49cdbf2..f4efe052a5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -33,7 +33,7 @@ class GLGizmoScale3D : public GLGizmoBase double m_snap_step{ 0.05 }; StartingData m_starting; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL struct GrabberConnection { GLModel model; @@ -42,7 +42,7 @@ class GLGizmoScale3D : public GLGizmoBase Vec3d old_v2{ Vec3d::Zero() }; }; std::array m_grabber_connections; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL ColorRGBA m_base_color; ColorRGBA m_drag_color; @@ -77,11 +77,11 @@ protected: virtual void on_render_for_picking() override; private: -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color); #else void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void do_scale_along_axis(Axis axis, const UpdateData& data); void do_scale_uniform(const UpdateData& data); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 252f5a1859..5ac9df549f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -651,7 +651,7 @@ void GLGizmoSimplify::init_model() } assert(volume != nullptr); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // set actual triangle count m_triangle_count += volume->mesh().its.indices.size(); #else @@ -659,17 +659,17 @@ void GLGizmoSimplify::init_model() // set actual triangle count m_triangle_count += its.indices.size(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL assert(m_glmodels.find(id) == m_glmodels.end()); GLModel &glmodel = m_glmodels[id]; // create new glmodel -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL glmodel.init_from(volume->mesh()); glmodel.set_color(selected_volume->color); #else glmodel.init_from(its); glmodel.set_color(-1,selected_volume->color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_parent.toggle_model_objects_visibility(false, info->model_object(), info->get_active_instance(), @@ -698,11 +698,11 @@ void GLGizmoSimplify::update_model(const State::Data &data) // when not reset it keeps old shape glmodel.reset(); glmodel.init_from(its); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL glmodel.set_color(color); #else glmodel.set_color(-1, color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_triangle_count += its.indices.size(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 925f8d30de..60f1731f3e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -129,7 +129,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (! has_points && ! has_holes) return; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else @@ -148,7 +148,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (shader != nullptr) shader->stop_using(); }); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); @@ -199,7 +199,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cone.set_color(render_color); m_sphere.set_color(render_color); if (!picking) @@ -207,7 +207,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) m_cone.set_color(-1, render_color); m_sphere.set_color(-1, render_color); if (shader && !picking) -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("emission_factor", 0.5f); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. @@ -281,12 +281,12 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) // Now render the drain holes: if (has_holes && ! picking) { render_color = { 0.7f, 0.7f, 0.7f, 0.7f }; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_cylinder.set_color(render_color); #else m_cylinder.set_color(-1, render_color); if (shader != nullptr) -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("emission_factor", 0.5f); for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { if (is_mesh_point_clipped(drain_hole.pos.cast())) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 28cd8780a1..225aa97779 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -34,7 +34,7 @@ public: Rect() = default; Rect(float left, float top, float right, float bottom) : m_left(left) , m_top(top) , m_right(right) , m_bottom(bottom) {} -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool operator == (const Rect& other) const { if (std::abs(m_left - other.m_left) > EPSILON) return false; if (std::abs(m_top - other.m_top) > EPSILON) return false; @@ -43,7 +43,7 @@ public: return true; } bool operator != (const Rect& other) const { return !operator==(other); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL float get_left() const { return m_left; } void set_left(float left) { m_left = left; } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 97f7379075..c6bc939a12 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1260,11 +1260,11 @@ void Selection::render(float scale_factor) m_scale_factor = scale_factor; // render cumulative bounding box of selected volumes -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL render_bounding_box(get_bounding_box(), ColorRGB::WHITE()); #else render_selected_volumes(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL render_synchronized_volumes(); } @@ -1274,7 +1274,7 @@ void Selection::render_center(bool gizmo_is_dragging) if (!m_valid || is_empty()) return; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -1284,7 +1284,7 @@ void Selection::render_center(bool gizmo_is_dragging) return; shader->start_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center(); @@ -1301,20 +1301,20 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glTranslated(center.x(), center.y(), center.z())); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_vbo_sphere.set_color(ColorRGBA::WHITE()); #else m_vbo_sphere.set_color(-1, ColorRGBA::WHITE()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_vbo_sphere.render(); #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #endif // ENABLE_RENDER_SELECTION_CENTER @@ -1323,7 +1323,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) if (sidebar_field.empty()) return; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light_attr"); #else @@ -1344,7 +1344,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) shader->start_using(); glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_DEPTH_TEST)); @@ -1415,10 +1415,10 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (boost::starts_with(sidebar_field, "position")) @@ -1442,9 +1442,9 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glPopMatrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } @@ -1881,22 +1881,22 @@ void Selection::do_remove_object(unsigned int object_idx) } } -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_selected_volumes() const { float color[3] = { 1.0f, 1.0f, 1.0f }; render_bounding_box(get_bounding_box(), color); } -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_synchronized_volumes() { if (m_mode == Instance) return; -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL float color[3] = { 1.0f, 1.0f, 0.0f }; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL for (unsigned int i : m_list) { const GLVolume& volume = *(*m_volumes)[i]; @@ -1910,16 +1910,16 @@ void Selection::render_synchronized_volumes() if (v.object_idx() != object_idx || v.volume_idx() != volume_idx) continue; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL render_bounding_box(v.transformed_convex_hull_bounding_box(), ColorRGB::YELLOW()); #else render_bounding_box(v.transformed_convex_hull_bounding_box(), color); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } } -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_bounding_box(const BoundingBoxf3& box, const ColorRGB& color) { #else @@ -1935,9 +1935,9 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glColor3fv(color)); glsafe(::glLineWidth(2.0f * m_scale_factor)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const BoundingBoxf3& curr_box = m_box.get_bounding_box(); if (!m_box.is_initialized() || !is_approx(box.min, curr_box.min) || !is_approx(box.max, curr_box.max)) { m_box.reset(); @@ -2073,7 +2073,7 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0), b_max(1), b_max(2) - size(2)); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } static ColorRGBA get_color(Axis axis) @@ -2087,7 +2087,7 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field, void Selection::render_sidebar_position_hints(const std::string& sidebar_field) #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_matrix = camera.get_view_matrix() * matrix; @@ -2139,7 +2139,7 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field) m_arrow.set_color(-1, get_color(Z)); m_arrow.render(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -2148,7 +2148,7 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field, void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES { -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES auto render_sidebar_rotation_hint = [this](GLShaderProgram& shader, const Transform3d& matrix) { Transform3d view_model_matrix = matrix; @@ -2223,7 +2223,7 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) m_curved_arrow.set_color(-1, get_color(Z)); render_sidebar_rotation_hint(); } -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -2239,11 +2239,11 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) #else auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #else m_arrow.set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Transform3d view_model_matrix = matrix * Geometry::assemble_transform(5.0 * Vec3d::UnitY()); @@ -2343,29 +2343,29 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) const BoundingBoxf3& box = get_bounding_box(); -#if !ENABLE_GLBEGIN_GLEND_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL const float min_x = float(box.min.x()) - Margin; const float max_x = float(box.max.x()) + Margin; const float min_y = float(box.min.y()) - Margin; const float max_y = float(box.max.y()) + Margin; -#endif // !ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // view dependend order of rendering to keep correct transparency const bool camera_on_top = wxGetApp().plater()->get_camera().is_looking_downward(); const float z1 = camera_on_top ? min_z : max_z; const float z2 = camera_on_top ? max_z : min_z; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const Vec3f p1 = { float(box.min.x()) - Margin, float(box.min.y()) - Margin, z1 }; const Vec3f p2 = { float(box.max.x()) + Margin, float(box.max.y()) + Margin, z2 }; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glDisable(GL_CULL_FACE)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_planes.models[0].is_initialized() || !is_approx(m_planes.check_points[0], p1)) { m_planes.check_points[0] = p1; m_planes.models[0].reset(); @@ -2436,7 +2436,7 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) ::glVertex3f(max_x, max_y, z2); ::glVertex3f(min_x, max_y, z2); glsafe(::glEnd()); -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_CULL_FACE)); glsafe(::glDisable(GL_BLEND)); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 392d2f9f30..594f70f4a9 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -218,7 +218,7 @@ private: GLModel m_arrow; GLModel m_curved_arrow; -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_box; struct Planes { @@ -226,7 +226,7 @@ private: std::array models; }; Planes m_planes; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL float m_scale_factor; @@ -370,12 +370,12 @@ private: void do_remove_object(unsigned int object_idx); void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); } void render_synchronized_volumes(); -#if ENABLE_GLBEGIN_GLEND_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_bounding_box(const BoundingBoxf3& box, const ColorRGB& color); #else void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; -#endif // ENABLE_GLBEGIN_GLEND_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); From 5ffe010a9dbe2d61c3ecdd69e632d50cfcfab686 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 8 Mar 2022 14:50:32 +0100 Subject: [PATCH 089/149] Tech ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL merged into ENABLE_LEGACY_OPENGL_REMOVAL --- src/libslic3r/BuildVolume.hpp | 4 +- src/libslic3r/Technologies.hpp | 4 +- src/slic3r/GUI/3DScene.cpp | 102 +++++----- src/slic3r/GUI/3DScene.hpp | 44 ++-- src/slic3r/GUI/GCodeViewer.cpp | 24 +-- src/slic3r/GUI/GCodeViewer.hpp | 8 +- src/slic3r/GUI/GLCanvas3D.cpp | 200 +++++++++---------- src/slic3r/GUI/GLModel.cpp | 136 +++++++------ src/slic3r/GUI/GLModel.hpp | 30 +-- src/slic3r/GUI/GalleryDialog.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 32 +-- src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 92 +++++---- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 16 +- src/slic3r/GUI/MeshUtils.cpp | 18 +- src/slic3r/GUI/MeshUtils.hpp | 12 +- src/slic3r/Utils/UndoRedo.cpp | 4 +- 18 files changed, 369 insertions(+), 381 deletions(-) diff --git a/src/libslic3r/BuildVolume.hpp b/src/libslic3r/BuildVolume.hpp index be8d224c39..b4ac118eca 100644 --- a/src/libslic3r/BuildVolume.hpp +++ b/src/libslic3r/BuildVolume.hpp @@ -95,10 +95,10 @@ public: bool all_paths_inside_vertices_and_normals_interleaved(const std::vector& paths, const Eigen::AlignedBox& bbox, bool ignore_bottom = true) const; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL const std::pair, std::vector>& top_bottom_convex_hull_decomposition_scene() const { return m_top_bottom_convex_hull_decomposition_scene; } const std::pair, std::vector>& top_bottom_convex_hull_decomposition_bed() const { return m_top_bottom_convex_hull_decomposition_bed; } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: // Source definition of the print bed geometry (PrintConfig::bed_shape) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 0c2d2f6909..518cf08381 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -68,10 +68,8 @@ #define ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable removal of legacy OpenGL calls #define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) -// Enable replace GLIndexedVertexArray with GLModel -#define ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL (1 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable using vertex attributes and matrices in shaders -#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL) +#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable show non-manifold edges #define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index b586848f65..f903bf4828 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1,12 +1,12 @@ #include -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS #include #include #include #endif // ENABLE_SMOOTH_NORMALS -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #include "3DScene.hpp" #include "GLShader.hpp" @@ -74,7 +74,7 @@ void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char namespace Slic3r { -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS static void smooth_normals_corner(TriangleMesh& mesh, std::vector& normals) { @@ -293,7 +293,7 @@ void GLIndexedVertexArray::render( glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL const float GLVolume::SinkingContours::HalfWidth = 0.25f; @@ -514,9 +514,9 @@ GLVolume::GLVolume(float r, float g, float b, float a) , force_neutral_color(false) , force_sinking_contours(false) , tverts_range(0, size_t(-1)) -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL , qverts_range(0, size_t(-1)) -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL { color = { r, g, b, a }; set_render_color(color); @@ -632,7 +632,7 @@ const BoundingBoxf3& GLVolume::transformed_non_sinking_bounding_box() const return *m_transformed_non_sinking_bounding_box; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLVolume::set_range(double min_z, double max_z) { this->tverts_range.first = 0; @@ -698,7 +698,7 @@ void GLVolume::set_range(double min_z, double max_z) } } } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void GLVolume::render() { @@ -719,14 +719,14 @@ void GLVolume::render() glsafe(::glMultMatrixd(world_matrix().data())); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (tverts_range == std::make_pair(0, -1)) model.render(); else model.render(this->tverts_range); #else this->indexed_vertex_array.render(this->tverts_range, this->qverts_range); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); @@ -764,7 +764,7 @@ void GLVolume::render_non_manifold_edges() } #endif // ENABLE_SHOW_NON_MANIFOLD_EDGES -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::vector GLVolumeCollection::load_object( const ModelObject* model_object, int obj_idx, @@ -775,20 +775,20 @@ std::vector GLVolumeCollection::load_object( int obj_idx, const std::vector &instance_idxs, bool opengl_initialized) -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { std::vector volumes_idx; for (int volume_idx = 0; volume_idx < int(model_object->volumes.size()); ++volume_idx) for (int instance_idx : instance_idxs) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volumes_idx.emplace_back(this->GLVolumeCollection::load_object_volume(model_object, obj_idx, volume_idx, instance_idx)); #else volumes_idx.emplace_back(this->GLVolumeCollection::load_object_volume(model_object, obj_idx, volume_idx, instance_idx, opengl_initialized)); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return volumes_idx; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL int GLVolumeCollection::load_object_volume( const ModelObject* model_object, int obj_idx, @@ -801,7 +801,7 @@ int GLVolumeCollection::load_object_volume( int volume_idx, int instance_idx, bool opengl_initialized) -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { const ModelVolume *model_volume = model_object->volumes[volume_idx]; const int extruder_id = model_volume->extruder_id(); @@ -810,7 +810,7 @@ int GLVolumeCollection::load_object_volume( this->volumes.emplace_back(new GLVolume()); GLVolume& v = *this->volumes.back(); v.set_color(color_from_model_volume(*model_volume)); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS v.model.init_from(mesh, true); #else @@ -823,7 +823,7 @@ int GLVolumeCollection::load_object_volume( v.indexed_vertex_array.load_mesh(mesh); #endif // ENABLE_SMOOTH_NORMALS v.indexed_vertex_array.finalize_geometry(opengl_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL v.composite_id = GLVolume::CompositeID(obj_idx, volume_idx, instance_idx); if (model_volume->is_model_part()) { // GLVolume will reference a convex hull from model_volume! @@ -842,7 +842,7 @@ int GLVolumeCollection::load_object_volume( // Load SLA auxiliary GLVolumes (for support trees or pad). // This function produces volumes for multiple instances in a single shot, // as some object specific mesh conversions may be expensive. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLVolumeCollection::load_object_auxiliary( const SLAPrintObject* print_object, int obj_idx, @@ -861,7 +861,7 @@ void GLVolumeCollection::load_object_auxiliary( // Timestamp of the last change of the milestone size_t timestamp, bool opengl_initialized) -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { assert(print_object->is_step_done(milestone)); Transform3d mesh_trafo_inv = print_object->trafo().inverse(); @@ -874,7 +874,7 @@ void GLVolumeCollection::load_object_auxiliary( const ModelInstance& model_instance = *print_object->model_object()->instances[instance_idx.first]; this->volumes.emplace_back(new GLVolume((milestone == slaposPad) ? GLVolume::SLA_PAD_COLOR : GLVolume::SLA_SUPPORT_COLOR)); GLVolume& v = *this->volumes.back(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS v.model.init_from(mesh, true); #else @@ -888,7 +888,7 @@ void GLVolumeCollection::load_object_auxiliary( v.indexed_vertex_array.load_mesh(mesh); #endif // ENABLE_SMOOTH_NORMALS v.indexed_vertex_array.finalize_geometry(opengl_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL v.composite_id = GLVolume::CompositeID(obj_idx, -int(milestone), (int)instance_idx.first); v.geometry_id = std::pair(timestamp, model_instance.id().id); // Create a copy of the convex hull mesh for each instance. Use a move operator on the last instance. @@ -904,7 +904,7 @@ void GLVolumeCollection::load_object_auxiliary( } } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL int GLVolumeCollection::load_wipe_tower_preview( float pos_x, float pos_y, float width, float depth, float height, @@ -924,7 +924,7 @@ int GLVolumeCollection::load_wipe_tower_preview( int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized) #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (depth < 0.01f) return int(this->volumes.size() - 1); @@ -981,16 +981,16 @@ int GLVolumeCollection::load_wipe_tower_preview( volumes.emplace_back(new GLVolume(color)); GLVolume& v = *volumes.back(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL v.model.init_from(mesh); v.model.set_color(color); #else v.indexed_vertex_array.load_mesh(mesh); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL v.set_convex_hull(mesh.convex_hull_3d()); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL v.indexed_vertex_array.finalize_geometry(opengl_initialized); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL v.set_volume_offset(Vec3d(pos_x, pos_y, 0.0)); v.set_volume_rotation(Vec3d(0., 0., (M_PI / 180.) * rotation_angle)); #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL @@ -1005,7 +1005,7 @@ int GLVolumeCollection::load_wipe_tower_preview( return int(volumes.size() - 1); } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLVolume* GLVolumeCollection::new_toolpath_volume(const ColorRGBA& rgba) { GLVolume* out = new_nontoolpath_volume(rgba); @@ -1037,7 +1037,7 @@ GLVolume* GLVolumeCollection::new_nontoolpath_volume(const ColorRGBA& rgba, size this->volumes.emplace_back(out); return out; } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function filter_func) { @@ -1139,10 +1139,12 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL - if (!volume.first->model.is_initialized()) -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL - shader->set_uniform("uniform_color", volume.first->render_color); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//#if ENABLE_LEGACY_OPENGL_REMOVAL +// if (!volume.first->model.is_initialized()) +//#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +// shader->set_uniform("uniform_color", volume.first->render_color); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ shader->set_uniform("z_range", m_z_range, 2); shader->set_uniform("clipping_plane", m_clipping_plane, 4); shader->set_uniform("print_volume.type", static_cast(m_print_volume.type)); @@ -1162,9 +1164,9 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #endif // ENABLE_ENVIRONMENT_MAP glcheck(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(volume.first->render_color); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Transform3d matrix = view_matrix * volume.first->world_matrix(); shader->set_uniform("view_model_matrix", matrix); @@ -1408,7 +1410,7 @@ std::string GLVolumeCollection::log_memory_info() const return " (GLVolumeCollection RAM: " + format_memsize_MB(this->cpu_memory_used()) + " GPU: " + format_memsize_MB(this->gpu_memory_used()) + " Both: " + format_memsize_MB(this->gpu_memory_used()) + ")"; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static void thick_lines_to_geometry( const Lines& lines, const std::vector& widths, @@ -2377,9 +2379,9 @@ static void point_to_indexed_vertex_array(const Vec3crd& point, volume.push_triangle(idxs[3], idxs[1], idxs[4]); volume.push_triangle(idxs[0], idxs[3], idxs[4]); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::thick_lines_to_verts( const Lines& lines, const std::vector& widths, @@ -2442,10 +2444,10 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionPath &extrusion_path, flo { extrusionentity_to_verts(extrusion_path.polyline, extrusion_path.width, extrusion_path.height, print_z, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Fill in the qverts and tverts with quads and triangles for the extrusion_path. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry) { Polyline polyline = extrusion_path.polyline; @@ -2467,10 +2469,10 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionPath &extrusion_path, flo std::vector heights(lines.size(), extrusion_path.height); thick_lines_to_verts(lines, widths, heights, false, print_z, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Fill in the qverts and tverts with quads and triangles for the extrusion_loop. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry) { Lines lines; @@ -2504,10 +2506,10 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionLoop &extrusion_loop, flo } thick_lines_to_verts(lines, widths, heights, true, print_z, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Fill in the qverts and tverts with quads and triangles for the extrusion_multi_path. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry) { Lines lines; @@ -2541,9 +2543,9 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionMultiPath &extrusion_mult } thick_lines_to_verts(lines, widths, heights, false, print_z, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry) { for (const ExtrusionEntity* extrusion_entity : extrusion_entity_collection.entities) @@ -2555,9 +2557,9 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionEntityCollection &extrusi for (const ExtrusionEntity *extrusion_entity : extrusion_entity_collection.entities) extrusionentity_to_verts(extrusion_entity, print_z, copy, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void _3DScene::extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry) { if (extrusion_entity != nullptr) { @@ -2622,6 +2624,6 @@ void _3DScene::point3_to_verts(const Vec3crd& point, double width, double height { thick_point_to_verts(point, width, height, volume); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace Slic3r diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 83ff907c20..bab1817585 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -46,7 +46,7 @@ enum ModelInstanceEPrintVolumeState : unsigned char; // Return appropriate color based on the ModelVolume. extern ColorRGBA color_from_model_volume(const ModelVolume& model_volume); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL // A container for interleaved arrays of 3D vertices and normals, // possibly indexed by triangles and / or quads. class GLIndexedVertexArray { @@ -247,7 +247,7 @@ public: private: BoundingBox m_bounding_box; }; -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL class GLVolume { public: @@ -390,17 +390,17 @@ public: // Is mouse or rectangle selection over this object to select/deselect it ? EHoverState hover; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GUI::GLModel model; #else // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Ranges of triangle and quad indices to be rendered. std::pair tverts_range; -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL std::pair qverts_range; -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts // of the extrusions per layer. @@ -410,7 +410,7 @@ public: // Bounding box of this volume, in unscaled coordinates. BoundingBoxf3 bounding_box() const { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL return this->model.get_bounding_box(); #else BoundingBoxf3 out; @@ -420,7 +420,7 @@ public: out.defined = true; } return out; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void set_color(const ColorRGBA& rgba) { color = rgba; } @@ -510,20 +510,20 @@ public: // convex hull const TriangleMesh* convex_hull() const { return m_convex_hull.get(); } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool empty() const { return this->model.is_empty(); } #else bool empty() const { return this->indexed_vertex_array.empty(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void set_range(double low, double high); void render(); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); } void release_geometry() { this->indexed_vertex_array.release_geometry(); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL void set_bounding_boxes_as_dirty() { m_transformed_bounding_box.reset(); @@ -543,7 +543,7 @@ public: // Return an estimate of the memory consumed by this class. size_t cpu_memory_used() const { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL return sizeof(*this) + this->model.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + this->offsets.capacity() * sizeof(size_t); } @@ -555,7 +555,7 @@ public: } // Return an estimate of the memory held by GPU vertex buffers. size_t gpu_memory_used() const { return this->indexed_vertex_array.gpu_memory_used(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } }; @@ -615,7 +615,7 @@ public: GLVolumeCollection() { set_default_slope_normal_z(); } ~GLVolumeCollection() { clear(); } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::vector load_object( const ModelObject* model_object, int obj_idx, @@ -676,15 +676,15 @@ public: int load_wipe_tower_preview( int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized); #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLVolume* new_toolpath_volume(const ColorRGBA& rgba); GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba); #else GLVolume* new_toolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Render the volumes by OpenGL. #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -694,7 +694,7 @@ public: void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const; #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL // Finalize the initialization of the geometry & indices, // upload the geometry and indices to OpenGL VBO objects // and shrink the allocated data, possibly relasing it if it has been loaded into the VBOs. @@ -702,7 +702,7 @@ public: // Release the geometry data assigned to the volumes. // If OpenGL VBOs were allocated, an OpenGL context has to be active to release them. void release_geometry() { for (auto *v : volumes) v->release_geometry(); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // Clear the geometry void clear() { for (auto *v : volumes) delete v; volumes.clear(); } @@ -752,7 +752,7 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo struct _3DScene { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static void thick_lines_to_verts(const Lines& lines, const std::vector& widths, const std::vector& heights, bool closed, double top_z, GUI::GLModel::Geometry& geometry); static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GUI::GLModel::Geometry& geometry); static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); @@ -772,7 +772,7 @@ struct _3DScene static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GLVolume& volume); static void polyline3_to_verts(const Polyline3& polyline, double width, double height, GLVolume& volume); static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5ad37d37d2..2b192f4093 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -757,11 +757,11 @@ void GCodeViewer::init() m_gl_data_initialized = true; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& print) #else void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& print, bool initialized) -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { // avoid processing if called with the same gcode_result #if ENABLE_VOLUMETRIC_RATE_TOOLPATHS_RECALC @@ -800,11 +800,11 @@ void GCodeViewer::load(const GCodeProcessorResult& gcode_result, const Print& pr m_filament_densities = gcode_result.filament_densities; if (wxGetApp().is_editor()) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL load_shells(print); #else load_shells(print, initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL else { Pointfs bed_shape; std::string texture; @@ -2354,11 +2354,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) progress_dialog->Destroy(); } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GCodeViewer::load_shells(const Print& print) #else void GCodeViewer::load_shells(const Print& print, bool initialized) -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (print.objects().empty()) // no shells, return @@ -2375,11 +2375,11 @@ void GCodeViewer::load_shells(const Print& print, bool initialized) } size_t current_volumes_count = m_shells.volumes.volumes.size(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_shells.volumes.load_object(model_obj, object_id, instance_ids); #else m_shells.volumes.load_object(model_obj, object_id, instance_ids, initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // adjust shells' z if raft is present const SlicingParameters& slicing_parameters = obj->slicing_parameters(); @@ -2403,7 +2403,7 @@ void GCodeViewer::load_shells(const Print& print, bool initialized) const float depth = print.wipe_tower_data(extruders_count).depth; const float brim_width = print.wipe_tower_data(extruders_count).brim_width; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL m_shells.volumes.load_wipe_tower_preview(config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, !print.is_step_done(psWipeTower), brim_width); @@ -2419,7 +2419,7 @@ void GCodeViewer::load_shells(const Print& print, bool initialized) m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, !print.is_step_done(psWipeTower), brim_width, initialized); #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } @@ -3400,7 +3400,7 @@ void GCodeViewer::render_shells() if (shader == nullptr) return; -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL // when the background processing is enabled, it may happen that the shells data have been loaded // before opengl has been initialized for the preview canvas. // when this happens, the volumes' data have not been sent to gpu yet. @@ -3408,7 +3408,7 @@ void GCodeViewer::render_shells() if (!v->indexed_vertex_array.has_VBOs()) v->finalize_geometry(true); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // glsafe(::glDepthMask(GL_FALSE)); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 678ccbd6e4..438fc55fd1 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -823,11 +823,11 @@ public: void init(); // extract rendering data from the given parameters -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void load(const GCodeProcessorResult& gcode_result, const Print& print); #else void load(const GCodeProcessorResult& gcode_result, const Print& print, bool initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // recalculate ranges in dependence of what is visible and sets tool/print colors void refresh(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors); #if ENABLE_PREVIEW_LAYOUT @@ -887,11 +887,11 @@ public: private: void load_toolpaths(const GCodeProcessorResult& gcode_result); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void load_shells(const Print& print); #else void load_shells(const Print& print, bool initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if !ENABLE_PREVIEW_LAYOUT void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const; #endif // !ENABLE_PREVIEW_LAYOUT diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2e09503398..cf2f679bfd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -87,11 +87,11 @@ static const Slic3r::ColorRGB ERROR_BG_LIGHT_COLOR = { 0.753f, 0.192f, 0.039f // Number of floats static constexpr const size_t MAX_VERTEX_BUFFER_SIZE = 131072 * 6; // 3.15MB // Reserve size in number of floats. -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL static constexpr const size_t VERTEX_BUFFER_RESERVE_SIZE = 131072 * 2; // 1.05MB // Reserve size in number of floats, maximum sum of all preallocated buffers. //static constexpr const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4; // 128MB -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL namespace Slic3r { namespace GUI { @@ -1305,11 +1305,11 @@ bool GLCanvas3D::init() if (m_main_toolbar.is_enabled()) m_layers_editing.init(); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL // on linux the gl context is not valid until the canvas is not shown on screen // we defer the geometry finalization of volumes until the first call to render() m_volumes.finalize_geometry(true); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL if (m_gizmos.is_enabled() && !m_gizmos.init()) std::cout << "Unable to initialize gizmos: please, check that all the required textures are available" << std::endl; @@ -1918,11 +1918,11 @@ std::vector GLCanvas3D::load_object(const ModelObject& model_object, int ob instance_idxs.emplace_back(i); } } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL return m_volumes.load_object(&model_object, obj_idx, instance_idxs); #else return m_volumes.load_object(&model_object, obj_idx, instance_idxs, m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } std::vector GLCanvas3D::load_object(const Model& model, int obj_idx) @@ -2147,11 +2147,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // Note the index of the loaded volume, so that we can reload the main model GLVolume with the hollowed mesh // later in this function. it->volume_idx = m_volumes.volumes.size(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx); #else m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_volumes.volumes.back()->geometry_id = key.geometry_id; update_object_list = true; } else { @@ -2208,48 +2208,48 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re GLVolume &volume = *m_volumes.volumes[it->volume_idx]; if (! volume.offsets.empty() && state.step[istep].timestamp != volume.offsets.front()) { // The backend either produced a new hollowed mesh, or it invalidated the one that the front end has seen. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.reset(); #else volume.indexed_vertex_array.release_geometry(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (state.step[istep].state == PrintStateBase::DONE) { TriangleMesh mesh = print_object->get_mesh(slaposDrillHoles); assert(! mesh.empty()); mesh.transform(sla_print->sla_trafo(*m_model->objects[volume.object_idx()]).inverse()); #if ENABLE_SMOOTH_NORMALS -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(mesh, true); #else volume.indexed_vertex_array.load_mesh(mesh, true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #else -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(mesh); #else volume.indexed_vertex_array.load_mesh(mesh); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_SMOOTH_NORMALS } else { // Reload the original volume. #if ENABLE_SMOOTH_NORMALS -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh(), true); #else volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh(), true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #else -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); #else volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_SMOOTH_NORMALS } -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL volume.finalize_geometry(true); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } //FIXME it is an ugly hack to write the timestamp into the "offsets" field to not have to add another member variable // to the GLVolume. We should refactor GLVolume significantly, so that the GLVolume will not contain member variables @@ -2279,11 +2279,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re for (size_t istep = 0; istep < sla_steps.size(); ++istep) if (!instances[istep].empty()) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp); #else m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp, m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed @@ -2313,7 +2313,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re float depth = print->wipe_tower_data(extruders_count).depth; float brim_width = print->wipe_tower_data(extruders_count).brim_width; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), @@ -2333,7 +2333,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re 1000, x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), brim_width, m_initialized); #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; } @@ -2393,7 +2393,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re m_dirty = true; } -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume& vol_old, bool gl_initialized, size_t prealloc_size = VERTEX_BUFFER_RESERVE_SIZE) { // Assign the large pre-allocated buffers to the new GLVolume. @@ -2408,15 +2408,15 @@ static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume& // Finalize the old geometry, possibly move data to the graphics card. vol_old.finalize_geometry(gl_initialized); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, const std::vector& str_tool_colors) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_gcode_viewer.load(gcode_result, *this->fff_print()); #else m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (wxGetApp().is_editor()) { m_gcode_viewer.update_shells_color_by_extruder(m_config); @@ -4535,11 +4535,11 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (GLVolume* vol : visible_volumes) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL vol->model.set_color((vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : ColorRGBA::ORANGE()) : ColorRGBA::GRAY()); #else shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? (current_printer_technology() == ptSLA ? vol->color : ColorRGBA::ORANGE()) : ColorRGBA::GRAY()); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // the volume may have been deactivated by an active gizmo const bool is_active = vol->is_active; vol->is_active = true; @@ -5815,7 +5815,7 @@ void GLCanvas3D::_render_overlays() void GLCanvas3D::_render_volumes_for_picking() const { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -5823,7 +5823,7 @@ void GLCanvas3D::_render_volumes_for_picking() const #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (shader == nullptr) return; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // do not cull backfaces to show broken geometry, if any glsafe(::glDisable(GL_CULL_FACE)); @@ -5842,21 +5842,21 @@ void GLCanvas3D::_render_volumes_for_picking() const // we reserve color = (0,0,0) for occluders (as the printbed) // so we shift volumes' id by 1 to get the proper color const unsigned int id = 1 + volume.second.first; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(picking_decode(id)); shader->start_using(); #else glsafe(::glColor4fv(picking_decode(id).data())); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * volume.first->world_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } @@ -6487,16 +6487,16 @@ void GLCanvas3D::_load_print_toolpaths(const BuildVolume &build_volume) skirt_height = std::min(skirt_height, print_zs.size()); print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLVolume* volume = m_volumes.new_toolpath_volume(color); GLModel::Geometry init_data; init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; #else GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (size_t i = 0; i < skirt_height; ++ i) { volume->print_zs.emplace_back(print_zs[i]); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume->offsets.emplace_back(init_data.indices_count()); if (i == 0) _3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), init_data); @@ -6507,28 +6507,28 @@ void GLCanvas3D::_load_print_toolpaths(const BuildVolume &build_volume) if (i == 0) _3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), *volume); _3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), *volume); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (init_data.vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { volume->model.init_from(std::move(init_data)); #else if (volume->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLVolume &vol = *volume; volume = m_volumes.new_toolpath_volume(vol.color); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL reserve_new_volume_finalize_old_volume(*volume, vol, m_initialized); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume->model.init_from(std::move(init_data)); volume->is_outside = !contains(build_volume, volume->model); #else volume->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(volume->indexed_vertex_array.vertices_and_normals_interleaved, volume->indexed_vertex_array.bounding_box()); volume->indexed_vertex_array.finalize_geometry(m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const BuildVolume& build_volume, const std::vector& str_tool_colors, const std::vector& color_print_values) @@ -6700,11 +6700,11 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c // Allocate the volume before locking. GLVolume *volume = new GLVolume(color); volume->is_extrusion_path = true; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // to prevent sending data to gpu (in the main thread) while // editing the model geometry volume->model.disable_render(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL tbb::spin_mutex::scoped_lock lock; // Lock by ROII, so if the emplace_back() fails, the lock will be released. lock.acquire(new_volume_mutex); @@ -6717,7 +6717,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c tbb::blocked_range(0, ctxt.layers.size(), grain_size), [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { GLVolumePtrs vols; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::vector geometries; auto select_geometry = [&ctxt, &geometries](size_t layer_idx, int extruder, int feature) -> GLModel::Geometry& { return geometries[ctxt.color_by_color_print() ? @@ -6736,23 +6736,23 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c feature ]; }; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (ctxt.color_by_color_print() || ctxt.color_by_tool()) { for (size_t i = 0; i < ctxt.number_tools(); ++i) { vols.emplace_back(new_volume(ctxt.color_tool(i))); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL geometries.emplace_back(GLModel::Geometry()); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } else { vols = { new_volume(ctxt.color_perimeters()), new_volume(ctxt.color_infill()), new_volume(ctxt.color_support()) }; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL geometries = { GLModel::Geometry(), GLModel::Geometry(), GLModel::Geometry() }; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL assert(vols.size() == geometries.size()); for (GLModel::Geometry& g : geometries) { g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; @@ -6761,7 +6761,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c for (GLVolume *vol : vols) // Reserving number of vertices (3x position + 3x color) vol->indexed_vertex_array.reserve(VERTEX_BUFFER_RESERVE_SIZE / 6); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { const Layer *layer = ctxt.layers[idx_layer]; @@ -6782,7 +6782,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c continue; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (size_t i = 0; i < vols.size(); ++i) { GLVolume* vol = vols[i]; if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) { @@ -6797,7 +6797,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c vol->offsets.emplace_back(vol->indexed_vertex_array.quad_indices.size()); vol->offsets.emplace_back(vol->indexed_vertex_array.triangle_indices.size()); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (const PrintInstance &instance : *ctxt.shifted_copies) { const Point © = instance.shift; @@ -6810,19 +6810,19 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c continue; } if (ctxt.has_perimeters) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, select_geometry(idx_layer, layerm->region().config().perimeter_extruder.value, 0)); #else _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, volume(idx_layer, layerm->region().config().perimeter_extruder.value, 0)); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (ctxt.has_infill) { for (const ExtrusionEntity *ee : layerm->fills.entities) { // fill represents infill extrusions of a single island. const auto *fill = dynamic_cast(ee); if (! fill->entities.empty()) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL _3DScene::extrusionentity_to_verts(*fill, float(layer->print_z), copy, select_geometry(idx_layer, is_solid_infill(fill->entities.front()->role()) ? layerm->region().config().solid_infill_extruder : @@ -6834,7 +6834,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c layerm->region().config().solid_infill_extruder : layerm->region().config().infill_extruder, 1)); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } } @@ -6842,7 +6842,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c const SupportLayer *support_layer = dynamic_cast(layer); if (support_layer) { for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL _3DScene::extrusionentity_to_verts(extrusion_entity, float(layer->print_z), copy, select_geometry(idx_layer, (extrusion_entity->role() == erSupportMaterial) ? support_layer->object()->config().support_material_extruder : @@ -6854,28 +6854,28 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c support_layer->object()->config().support_material_extruder : support_layer->object()->config().support_material_interface_extruder, 2)); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } } // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one. for (size_t i = 0; i < vols.size(); ++i) { GLVolume &vol = *vols[i]; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (geometries[i].vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { vol.model.init_from(std::move(geometries[i])); #else if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL vols[i] = new_volume(vol.color); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL reserve_new_volume_finalize_old_volume(*vols[i], vol, false); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (size_t i = 0; i < vols.size(); ++i) { if (!geometries[i].is_empty()) vols[i]->model.init_from(std::move(geometries[i])); @@ -6885,7 +6885,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c // Ideally one would call vol->indexed_vertex_array.finalize() here to move the buffers to the OpenGL driver, // but this code runs in parallel and the OpenGL driver is not thread safe. vol->indexed_vertex_array.shrink_to_fit(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }); BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); @@ -6900,14 +6900,14 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c } for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { GLVolume* v = m_volumes.volumes[i]; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL v->is_outside = !contains(build_volume, v->model); // We are done editinig the model, now it can be sent to gpu v->model.enable_render(); #else v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box()); v->indexed_vertex_array.finalize_geometry(m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); @@ -6972,11 +6972,11 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con auto new_volume = [this, &new_volume_mutex](const ColorRGBA& color) { auto *volume = new GLVolume(color); volume->is_extrusion_path = true; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // to prevent sending data to gpu (in the main thread) while // editing the model geometry volume->model.disable_render(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL tbb::spin_mutex::scoped_lock lock; lock.acquire(new_volume_mutex); m_volumes.volumes.emplace_back(volume); @@ -6990,25 +6990,25 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con [&ctxt, &new_volume](const tbb::blocked_range& range) { // Bounding box of this slab of a wipe tower. GLVolumePtrs vols; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::vector geometries; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (ctxt.color_by_tool()) { for (size_t i = 0; i < ctxt.number_tools(); ++i) { vols.emplace_back(new_volume(ctxt.color_tool(i))); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL geometries.emplace_back(GLModel::Geometry()); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } else { vols = { new_volume(ctxt.color_support()) }; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL geometries = { GLModel::Geometry() }; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL assert(vols.size() == geometries.size()); for (GLModel::Geometry& g : geometries) { g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; @@ -7017,19 +7017,19 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con for (GLVolume *volume : vols) // Reserving number of vertices (3x position + 3x color) volume->indexed_vertex_array.reserve(VERTEX_BUFFER_RESERVE_SIZE / 6); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++idx_layer) { const std::vector &layer = ctxt.tool_change(idx_layer); for (size_t i = 0; i < vols.size(); ++i) { GLVolume &vol = *vols[i]; if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { vol.print_zs.emplace_back(layer.front().print_z); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL vol.offsets.emplace_back(geometries[i].indices_count()); #else vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size()); vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size()); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } for (const WipeTower::ToolChangeResult &extrusions : layer) { @@ -7072,32 +7072,32 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con e_prev = e; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, geometries[ctxt.volume_idx(e.tool, 0)]); #else _3DScene::thick_lines_to_verts(lines, widths, heights, lines.front().a == lines.back().b, extrusions.print_z, *vols[ctxt.volume_idx(e.tool, 0)]); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } } for (size_t i = 0; i < vols.size(); ++i) { GLVolume &vol = *vols[i]; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (geometries[i].vertices_size_bytes() > MAX_VERTEX_BUFFER_SIZE) { vol.model.init_from(std::move(geometries[i])); #else if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL vols[i] = new_volume(vol.color); -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL reserve_new_volume_finalize_old_volume(*vols[i], vol, false); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (size_t i = 0; i < vols.size(); ++i) { if (!geometries[i].is_empty()) vols[i]->model.init_from(std::move(geometries[i])); @@ -7105,7 +7105,7 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con #else for (GLVolume *vol : vols) vol->indexed_vertex_array.shrink_to_fit(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }); BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); @@ -7120,14 +7120,14 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con } for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) { GLVolume* v = m_volumes.volumes[i]; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL v->is_outside = !contains(build_volume, v->model); // We are done editinig the model, now it can be sent to gpu v->model.enable_render(); #else v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box()); v->indexed_vertex_array.finalize_geometry(m_initialized); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); @@ -7151,21 +7151,21 @@ void GLCanvas3D::_load_sla_shells() m_volumes.volumes.emplace_back(new GLVolume(color)); GLVolume& v = *m_volumes.volumes.back(); #if ENABLE_SMOOTH_NORMALS -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL v.model.init_from(mesh, true); #else v.indexed_vertex_array.load_mesh(mesh, true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #else -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL v.model.init_from(mesh); #else v.indexed_vertex_array.load_mesh(mesh); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_SMOOTH_NORMALS -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL v.indexed_vertex_array.finalize_geometry(m_initialized); -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL v.shader_outside_printer_detection_enabled = outside_printer_detection_enabled; v.composite_id.volume_id = volume_id; v.set_instance_offset(unscale(instance.shift.x(), instance.shift.y(), 0.0)); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 683d42c6fa..80bbbb5d47 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -8,28 +8,28 @@ #include "libslic3r/TriangleMesh.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Polygon.hpp" -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "libslic3r/BuildVolume.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include #include -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS #include #include #include #endif // ENABLE_SMOOTH_NORMALS -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include namespace Slic3r { namespace GUI { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS static void smooth_normals_corner(const TriangleMesh& mesh, std::vector& normals) { @@ -56,7 +56,7 @@ static void smooth_normals_corner(const TriangleMesh& mesh, std::vector(0, indices_count())); #else GLShaderProgram* shader = wxGetApp().get_current_shader(); -#if ENABLE_LEGACY_OPENGL_REMOVAL - if (shader == nullptr) - return; - - // sends data to gpu if not done yet - if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { - if (m_render_data.geometry.vertices_count() > 0 && m_render_data.geometry.indices_count() > 0 && !send_to_gpu()) - return; - } - - const Geometry& data = m_render_data.geometry; - - const GLenum mode = get_primitive_mode(data.format); - const GLenum index_type = get_index_type(data.format); - - const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); - const bool position = Geometry::has_position(data.format); - const bool normal = Geometry::has_normal(data.format); - const bool tex_coord = Geometry::has_tex_coord(data.format); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); - - if (position) { - glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - } - if (normal) { - glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); - } - if (tex_coord) { - glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); - } - - shader->set_uniform("uniform_color", data.color); - - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); - glsafe(::glDrawElements(mode, indices_count(), index_type, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - - if (tex_coord) - glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); - if (normal) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - if (position) - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); -#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//#if ENABLE_LEGACY_OPENGL_REMOVAL +// if (shader == nullptr) +// return; +// +// // sends data to gpu if not done yet +// if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { +// if (m_render_data.geometry.vertices_count() > 0 && m_render_data.geometry.indices_count() > 0 && !send_to_gpu()) +// return; +// } +// +// const Geometry& data = m_render_data.geometry; +// +// const GLenum mode = get_primitive_mode(data.format); +// const GLenum index_type = get_index_type(data.format); +// +// const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); +// const bool position = Geometry::has_position(data.format); +// const bool normal = Geometry::has_normal(data.format); +// const bool tex_coord = Geometry::has_tex_coord(data.format); +// +// glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); +// +// if (position) { +// glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); +// glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); +// } +// if (normal) { +// glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); +// glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); +// } +// if (tex_coord) { +// glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); +// glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); +// } +// +// shader->set_uniform("uniform_color", data.color); +// +// glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); +// glsafe(::glDrawElements(mode, indices_count(), index_type, nullptr)); +// glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +// +// if (tex_coord) +// glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); +// if (normal) +// glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); +// if (position) +// glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +// +// glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +//#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (const RenderData& data : m_render_data) { if (data.vbo_id == 0 || data.ibo_id == 0) continue; @@ -946,11 +948,13 @@ void GLModel::render() const glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//#endif // ENABLE_LEGACY_OPENGL_REMOVAL +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLModel::render(const std::pair& range) { if (m_render_disabled) @@ -1048,7 +1052,7 @@ void GLModel::render(const std::pair& range) glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_LEGACY_OPENGL_REMOVAL void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) @@ -1270,7 +1274,7 @@ static void append_triangle(GLModel::Geometry& data, unsigned short v1, unsigned } #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL template inline bool all_vertices_inside(const GLModel::Geometry& geometry, Fn fn) { @@ -1324,7 +1328,7 @@ bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_botto return true; } } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) { diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index baa050ee21..0894cf8531 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -14,9 +14,9 @@ namespace Slic3r { class TriangleMesh; class Polygon; using Polygons = std::vector; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL class BuildVolume; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL namespace GUI { @@ -92,12 +92,10 @@ namespace GUI { void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2 void add_vertex(const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 void set_ushort_index(size_t id, unsigned short index); void set_uint_index(size_t id, unsigned int index); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void add_ushort_index(unsigned short id); void add_uint_index(unsigned int id); @@ -116,9 +114,7 @@ namespace GUI { unsigned int extract_uint_index(size_t id) const; unsigned short extract_ushort_index(size_t id) const; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void remove_vertex(size_t id); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL bool is_empty() const { return vertices_count() == 0 || indices_count() == 0; } @@ -189,11 +185,7 @@ namespace GUI { private: #if ENABLE_LEGACY_OPENGL_REMOVAL RenderData m_render_data; -#else - std::vector m_render_data; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL // By default the vertex and index buffers data are sent to gpu at the first call to render() method. // If you need to initialize a model from outside the main thread, so that a call to render() may happen // before the initialization is complete, use the methods: @@ -202,7 +194,9 @@ namespace GUI { // enable_render() // to keep the data on cpu side until needed. bool m_render_disabled{ false }; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#else + std::vector m_render_data; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL BoundingBoxf3 m_bounding_box; std::string m_filename; @@ -221,9 +215,7 @@ namespace GUI { size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry.format); } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL const Geometry& get_geometry() const { return m_render_data.geometry; } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void init_from(Geometry&& data); #if ENABLE_SMOOTH_NORMALS @@ -251,15 +243,11 @@ namespace GUI { void reset(); #if ENABLE_LEGACY_OPENGL_REMOVAL void render(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void render(const std::pair& range); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL void render_instanced(unsigned int instances_vbo, unsigned int instances_count); bool is_initialized() const { return vertices_count() > 0 && indices_count() > 0; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL bool is_empty() const { return m_render_data.geometry.is_empty(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #else void render() const; void render_instanced(unsigned int instances_vbo, unsigned int instances_count) const; @@ -270,7 +258,7 @@ namespace GUI { const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; } const std::string& get_filename() const { return m_filename; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool is_render_disabled() const { return m_render_disabled; } void enable_render() { m_render_disabled = false; } void disable_render() { m_render_disabled = true; } @@ -291,7 +279,7 @@ namespace GUI { ret += indices_size_bytes(); return ret; } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -301,9 +289,9 @@ namespace GUI { #endif // ENABLE_LEGACY_OPENGL_REMOVAL }; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_bottom = true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // create an arrow with cylindrical stem and conical tip, with the given dimensions and resolution // the origin of the arrow is in the center of the stem cap diff --git a/src/slic3r/GUI/GalleryDialog.cpp b/src/slic3r/GUI/GalleryDialog.cpp index 0bc741c962..975b807dcb 100644 --- a/src/slic3r/GUI/GalleryDialog.cpp +++ b/src/slic3r/GUI/GalleryDialog.cpp @@ -275,12 +275,12 @@ static void generate_thumbnail_from_model(const std::string& filename) GLVolumeCollection volumes; volumes.volumes.push_back(new GLVolume()); GLVolume* volume = volumes.volumes.back(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL volume->model.init_from(model.mesh()); #else volume->indexed_vertex_array.load_mesh(model.mesh()); volume->indexed_vertex_array.finalize_geometry(true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL volume->set_instance_transformation(model.objects[0]->instances[0]->get_transformation()); volume->set_volume_transformation(model.objects[0]->volumes[0]->get_transformation()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 1a7fc5a5af..2cd048cbf5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -1,9 +1,9 @@ // Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoFlatten.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GUI_App.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -104,7 +104,7 @@ void GLGizmoFlatten::on_render() { const Selection& selection = m_parent.get_selection(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -114,7 +114,7 @@ void GLGizmoFlatten::on_render() return; shader->start_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); @@ -138,14 +138,14 @@ void GLGizmoFlatten::on_render() if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_planes[i].vbo.set_color(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); m_planes[i].vbo.render(); #else glsafe(::glColor4fv(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR.data() : DEFAULT_PLANE_COLOR.data())); if (m_planes[i].vbo.has_VBOs()) m_planes[i].vbo.render(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); @@ -155,16 +155,16 @@ void GLGizmoFlatten::on_render() glsafe(::glEnable(GL_CULL_FACE)); glsafe(::glDisable(GL_BLEND)); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLGizmoFlatten::on_render_for_picking() { const Selection& selection = m_parent.get_selection(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else @@ -174,7 +174,7 @@ void GLGizmoFlatten::on_render_for_picking() return; shader->start_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisable(GL_DEPTH_TEST)); glsafe(::glDisable(GL_BLEND)); @@ -196,11 +196,11 @@ void GLGizmoFlatten::on_render_for_picking() if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_planes[i].vbo.set_color(picking_color_component(i)); #else glsafe(::glColor4fv(picking_color_component(i).data())); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_planes[i].vbo.render(); } #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -210,9 +210,9 @@ void GLGizmoFlatten::on_render_for_picking() glsafe(::glEnable(GL_CULL_FACE)); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) @@ -427,7 +427,7 @@ void GLGizmoFlatten::update_planes() // And finally create respective VBOs. The polygon is convex with // the vertices in order, so triangulation is trivial. for (auto& plane : m_planes) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry init_data; init_data.format = { GLModel::Geometry::EPrimitiveType::TriangleFan, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::index_type(plane.vertices.size()) }; init_data.reserve_vertices(plane.vertices.size()); @@ -448,7 +448,7 @@ void GLGizmoFlatten::update_planes() for (size_t i=1; i vertices; // should be in fact local in update_planes() -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel vbo; #else GLIndexedVertexArray vbo; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL Vec3d normal; float area; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index e577218e96..731dfc590c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -18,11 +18,11 @@ namespace Slic3r::GUI { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; #else std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) @@ -31,13 +31,13 @@ GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& ic GLGizmoPainterBase::~GLGizmoPainterBase() { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (s_sphere != nullptr) s_sphere.reset(); #else if (s_sphere != nullptr && s_sphere->has_VBOs()) s_sphere->release_geometry(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLGizmoPainterBase::data_changed() @@ -282,14 +282,14 @@ void GLGizmoPainterBase::render_cursor_circle() void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const { if (s_sphere == nullptr) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL s_sphere = std::make_shared(); s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0)); #else s_sphere = std::make_shared(); s_sphere->load_its_flat_shading(its_make_sphere(1.0, double(PI) / 12.0)); s_sphere->finalize_geometry(true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -320,7 +320,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const render_color = this->get_cursor_sphere_left_button_color(); else if (m_button_down == Button::Right) render_color = this->get_cursor_sphere_right_button_color(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -339,12 +339,12 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const glsafe(::glColor4fv(render_color.data())); assert(s_sphere != nullptr); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL s_sphere->render(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (is_left_handed) glFrontFace(GL_CCW); @@ -936,7 +936,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) shader->set_uniform("offset_depth_buffer", true); for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), std::make_pair(&m_iva_blockers, blockers_color)}) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL iva.first->set_color(iva.second); iva.first->render(); #else @@ -944,10 +944,10 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) shader->set_uniform("uniform_color", iva.second); iva.first->render(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (auto& iva : m_iva_seed_fills) { size_t color_idx = &iva - &m_iva_seed_fills.front(); const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : @@ -966,7 +966,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) shader->set_uniform("uniform_color", color); iva.render(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -1004,7 +1004,7 @@ void TriangleSelectorGUI::update_render_data() int blc_cnt = 0; std::vector seed_fill_cnt(m_iva_seed_fills.size(), 0); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) { iva->reset(); } @@ -1026,14 +1026,14 @@ void TriangleSelectorGUI::update_render_data() for (auto &iva : m_iva_seed_fills) iva.release_geometry(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (const Triangle &tr : m_triangles) { if (!tr.valid() || tr.is_split() || (tr.get_state() == EnforcerBlockerType::NONE && !tr.is_selected_by_seed_fill())) continue; int tr_state = int(tr.get_state()); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry &iva = tr.is_selected_by_seed_fill() ? iva_seed_fills_data[tr_state] : tr.get_state() == EnforcerBlockerType::ENFORCER ? iva_enforcers_data : iva_blockers_data; @@ -1041,7 +1041,7 @@ void TriangleSelectorGUI::update_render_data() GLIndexedVertexArray &iva = tr.is_selected_by_seed_fill() ? m_iva_seed_fills[tr_state] : tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : m_iva_blockers; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] : tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : blc_cnt; @@ -1051,7 +1051,7 @@ void TriangleSelectorGUI::update_render_data() //FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort // or the current implementation may be more cache friendly. const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL iva.add_vertex(v0, n); iva.add_vertex(v1, n); iva.add_vertex(v2, n); @@ -1061,11 +1061,11 @@ void TriangleSelectorGUI::update_render_data() iva.push_geometry(v1, n); iva.push_geometry(v2, n); iva.push_triangle(cnt, cnt + 1, cnt + 2); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL cnt += 3; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!iva_enforcers_data.is_empty()) m_iva_enforcers.init_from(std::move(iva_enforcers_data)); if (!iva_blockers_data.is_empty()) @@ -1074,17 +1074,15 @@ void TriangleSelectorGUI::update_render_data() if (!iva_seed_fills_data[i].is_empty()) m_iva_seed_fills[i].init_from(std::move(iva_seed_fills_data[i])); } + + update_paint_contour(); #else for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) iva->finalize_geometry(true); for (auto &iva : m_iva_seed_fills) iva.finalize_geometry(true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL -#if ENABLE_LEGACY_OPENGL_REMOVAL - update_paint_contour(); -#else m_paint_contour.release_geometry(); std::vector contour_edges = this->get_seed_fill_contour(); m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6); @@ -1201,60 +1199,60 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) INVALID }; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (auto& va : m_varrays) va.reset(); #else for (auto& va : m_varrays) va.release_geometry(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL std::array cnts; ::glScalef(1.01f, 1.01f, 1.01f); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL std::array varrays_data; for (auto& data : varrays_data) data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (int tr_id=0; tr_idadd_vertex(m_vertices[tr.verts_idxs[i]].v, Vec3f(0.0f, 0.0f, 1.0f)); } @@ -1268,11 +1266,11 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) va->push_triangle(*cnt, *cnt + 1, *cnt + 2); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL *cnt += 3; } -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL for (int i = 0; i < 3; ++i) { if (!varrays_data[i].is_empty()) m_varrays[i].init_from(std::move(varrays_data[i])); @@ -1283,9 +1281,9 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) // // for (auto& iva : m_iva_seed_fills) // iva.finalize_geometry(true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); if (curr_shader != nullptr) curr_shader->stop_using(); @@ -1303,11 +1301,11 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); for (vtype i : {ORIGINAL, SPLIT, INVALID}) { -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel& va = m_varrays[i]; switch (i) { case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break; @@ -1326,17 +1324,17 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) } va.render(); } -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } if (curr_shader != nullptr) curr_shader->start_using(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index b2742a9ad2..d7fbf6e898 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -3,11 +3,11 @@ #include "GLGizmoBase.hpp" -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GLModel.hpp" #else #include "slic3r/GUI/3DScene.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include "libslic3r/ObjectID.hpp" #include "libslic3r/TriangleSelector.hpp" @@ -103,7 +103,7 @@ protected: private: void update_render_data(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_iva_enforcers; GLModel m_iva_blockers; std::array m_iva_seed_fills; @@ -115,7 +115,7 @@ private: GLIndexedVertexArray m_iva_blockers; std::array m_iva_seed_fills; std::array m_varrays; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL protected: #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -250,11 +250,11 @@ private: const Camera& camera, const std::vector& trafo_matrices) const; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL static std::shared_ptr s_sphere; #else static std::shared_ptr s_sphere; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL bool m_internal_stack_active = false; bool m_schedule_update = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index 705b541ad6..e161c759e2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -216,21 +216,21 @@ void InstancesHider::render_cut() const #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (mv->is_model_part()) glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); else { const ColorRGBA color = color_from_model_volume(*mv); glsafe(::glColor4fv(color.data())); } -#endif // !ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushAttrib(GL_DEPTH_TEST)); glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL clipper->render_cut(mv->is_model_part() ? ColorRGBA(0.8f, 0.3f, 0.0f, 1.0f) : color_from_model_volume(*mv)); #else clipper->render_cut(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); @@ -430,12 +430,12 @@ void ObjectClipper::render_cut() const #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL clipper->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); clipper->render_cut(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -551,12 +551,12 @@ void SupportsClipper::render_cut() const #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.f, 0.37f)); m_clipper->render_cut(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); #endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index f84d69da9e..7554146298 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -6,9 +6,9 @@ #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/Model.hpp" -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GUI_App.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/Camera.hpp" #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" @@ -70,18 +70,16 @@ void MeshClipper::set_transformation(const Geometry::Transformation& trafo) } } - - -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void MeshClipper::render_cut(const ColorRGBA& color) #else void MeshClipper::render_cut() -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (! m_triangles_valid) recalculate_triangles(); -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL if (m_model.vertices_count() == 0 || m_model.indices_count() == 0) return; @@ -111,7 +109,7 @@ void MeshClipper::render_cut() #else if (m_vertex_array.has_VBOs()) m_vertex_array.render(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } @@ -200,7 +198,7 @@ void MeshClipper::recalculate_triangles() tr.pretranslate(0.001 * m_plane.get_normal().normalized()); // to avoid z-fighting -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL m_model.reset(); GLModel::Geometry init_data; @@ -232,7 +230,7 @@ void MeshClipper::recalculate_triangles() m_vertex_array.push_triangle(idx, idx+1, idx+2); } m_vertex_array.finalize_geometry(true); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_triangles_valid = true; } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index cc961ee8f1..3298d3876a 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -7,11 +7,11 @@ #include "libslic3r/SLA/IndexedMesh.hpp" #include "admesh/stl.h" -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GLModel.hpp" #else #include "slic3r/GUI/3DScene.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -98,11 +98,11 @@ public: // Render the triangulated cut. Transformation matrices should // be set in world coords. -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_cut(const ColorRGBA& color); #else void render_cut(); -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: void recalculate_triangles(); @@ -113,11 +113,11 @@ private: ClippingPlane m_plane; ClippingPlane m_limiting_plane = ClippingPlane::ClipsNothing(); std::vector m_triangles2d; -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_model; #else GLIndexedVertexArray m_vertex_array; -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL bool m_triangles_valid = false; }; diff --git a/src/slic3r/Utils/UndoRedo.cpp b/src/slic3r/Utils/UndoRedo.cpp index 533c544a8a..8fe20d0122 100644 --- a/src/slic3r/Utils/UndoRedo.cpp +++ b/src/slic3r/Utils/UndoRedo.cpp @@ -21,9 +21,9 @@ #include #include -#if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/3DScene.hpp" -#endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include From 46283cfde3688a7b1c0eeffb5a67e162f9495486 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 9 Mar 2022 08:22:07 +0100 Subject: [PATCH 090/149] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES renamed as ENABLE_GL_SHADERS_ATTRIBUTES --- src/libslic3r/Technologies.hpp | 2 +- src/slic3r/GUI/3DBed.cpp | 84 +++--- src/slic3r/GUI/3DBed.hpp | 16 +- src/slic3r/GUI/3DScene.cpp | 58 ++-- src/slic3r/GUI/3DScene.hpp | 4 +- src/slic3r/GUI/GCodeViewer.cpp | 116 ++++---- src/slic3r/GUI/GLCanvas3D.cpp | 259 +++++++++--------- src/slic3r/GUI/GLCanvas3D.hpp | 20 +- src/slic3r/GUI/GLModel.cpp | 24 +- src/slic3r/GUI/GLSelectionRectangle.cpp | 44 ++- src/slic3r/GUI/GLShader.cpp | 4 +- src/slic3r/GUI/GLShader.hpp | 8 +- src/slic3r/GUI/GLShadersManager.cpp | 62 ++--- src/slic3r/GUI/GLTexture.cpp | 8 +- src/slic3r/GUI/GLToolbar.cpp | 44 ++- src/slic3r/GUI/GLToolbar.hpp | 16 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 28 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 24 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 28 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 36 +-- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 96 +++---- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 44 +-- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 60 ++-- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 48 ++-- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 16 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 12 +- src/slic3r/GUI/MeshUtils.cpp | 12 +- src/slic3r/GUI/Selection.cpp | 148 +++++----- src/slic3r/GUI/Selection.hpp | 4 +- 37 files changed, 706 insertions(+), 735 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 518cf08381..f8f9f80e21 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -69,7 +69,7 @@ // Enable removal of legacy OpenGL calls #define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable using vertex attributes and matrices in shaders -#define ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) +#define ENABLE_GL_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable show non-manifold edges #define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 7981bd9009..0964aba2ef 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -11,10 +11,10 @@ #include "GUI_App.hpp" #include "GLCanvas3D.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "Plater.hpp" #include "Camera.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include @@ -109,7 +109,7 @@ const float Bed3D::Axes::DefaultTipLength = 5.0f; void Bed3D::Axes::render() { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto render_axis = [this](GLShaderProgram* shader, const Transform3d& transform) { const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d matrix = camera.get_view_matrix() * transform; @@ -120,21 +120,21 @@ void Bed3D::Axes::render() auto render_axis = [this](const Transform3f& transform) { glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(transform.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES }; if (!m_arrow.is_initialized()) m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -149,11 +149,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::X()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); #else render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // y axis #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -161,11 +161,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::Y()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); #else render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // z axis #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -173,11 +173,11 @@ void Bed3D::Axes::render() #else m_arrow.set_color(-1, ColorRGBA::Z()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin)); #else render_axis(Geometry::assemble_transform(m_origin).cast()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->stop_using(); @@ -270,7 +270,7 @@ Point Bed3D::point_projection(const Point& point) const return m_polygon.point_projection(point); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture) { render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture, false); @@ -290,15 +290,15 @@ void Bed3D::render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_fact { render_internal(canvas, bottom, scale_factor, false, false, true); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking) #else void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { m_scale_factor = scale_factor; @@ -315,7 +315,7 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, switch (m_type) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES case Type::System: { render_system(canvas, view_matrix, projection_matrix, bottom, show_texture); break; } default: case Type::Custom: { render_custom(canvas, view_matrix, projection_matrix, bottom, show_texture, picking); break; } @@ -323,7 +323,7 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, case Type::System: { render_system(canvas, bottom, show_texture); break; } default: case Type::Custom: { render_custom(canvas, bottom, show_texture, picking); break; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } glsafe(::glDisable(GL_DEPTH_TEST)); @@ -515,7 +515,7 @@ void Bed3D::render_axes() m_axes.render(); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture) { if (!bottom) @@ -533,7 +533,7 @@ void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) if (show_texture) render_texture(bottom, canvas); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) { @@ -599,18 +599,18 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #if ENABLE_LEGACY_OPENGL_REMOVAL init_triangles(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("printbed_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("printbed"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("transparent_background", bottom); shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg")); @@ -704,11 +704,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix) #else void Bed3D::render_model() -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { if (m_model_filename.empty()) return; @@ -728,15 +728,15 @@ void Bed3D::render_model() } if (!m_model.get_filename().empty()) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d matrix = view_matrix * Geometry::assemble_transform(m_model_offset); shader->set_uniform("view_model_matrix", matrix); shader->set_uniform("projection_matrix", projection_matrix); @@ -744,21 +744,21 @@ void Bed3D::render_model() #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_model_offset.x(), m_model_offset.y(), m_model_offset.z())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_model.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES shader->stop_using(); } } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking) #else void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { if (m_texture_filename.empty() && m_model_filename.empty()) { render_default(bottom, picking); @@ -766,11 +766,11 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bo } if (!bottom) -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_model(view_matrix, projection_matrix); #else render_model(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (show_texture) render_texture(bottom, canvas); @@ -784,19 +784,19 @@ void Bed3D::render_default(bool bottom, bool picking) init_gridlines(); init_triangles(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index fbf7d0c7d8..de4fa99cfc 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -139,13 +139,13 @@ public: bool contains(const Point& point) const; Point point_projection(const Point& point) const; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture); void render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor); #else void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture); void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES private: // Calculate an extended bounding box from axes and current model for visualization purposes. @@ -158,27 +158,27 @@ private: void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); #endif // ENABLE_LEGACY_OPENGL_REMOVAL static std::tuple detect_type(const Pointfs& shape); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking); #else void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void render_axes(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture); #else void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void render_texture(bool bottom, GLCanvas3D& canvas); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking); #else void render_model(); void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void render_default(bool bottom, bool picking); #if !ENABLE_LEGACY_OPENGL_REMOVAL void release_VBOs(); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index f903bf4828..d13ffa9129 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -13,9 +13,9 @@ #include "GUI_App.hpp" #include "Plater.hpp" #include "BitmapCache.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "Camera.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include "libslic3r/BuildVolume.hpp" #include "libslic3r/ExtrusionEntity.hpp" @@ -301,7 +301,7 @@ void GLVolume::SinkingContours::render() { update(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; @@ -312,11 +312,11 @@ void GLVolume::SinkingContours::render() #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_model.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } void GLVolume::SinkingContours::update() @@ -390,7 +390,7 @@ void GLVolume::NonManifoldEdges::render() update(); glsafe(::glLineWidth(2.0f)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; @@ -401,16 +401,16 @@ void GLVolume::NonManifoldEdges::render() #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL m_model.set_color(complementary(m_parent.render_color)); #else m_model.set_color(-1, complementary(m_parent.render_color)); #endif // ENABLE_LEGACY_OPENGL_REMOVAL m_model.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } void GLVolume::NonManifoldEdges::update() @@ -705,19 +705,19 @@ void GLVolume::render() if (!is_active) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (this->is_left_handed()) glFrontFace(GL_CW); glsafe(::glCullFace(GL_BACK)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(world_matrix().data())); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL if (tverts_range == std::make_pair(0, -1)) @@ -728,9 +728,9 @@ void GLVolume::render() this->indexed_vertex_array.render(this->tverts_range, this->qverts_range); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (this->is_left_handed()) glFrontFace(GL_CCW); @@ -1072,12 +1072,12 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo return list; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, std::function filter_func) const #else void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func) const -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) @@ -1088,14 +1088,14 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); assert(boost::algorithm::iends_with(shader->get_name(), "_attr")); #else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_LEGACY_OPENGL_REMOVAL if (type == ERenderType::Transparent) { @@ -1134,17 +1134,11 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//#if ENABLE_LEGACY_OPENGL_REMOVAL -// if (!volume.first->model.is_initialized()) -//#endif // !ENABLE_LEGACY_OPENGL_REMOVAL -// shader->set_uniform("uniform_color", volume.first->render_color); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ shader->set_uniform("z_range", m_z_range, 2); shader->set_uniform("clipping_plane", m_clipping_plane, 4); shader->set_uniform("print_volume.type", static_cast(m_print_volume.type)); @@ -1167,12 +1161,12 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(volume.first->render_color); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d matrix = view_matrix * volume.first->world_matrix(); shader->set_uniform("view_model_matrix", matrix); shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_ENVIRONMENT_MAP @@ -1183,10 +1177,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } if (m_show_sinking_contours) { diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index bab1817585..950d447f02 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -687,12 +687,12 @@ public: #endif // ENABLE_LEGACY_OPENGL_REMOVAL // Render the volumes by OpenGL. -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, std::function filter_func = std::function()) const; #else void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if !ENABLE_LEGACY_OPENGL_REMOVAL // Finalize the initialization of the geometry & indices, diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 2b192f4093..4f6fdc7afd 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -184,11 +184,11 @@ void GCodeViewer::COG::render() init(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -196,7 +196,7 @@ void GCodeViewer::COG::render() glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d matrix = camera.get_view_matrix() * Geometry::assemble_transform(cog()); if (m_fixed_size) { @@ -217,7 +217,7 @@ void GCodeViewer::COG::render() } m_model.render(); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->stop_using(); @@ -331,11 +331,11 @@ void GCodeViewer::SequentialView::Marker::render() if (!m_visible) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -344,7 +344,7 @@ void GCodeViewer::SequentialView::Marker::render() shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d matrix = camera.get_view_matrix() * m_world_transform.cast(); shader->set_uniform("view_model_matrix", matrix); @@ -353,13 +353,13 @@ void GCodeViewer::SequentialView::Marker::render() #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(m_world_transform.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_model.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES shader->stop_using(); @@ -692,11 +692,11 @@ void GCodeViewer::init() #if !DISABLE_GCODEVIEWER_INSTANCED_MODELS if (wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::InstancedModel; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES buffer.shader = "gouraud_light_instanced_attr"; #else buffer.shader = "gouraud_light_instanced"; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES buffer.model.model.init_from(diamond(16)); buffer.model.color = option_color(type); buffer.model.instances.format = InstanceVBuffer::EFormat::InstancedModel; @@ -705,11 +705,11 @@ void GCodeViewer::init() #endif // !DISABLE_GCODEVIEWER_INSTANCED_MODELS buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::BatchedModel; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES buffer.shader = "gouraud_light_attr"; #else buffer.shader = "gouraud_light"; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES buffer.model.data = diamond(16); buffer.model.color = option_color(type); @@ -723,22 +723,22 @@ void GCodeViewer::init() case EMoveType::Extrude: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES buffer.shader = "gouraud_light_attr"; #else buffer.shader = "gouraud_light"; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES break; } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES buffer.vertices.format = VBuffer::EFormat::Position; buffer.shader = "flat_attr"; #else buffer.vertices.format = VBuffer::EFormat::PositionNormal3; buffer.shader = "toolpaths_lines"; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES break; } } @@ -1324,14 +1324,14 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES // x component of the normal to the current segment (the normal is parallel to the XY plane) const Vec3f dir = (curr.position - prev.position).normalized(); Vec3f normal(dir.y(), -dir.x(), 0.0); normal.normalize(); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto add_vertex = [&vertices](const GCodeProcessorResult::MoveVertex& vertex) { // add position vertices.push_back(vertex.position.x()); @@ -1349,7 +1349,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) vertices.push_back(normal.y()); vertices.push_back(normal.z()); }; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // add previous vertex add_vertex(prev); @@ -2973,9 +2973,9 @@ void GCodeViewer::render_toolpaths() #else const float point_size = 0.8f; #endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const double zoom = camera.get_zoom(); const std::array& viewport = camera.get_viewport(); @@ -3019,11 +3019,11 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); }; -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { shader.set_uniform("light_intensity", light_intensity); }; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES auto render_as_lines = [ #if ENABLE_GCODE_VIEWER_STATISTICS this @@ -3088,7 +3088,7 @@ void GCodeViewer::render_toolpaths() } }; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_GCODE_VIEWER_STATISTICS auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { #else @@ -3100,7 +3100,7 @@ void GCodeViewer::render_toolpaths() #else auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader) { #endif // ENABLE_GCODE_VIEWER_STATISTICS -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES struct Range { @@ -3115,7 +3115,7 @@ void GCodeViewer::render_toolpaths() const IBuffer& i_buffer = buffer.indices[j]; buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3123,10 +3123,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3134,7 +3134,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); @@ -3158,7 +3158,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3168,7 +3168,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); buffer_range.first = buffer_range.last; @@ -3193,7 +3193,7 @@ void GCodeViewer::render_toolpaths() shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES int position_id = -1; int normal_id = -1; const Transform3d& view_matrix = camera.get_view_matrix(); @@ -3203,7 +3203,7 @@ void GCodeViewer::render_toolpaths() position_id = shader->get_attrib_location("v_position"); normal_id = shader->get_attrib_location("v_normal"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { shader->set_uniform("emission_factor", 0.25f); @@ -3212,15 +3212,15 @@ void GCodeViewer::render_toolpaths() } else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { shader->set_uniform("emission_factor", 0.25f); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_as_batched_model(buffer, *shader, position_id, normal_id); #else render_as_batched_model(buffer, *shader); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("emission_factor", 0.0f); } else { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Point) shader_init_as_points(*shader); #else @@ -3229,7 +3229,7 @@ void GCodeViewer::render_toolpaths() case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; default: break; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const int uniform_color = shader->get_uniform_location("uniform_color"); auto it_path = buffer.render_paths.begin(); @@ -3242,7 +3242,7 @@ void GCodeViewer::render_toolpaths() continue; glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3250,10 +3250,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3261,7 +3261,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); @@ -3287,7 +3287,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3297,7 +3297,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } } @@ -3318,7 +3318,7 @@ void GCodeViewer::render_toolpaths() shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES int position_id = -1; int normal_id = -1; const Camera& camera = wxGetApp().plater()->get_camera(); @@ -3329,10 +3329,10 @@ void GCodeViewer::render_toolpaths() position_id = shader->get_attrib_location("v_position"); normal_id = shader->get_attrib_location("v_normal"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3340,10 +3340,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer->vertices.position_size_floats(), GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const bool has_normals = buffer->vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3351,7 +3351,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } shader->set_uniform("uniform_color", cap.color); @@ -3364,7 +3364,7 @@ void GCodeViewer::render_toolpaths() ++m_statistics.gl_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3374,7 +3374,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); @@ -3392,11 +3392,11 @@ void GCodeViewer::render_shells() if (!m_shells.visible || m_shells.volumes.empty()) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -3413,12 +3413,12 @@ void GCodeViewer::render_shells() // glsafe(::glDepthMask(GL_FALSE)); shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, camera.get_view_matrix(), camera.get_projection_matrix()); #else m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, wxGetApp().plater()->get_camera().get_view_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->stop_using(); // glsafe(::glDepthMask(GL_TRUE)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index cf2f679bfd..10e4efc116 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -263,7 +263,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) GLCanvas3D::LayersEditing::s_overlay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; imgui.end(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_active_object_annotations(canvas); render_profile(canvas); #else @@ -277,7 +277,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) m_profile.old_bar_rect = bar_rect; m_profile.dirty = false; #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) @@ -311,7 +311,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) return { w - thickness_bar_width(canvas), 0.0f, w, h }; } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) { const Size& cnv_size = canvas.get_canvas_size(); @@ -320,7 +320,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); return { (half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom }; } -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES bool GLCanvas3D::LayersEditing::is_initialized() const { @@ -353,13 +353,13 @@ std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) con return ret; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas) #else void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Size cnv_size = canvas.get_canvas_size(); const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); @@ -371,7 +371,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -382,23 +382,23 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 shader->set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas)); shader->set_uniform("z_cursor_band_width", band_width); shader->set_uniform("object_max_z", m_object_max_z); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); shader->set_uniform("normal_matrix", (Matrix3d)Eigen::Matrix3d::Identity()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); // Render the color bar #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.background.is_initialized() || m_profile.old_canvas_width != cnv_width) { m_profile.old_canvas_width = cnv_width; #else if (!m_profile.background.is_initialized() || m_profile.dirty) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.background.reset(); GLModel::Geometry init_data; @@ -407,7 +407,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 init_data.reserve_indices(6); // vertices -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float l = 1.0f - 2.0f * THICKNESS_BAR_WIDTH * cnv_inv_width; const float r = 1.0f; const float t = 1.0f; @@ -417,7 +417,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 const float r = bar_rect.get_right(); const float t = bar_rect.get_top(); const float b = bar_rect.get_bottom(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(l, b), Vec2f(0.0f, 0.0f)); init_data.add_vertex(Vec2f(r, b), Vec2f(1.0f, 0.0f)); init_data.add_vertex(Vec2f(r, t), Vec2f(1.0f, 1.0f)); @@ -451,18 +451,18 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 shader->stop_using(); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLCanvas3D::LayersEditing::render_profile(const GLCanvas3D& canvas) #else void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { //FIXME show some kind of legend. if (!m_slicing_parameters) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Size cnv_size = canvas.get_canvas_size(); const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); @@ -479,15 +479,15 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. const float scale_x = bar_rect.get_width() / float(1.12 * m_slicing_parameters->max_layer_height); const float scale_y = bar_rect.get_height() / m_object_max_z; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL // Baseline -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.baseline.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { #else if (!m_profile.baseline.is_initialized() || m_profile.dirty) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.baseline.reset(); GLModel::Geometry init_data; @@ -497,7 +497,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) init_data.reserve_indices(2); // vertices -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float axis_x = 2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_slicing_parameters->layer_height) * scale_x) * cnv_inv_width - 0.5f); init_data.add_vertex(Vec2f(axis_x, -1.0f)); init_data.add_vertex(Vec2f(axis_x, 1.0f)); @@ -505,7 +505,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const float x = bar_rect.get_left() + float(m_slicing_parameters->layer_height) * scale_x; init_data.add_vertex(Vec2f(x, bar_rect.get_bottom())); init_data.add_vertex(Vec2f(x, bar_rect.get_top())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // indices init_data.add_ushort_line(0, 1); @@ -513,11 +513,11 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.baseline.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.profile.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { #else if (!m_profile.profile.is_initialized() || m_profile.dirty || m_profile.old_layer_height_profile != m_layer_height_profile) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.old_layer_height_profile = m_layer_height_profile; m_profile.profile.reset(); @@ -529,13 +529,13 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) // vertices + indices for (unsigned int i = 0; i < (unsigned int)m_layer_height_profile.size(); i += 2) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_layer_height_profile[i + 1]) * scale_x) * cnv_inv_width - 0.5f), 2.0f * (float(m_layer_height_profile[i]) * scale_y * cnv_inv_height - 0.5))); #else init_data.add_vertex(Vec2f(bar_rect.get_left() + float(m_layer_height_profile[i + 1]) * scale_x, bar_rect.get_bottom() + float(m_layer_height_profile[i]) * scale_y)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) init_data.add_ushort_index((unsigned short)i / 2); else @@ -545,17 +545,17 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.profile.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.baseline.render(); m_profile.profile.render(); shader->stop_using(); @@ -589,11 +589,11 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G if (current_shader != nullptr) current_shader->stop_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -607,10 +607,10 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G shader->set_uniform("z_cursor", float(m_object_max_z) * float(this->get_cursor_z_relative(canvas))); shader->set_uniform("z_cursor_band_width", float(this->band_width)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // Initialize the layer height texture mapping. const GLsizei w = (GLsizei)m_layers_texture.width; @@ -630,11 +630,11 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G shader->set_uniform("volume_world_matrix", glvolume->world_matrix()); shader->set_uniform("object_max_z", 0.0f); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = camera.get_view_matrix() * glvolume->world_matrix(); shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glvolume->render(); } @@ -1070,11 +1070,11 @@ void GLCanvas3D::SequentialPrintClearance::render() const ColorRGBA NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -1083,11 +1083,11 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glDisable(GL_CULL_FACE)); @@ -1707,11 +1707,11 @@ void GLCanvas3D::render() _render_gcode(); _render_sla_slices(); _render_selection(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward(), true); #else _render_bed(!camera.is_looking_downward(), true); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES _render_objects(GLVolumeCollection::ERenderType::Transparent); _render_sequential_clearance(); @@ -4258,12 +4258,12 @@ bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) ImGuiWrapper* imgui = wxGetApp().imgui(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES imgui->set_next_window_pos(pos_x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else const float x = pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width(); imgui->set_next_window_pos(x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES std::string title = is_undo ? L("Undo History") : L("Redo History"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4302,12 +4302,12 @@ bool GLCanvas3D::_render_search_list(float pos_x) bool action_taken = false; ImGuiWrapper* imgui = wxGetApp().imgui(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else const float x = /*pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + */0.5f * (float)get_canvas_size().get_width(); imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES std::string title = L("Search"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4360,13 +4360,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) { ImGuiWrapper *imgui = wxGetApp().imgui(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else auto canvas_w = float(get_canvas_size().get_width()); const float x = pos_x * float(wxGetApp().plater()->get_camera().get_zoom()) + 0.5f * canvas_w; imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); @@ -4491,9 +4491,9 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const camera.zoom_to_box(volumes_box); camera.apply_view_matrix(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d& view_matrix = camera.get_view_matrix(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES double near_z = -1.0; double far_z = -1.0; @@ -4502,22 +4502,22 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const // extends the near and far z of the frustrum to avoid the bed being clipped // box in eye space -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(view_matrix); #else const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(camera.get_view_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES near_z = -t_bed_box.max.z(); far_z = -t_bed_box.min.z(); } camera.apply_projection(volumes_box, near_z, far_z); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -4530,9 +4530,9 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d& projection_matrix = camera.get_projection_matrix(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES for (GLVolume* vol : visible_volumes) { #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -4543,12 +4543,12 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const // the volume may have been deactivated by an active gizmo const bool is_active = vol->is_active; vol->is_active = true; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d matrix = view_matrix * vol->world_matrix(); shader->set_uniform("view_model_matrix", matrix); shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES vol->render(); vol->is_active = is_active; } @@ -4558,11 +4558,11 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const glsafe(::glDisable(GL_DEPTH_TEST)); if (thumbnail_params.show_bed) -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES _render_bed(view_matrix, projection_matrix, !camera.is_looking_downward(), false); #else _render_bed(!camera.is_looking_downward(), false); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // restore background color if (thumbnail_params.transparent_background) @@ -4823,34 +4823,31 @@ bool GLCanvas3D::_init_main_toolbar() background_data.right = 16; background_data.bottom = 16; - if (!m_main_toolbar.init(background_data)) - { + if (!m_main_toolbar.init(background_data)) { // unable to init the toolbar texture, disable it m_main_toolbar.set_enabled(false); return true; } // init arrow -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES + if (!m_main_toolbar.init_arrow("toolbar_arrow_2.svg")) +#else BackgroundTexture::Metadata arrow_data; arrow_data.filename = "toolbar_arrow.svg"; arrow_data.left = 0; arrow_data.top = 0; arrow_data.right = 0; arrow_data.bottom = 0; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!m_main_toolbar.init_arrow("toolbar_arrow_2.svg")) -#else if (!m_main_toolbar.init_arrow(arrow_data)) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Main toolbar failed to load arrow texture."; // m_gizmos is created at constructor, thus we can init arrow here. -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_gizmos.init_arrow("toolbar_arrow_2.svg")) #else if (!m_gizmos.init_arrow(arrow_data)) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Gizmos manager failed to load arrow texture."; // m_main_toolbar.set_layout_type(GLToolbar::Layout::Vertical); @@ -5055,19 +5052,17 @@ bool GLCanvas3D::_init_undoredo_toolbar() } // init arrow -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES + if (!m_undoredo_toolbar.init_arrow("toolbar_arrow_2.svg")) +#else BackgroundTexture::Metadata arrow_data; arrow_data.filename = "toolbar_arrow.svg"; arrow_data.left = 0; arrow_data.top = 0; arrow_data.right = 0; arrow_data.bottom = 0; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - if (!m_undoredo_toolbar.init_arrow("toolbar_arrow_2.svg")) -#else if (!m_undoredo_toolbar.init_arrow(arrow_data)) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES BOOST_LOG_TRIVIAL(error) << "Undo/Redo toolbar failed to load arrow texture."; // m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Vertical); @@ -5287,12 +5282,12 @@ void GLCanvas3D::_picking_pass() if (m_camera_clipping_plane.is_active()) ::glDisable(GL_CLIP_PLANE0); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); #else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_gizmos.render_current_gizmo_for_picking_pass(); @@ -5348,12 +5343,12 @@ void GLCanvas3D::_rectangular_selection_picking_pass() glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); _render_volumes_for_picking(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); #else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (m_multisample_allowed) glsafe(::glEnable(GL_MULTISAMPLE)); @@ -5426,13 +5421,13 @@ void GLCanvas3D::_render_background() use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES // Draws a bottom to top gradient over the complete screen. glsafe(::glDisable(GL_DEPTH_TEST)); @@ -5461,11 +5456,11 @@ void GLCanvas3D::_render_background() m_background.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("background_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("background"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("top_color", use_error_color ? ERROR_BG_LIGHT_COLOR : DEFAULT_BG_LIGHT_COLOR); @@ -5487,18 +5482,18 @@ void GLCanvas3D::_render_background() glsafe(::glEnable(GL_DEPTH_TEST)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLCanvas3D::_render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes) #else void GLCanvas3D::_render_bed(bool bottom, bool show_axes) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { float scale_factor = 1.0; #if ENABLE_RETINA_GL @@ -5512,29 +5507,29 @@ void GLCanvas3D::_render_bed(bool bottom, bool show_axes) && m_gizmos.get_current_type() != GLGizmosManager::Seam && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_bed.render(*this, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture); #else m_bed.render(*this, bottom, scale_factor, show_axes, show_texture); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLCanvas3D::_render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) #else void GLCanvas3D::_render_bed_for_picking(bool bottom) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_bed.render_for_picking(*this, view_matrix, projection_matrix, bottom, scale_factor); #else m_bed.render_for_picking(*this, bottom, scale_factor); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) @@ -5591,11 +5586,11 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.set_show_non_manifold_edges(!m_gizmos.is_hiding_instances() && m_gizmos.get_current_type() != GLGizmosManager::Simplify); #endif // ENABLE_SHOW_NON_MANIFOLD_EDGES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -5606,7 +5601,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) { if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) { int object_id = m_layers_editing.last_object_id; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [object_id](const GLVolume& volume) { // Which volume to paint without the layer height profile shader? @@ -5617,13 +5612,13 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) // Which volume to paint without the layer height profile shader? return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // Let LayersEditing handle rendering of the active object using the layer height profile shader. m_layers_editing.render_volumes(*this, m_volumes); } else { // do not cull backfaces to show broken geometry, if any -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, m_picking_enabled, camera.get_view_matrix(), camera.get_projection_matrix(), [this](const GLVolume& volume) { return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); @@ -5632,7 +5627,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.render(type, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) { return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } // In case a painting gizmo is open, it should render the painted triangles @@ -5651,12 +5646,12 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) } case GLVolumeCollection::ERenderType::Transparent: { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix()); #else m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES break; } } @@ -5816,11 +5811,11 @@ void GLCanvas3D::_render_overlays() void GLCanvas3D::_render_volumes_for_picking() const { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -5828,10 +5823,10 @@ void GLCanvas3D::_render_volumes_for_picking() const // do not cull backfaces to show broken geometry, if any glsafe(::glDisable(GL_CULL_FACE)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d& view_matrix = wxGetApp().plater()->get_camera().get_view_matrix(); for (size_t type = 0; type < 2; ++ type) { @@ -5848,11 +5843,11 @@ void GLCanvas3D::_render_volumes_for_picking() const #else glsafe(::glColor4fv(picking_decode(id).data())); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * volume.first->world_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -5860,10 +5855,10 @@ void GLCanvas3D::_render_volumes_for_picking() const } } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_CULL_FACE)); } @@ -5898,20 +5893,20 @@ void GLCanvas3D::_render_main_toolbar() return; const Size cnv_size = get_canvas_size(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float top = 0.5f * (float)cnv_size.get_height(); #else const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); #else const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_main_toolbar.set_position(top, left); m_main_toolbar.render(*this); @@ -5925,20 +5920,20 @@ void GLCanvas3D::_render_undoredo_toolbar() return; const Size cnv_size = get_canvas_size(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float top = 0.5f * (float)cnv_size.get_height(); #else float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float left = m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); #else const float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_undoredo_toolbar.set_position(top, left); m_undoredo_toolbar.render(*this); @@ -5952,7 +5947,7 @@ void GLCanvas3D::_render_collapse_toolbar() const const Size cnv_size = get_canvas_size(); const float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float top = 0.5f * (float)cnv_size.get_height(); const float left = 0.5f * (float)cnv_size.get_width() - collapse_toolbar.get_width() - band; #else @@ -5960,7 +5955,7 @@ void GLCanvas3D::_render_collapse_toolbar() const const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; const float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES collapse_toolbar.set_position(top, left); collapse_toolbar.render(*this); @@ -5984,7 +5979,7 @@ void GLCanvas3D::_render_view_toolbar() const #endif // ENABLE_RETINA_GL const Size cnv_size = get_canvas_size(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES // places the toolbar on the bottom-left corner of the 3d scene float top = -0.5f * (float)cnv_size.get_height() + view_toolbar.get_height(); float left = -0.5f * (float)cnv_size.get_width(); @@ -5994,7 +5989,7 @@ void GLCanvas3D::_render_view_toolbar() const // places the toolbar on the bottom-left corner of the 3d scene float top = (-0.5f * (float)cnv_size.get_height() + view_toolbar.get_height()) * inv_zoom; float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES view_toolbar.set_position(top, left); view_toolbar.render(*this); } @@ -6043,18 +6038,18 @@ void GLCanvas3D::_render_camera_target() } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); } @@ -6232,16 +6227,16 @@ void GLCanvas3D::_render_sla_slices() } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); for (const SLAPrintObject::Instance& inst : obj->instances()) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), @@ -6257,16 +6252,16 @@ void GLCanvas3D::_render_sla_slices() if (obj->is_left_handed()) // The polygons are mirrored by X. glsafe(::glScalef(-1.0f, 1.0f, 1.0f)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES bottom_obj_triangles.render(); top_obj_triangles.render(); bottom_sup_triangles.render(); top_sup_triangles.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } shader->stop_using(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8e2496231a..09659faea1 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -245,15 +245,15 @@ class GLCanvas3D GLModel baseline; GLModel profile; GLModel background; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES float old_canvas_width{ 0.0f }; #else Rect old_bar_rect; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES std::vector old_layer_height_profile; -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES bool dirty{ false }; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES }; Profile m_profile; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -283,9 +283,9 @@ class GLCanvas3D static float get_cursor_z_relative(const GLCanvas3D& canvas); static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); static Rect get_bar_rect_screen(const GLCanvas3D& canvas); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES static float get_overlay_window_width() { return LayersEditing::s_overlay_window_width; } float object_max_z() const { return m_object_max_z; } @@ -295,13 +295,13 @@ class GLCanvas3D private: bool is_initialized() const; void generate_layer_height_texture(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_active_object_annotations(const GLCanvas3D& canvas); void render_profile(const GLCanvas3D& canvas); #else void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect); void render_profile(const Rect& bar_rect); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void update_slicing_parameters(); static float thickness_bar_width(const GLCanvas3D &canvas); @@ -953,13 +953,13 @@ private: void _picking_pass(); void _rectangular_selection_picking_pass(); void _render_background(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void _render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes); void _render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); #else void _render_bed(bool bottom, bool show_axes); void _render_bed_for_picking(bool bottom); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void _render_objects(GLVolumeCollection::ERenderType type); void _render_gcode(); #if ENABLE_SHOW_TOOLPATHS_COG diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 80bbbb5d47..d659e66a08 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -985,14 +985,14 @@ void GLModel::render(const std::pair& range) glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES int position_id = -1; int normal_id = -1; int tex_coord_id = -1; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (position) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES position_id = shader->get_attrib_location("v_position"); if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); @@ -1001,10 +1001,10 @@ void GLModel::render(const std::pair& range) #else glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (normal) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES normal_id = shader->get_attrib_location("v_normal"); if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); @@ -1013,10 +1013,10 @@ void GLModel::render(const std::pair& range) #else glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (tex_coord) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES tex_coord_id = shader->get_attrib_location("v_tex_coord"); if (tex_coord_id != -1) { glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::tex_coord_offset_bytes(data.format))); @@ -1025,7 +1025,7 @@ void GLModel::render(const std::pair& range) #else glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } shader->set_uniform("uniform_color", data.color); @@ -1034,7 +1034,7 @@ void GLModel::render(const std::pair& range) glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format)))); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (tex_coord_id != -1) glsafe(::glDisableVertexAttribArray(tex_coord_id)); if (normal_id != -1) @@ -1048,7 +1048,7 @@ void GLModel::render(const std::pair& range) glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); if (position) glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } @@ -1065,11 +1065,11 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance GLShaderProgram* shader = wxGetApp().get_current_shader(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced_attr")) #else if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced")) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; // vertex attributes diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 4044cddd89..bbc66d7113 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -74,32 +74,28 @@ namespace GUI { if (!is_dragging()) return; -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const float inv_zoom = (float)camera.get_inv_zoom(); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Size cnv_size = canvas.get_canvas_size(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); if (cnv_width == 0.0f || cnv_height == 0.0f) return; + + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + const float left = 2.0f * (get_left() * cnv_inv_width - 0.5f); + const float right = 2.0f * (get_right() * cnv_inv_width - 0.5f); + const float top = -2.0f * (get_top() * cnv_inv_height - 0.5f); + const float bottom = -2.0f * (get_bottom() * cnv_inv_height - 0.5f); #else + const Camera& camera = wxGetApp().plater()->get_camera(); + const float inv_zoom = (float)camera.get_inv_zoom(); + const float cnv_half_width = 0.5f * (float)cnv_size.get_width(); const float cnv_half_height = 0.5f * (float)cnv_size.get_height(); if (cnv_half_width == 0.0f || cnv_half_height == 0.0f) return; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const float cnv_inv_width = 1.0f / cnv_width; - const float cnv_inv_height = 1.0f / cnv_height; - const float left = 2.0f * (get_left() * cnv_inv_width - 0.5f); - const float right = 2.0f * (get_right() * cnv_inv_width - 0.5f); - const float top = -2.0f * (get_top() * cnv_inv_height - 0.5f); - const float bottom = -2.0f * (get_bottom() * cnv_inv_height - 0.5f); -#else const Vec2d start(m_start_corner.x() - cnv_half_width, cnv_half_height - m_start_corner.y()); const Vec2d end(m_end_corner.x() - cnv_half_width, cnv_half_height - m_end_corner.y()); @@ -107,7 +103,7 @@ namespace GUI { const float top = (float)std::max(start.y(), end.y()) * inv_zoom; const float right = (float)std::max(start.x(), end.x()) * inv_zoom; const float bottom = (float)std::min(start.y(), end.y()) * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.5f)); #if !ENABLE_LEGACY_OPENGL_REMOVAL @@ -120,7 +116,7 @@ namespace GUI { glsafe(::glDisable(GL_DEPTH_TEST)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the rectangle is renderered inside the frustrum @@ -128,18 +124,18 @@ namespace GUI { // ensure that the overlay fits the frustrum near z plane const double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -168,10 +164,10 @@ namespace GUI { m_rectangle.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_rectangle.set_color(ColorRGBA((m_state == Select) ? 0.3f : 1.0f, (m_state == Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); m_rectangle.render(); @@ -188,9 +184,9 @@ namespace GUI { glsafe(::glPopAttrib()); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } } // namespace GUI diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 7ee4bc1665..7e5704e87d 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -296,12 +296,12 @@ void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const { set_uniform(id, (Matrix3f)value.cast()); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void GLShaderProgram::set_uniform(int id, const Vec3f& value) const { diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index e5b934fca7..a867a62bda 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -61,9 +61,9 @@ public: void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } @@ -83,9 +83,9 @@ public: void set_uniform(int id, const Transform3f& value) const; void set_uniform(int id, const Transform3d& value) const; void set_uniform(int id, const Matrix3f& value) const; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(int id, const Matrix3d& value) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(int id, const Vec3f& value) const; void set_uniform(int id, const Vec3d& value) const; void set_uniform(int id, const ColorRGB& value) const; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 7a20fef410..75b6824a70 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -34,86 +34,80 @@ std::pair GLShadersManager::init() bool valid = true; #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_SHADERS_ATTRIBUTES // basic shader, used to render all what was previously rendered using the immediate mode -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); -#else - valid &= append_shader("flat", { "flat.vs", "flat.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // basic shader for textures, used to render textures -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("flat_texture_attr", { "flat_texture_attr.vs", "flat_texture.fs" }); -#else - valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render 3D scene background -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("background_attr", { "background_attr.vs", "background.fs" }); #else + // basic shader, used to render all what was previously rendered using the immediate mode + valid &= append_shader("flat", { "flat.vs", "flat.fs" }); + // basic shader for textures, used to render textures + valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); + // used to render 3D scene background valid &= append_shader("background", { "background.vs", "background.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES valid &= append_shader("toolpaths_cog_attr", { "toolpaths_cog_attr.vs", "toolpaths_cog.fs" }); #else valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_SHOW_TOOLPATHS_COG +#if ENABLE_GL_SHADERS_ATTRIBUTES // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light_attr", { "gouraud_light_attr.vs", "gouraud_light.fs" }); -#else - valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render printbed -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("printbed_attr", { "printbed_attr.vs", "printbed.fs" }); #else + // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview + valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); + // used to render printbed valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); #else valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - // used to render extrusion and travel paths as lines in gcode preview - valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES // used to render objects in 3d editor -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("gouraud_attr", { "gouraud_attr.vs", "gouraud.fs" } #else + // used to render extrusion and travel paths as lines in gcode preview + valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); + // used to render objects in 3d editor valid &= append_shader("gouraud", { "gouraud.vs", "gouraud.fs" } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_ENVIRONMENT_MAP , { "ENABLE_ENVIRONMENT_MAP"sv } #endif // ENABLE_ENVIRONMENT_MAP ); +#if ENABLE_GL_SHADERS_ATTRIBUTES // used to render variable layers heights in 3d editor -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("variable_layer_height_attr", { "variable_layer_height_attr.vs", "variable_layer_height.fs" }); -#else - valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // used to render highlight contour around selected triangles inside the multi-material gizmo -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES valid &= append_shader("mm_contour_attr", { "mm_contour_attr.vs", "mm_contour_attr.fs" }); #else + // used to render variable layers heights in 3d editor + valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); + // used to render highlight contour around selected triangles inside the multi-material gizmo valid &= append_shader("mm_contour", { "mm_contour.vs", "mm_contour.fs" }); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // Used to render painted triangles inside the multi-material gizmo. Triangle normals are computed inside fragment shader. // For Apple's on Arm CPU computed triangle normals inside fragment shader using dFdx and dFdy has the opposite direction. // Because of this, objects had darker colors inside the multi-material gizmo. // Based on https://stackoverflow.com/a/66206648, the similar behavior was also spotted on some other devices with Arm CPU. // Since macOS 12 (Monterey), this issue with the opposite direction on Apple's Arm CPU seems to be fixed, and computed // triangle normals inside fragment shader have the right direction. -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) valid &= append_shader("mm_gouraud_attr", { "mm_gouraud_attr.vs", "mm_gouraud_attr.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); else @@ -123,7 +117,7 @@ std::pair GLShadersManager::init() valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}, {"FLIP_TRIANGLE_NORMALS"sv}); else valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return { valid, error }; } diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 5121e2e7d2..dc21fdde27 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -358,17 +358,17 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, GLModel model; model.init_from(std::move(init_data)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_texture_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat_texture"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES model.render(); shader->stop_using(); } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 7b8029e5c4..78fbc084ff 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -85,11 +85,11 @@ bool GLToolbarItem::update_enabled_state() return ret; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLToolbarItem::render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const #else void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs { assert(tex_width != 0 && tex_height != 0); @@ -118,7 +118,7 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); if (is_pressed()) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Size cnv_size = parent.get_canvas_size(); const float cnv_w = (float)cnv_size.get_width(); const float cnv_h = (float)cnv_size.get_height(); @@ -136,7 +136,7 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b m_data.left.render_callback(left, right, bottom, top); else if (m_last_action_type == Right && m_data.right.can_render()) m_data.right.render_callback(left, right, bottom, top); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } } @@ -202,7 +202,7 @@ bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture) return res; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES bool GLToolbar::init_arrow(const std::string& filename) { if (m_arrow_texture.get_id() != 0) @@ -220,15 +220,15 @@ bool GLToolbar::init_arrow(const BackgroundTexture::Metadata& arrow_texture) std::string path = resources_dir() + "/icons/"; bool res = false; - if (!arrow_texture.filename.empty()) { + if (!arrow_texture.filename.empty()) res = m_arrow_texture.texture.load_from_svg_file(path + arrow_texture.filename, false, false, false, 1000); - } + if (res) m_arrow_texture.metadata = arrow_texture; return res; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES GLToolbar::Layout::EType GLToolbar::get_layout_type() const { @@ -693,7 +693,7 @@ void GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { const Size cnv_size = parent.get_canvas_size(); @@ -1108,7 +1108,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES GLToolbarItem* GLToolbar::get_item(const std::string& item_name) { @@ -1135,7 +1135,7 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { const Size cnv_size = parent.get_canvas_size(); @@ -1428,9 +1428,9 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& return -1; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLToolbar::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { const unsigned int tex_id = m_background_texture.texture.get_id(); @@ -1584,9 +1584,9 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) { // arrow texture not initialized @@ -1721,9 +1721,9 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLToolbar::render_horizontal(const GLCanvas3D& parent) { const Size cnv_size = parent.get_canvas_size(); @@ -1773,11 +1773,7 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) if (item->is_separator()) left += separator_stride; else { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); -#else - item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES left += icon_stride; } } @@ -1832,11 +1828,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) if (item->is_separator()) top -= separator_stride; else { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES item->render(parent, tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); -#else - item->render(tex_id, left, left + icons_size_x, top - icons_size_y, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES top -= icon_stride; } } @@ -1935,7 +1927,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) } } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES bool GLToolbar::generate_icons_texture() { diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index ae958bce01..bd3204d632 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -153,11 +153,11 @@ public: // returns true if the state changes bool update_enabled_state(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render(const GLCanvas3D& parent, unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; #else void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES private: void set_visible(bool visible) { m_data.visible = visible; } @@ -251,11 +251,11 @@ private: GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLTexture m_arrow_texture; #else BackgroundTexture m_arrow_texture; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES Layout m_layout; ItemsList m_items; @@ -282,11 +282,11 @@ public: bool init(const BackgroundTexture::Metadata& background_texture); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES bool init_arrow(const std::string& filename); #else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES Layout::EType get_layout_type() const; void set_layout_type(Layout::EType type); @@ -357,11 +357,11 @@ private: int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; #else void render_background(float left, float top, float right, float bottom, float border) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void render_horizontal(const GLCanvas3D& parent); void render_vertical(const GLCanvas3D& parent); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index de09628af6..83aed42893 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -5,9 +5,9 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // TODO: Display tooltips quicker on Linux @@ -35,11 +35,11 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader == nullptr) return; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!m_cube.is_initialized()) { // This cannot be done in constructor, OpenGL is not yet @@ -61,7 +61,7 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo m_cube.set_color(-1, render_color); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); const Transform3d& projection_matrix = camera.get_projection_matrix(); @@ -76,11 +76,11 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); glsafe(::glScaled(fullsize, fullsize, fullsize)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cube.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) @@ -134,11 +134,11 @@ void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const void GLGizmoBase::render_grabbers(float size) const { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; shader->start_using(); @@ -153,11 +153,11 @@ void GLGizmoBase::render_grabbers(float size) const void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index c4adccf440..1453204620 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -49,9 +49,9 @@ protected: bool dragging{ false }; Vec3d center{ Vec3d::Zero() }; Vec3d angles{ Vec3d::Zero() }; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d matrix{ Transform3d::Identity() }; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES ColorRGBA color{ ColorRGBA::WHITE() }; Grabber() = default; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 45012c905b..c6d5259a09 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -107,11 +107,11 @@ void GLGizmoCut::on_render() glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); const Vec3d diff = plane_center - m_old_center; @@ -144,11 +144,11 @@ void GLGizmoCut::on_render() m_plane.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_plane.render(); #else @@ -197,11 +197,11 @@ void GLGizmoCut::on_render() shader->stop_using(); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else glsafe(::glColor3f(1.0, 1.0, 0.0)); ::glBegin(GL_LINES); @@ -222,27 +222,27 @@ void GLGizmoCut::on_render() } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("flat_attr"); #else shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glLineWidth(2.0f)); m_cut_contours.contours.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 2cd048cbf5..5ad8ba9d45 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -4,9 +4,9 @@ #if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GUI_App.hpp" #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" @@ -105,11 +105,11 @@ void GLGizmoFlatten::on_render() const Selection& selection = m_parent.get_selection(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -123,7 +123,7 @@ void GLGizmoFlatten::on_render() if (selection.is_single_full_instance()) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; @@ -134,7 +134,7 @@ void GLGizmoFlatten::on_render() glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); glsafe(::glMultMatrixd(m.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { @@ -147,9 +147,9 @@ void GLGizmoFlatten::on_render() m_planes[i].vbo.render(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } glsafe(::glEnable(GL_CULL_FACE)); @@ -165,11 +165,11 @@ void GLGizmoFlatten::on_render_for_picking() const Selection& selection = m_parent.get_selection(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -181,7 +181,7 @@ void GLGizmoFlatten::on_render_for_picking() if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; @@ -192,7 +192,7 @@ void GLGizmoFlatten::on_render_for_picking() glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); glsafe(::glMultMatrixd(m.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (this->is_plane_update_necessary()) update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { @@ -203,9 +203,9 @@ void GLGizmoFlatten::on_render_for_picking() #endif // ENABLE_LEGACY_OPENGL_REMOVAL m_planes[i].vbo.render(); } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } glsafe(::glEnable(GL_CULL_FACE)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index bd0d87f0a8..45af12b4df 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -104,11 +104,11 @@ void GLGizmoHollow::on_render_for_picking() void GLGizmoHollow::render_points(const Selection& selection, bool picking) { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -122,7 +122,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #endif // ENABLE_LEGACY_OPENGL_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); @@ -138,7 +138,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) glsafe(::glPushMatrix()); glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); glsafe(::glMultMatrixd(instance_matrix.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES ColorRGBA render_color; const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; @@ -173,13 +173,13 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #endif // ENABLE_LEGACY_OPENGL_REMOVAL // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); @@ -188,7 +188,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); const Eigen::AngleAxisd aa(q); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); @@ -198,20 +198,20 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cylinder.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 414f4de7b4..13c8a71c62 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -170,11 +170,11 @@ void GLGizmoMmuSegmentation::data_changed() void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const { ClippingPlaneDataWrapper clp_data = this->get_clipping_plane_data(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto* shader = wxGetApp().get_shader("mm_gouraud_attr"); #else auto *shader = wxGetApp().get_shader("mm_gouraud"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!shader) return; shader->start_using(); @@ -196,7 +196,7 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; shader->set_uniform("view_model_matrix", matrix); @@ -205,19 +205,19 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("volume_world_matrix", trafo_matrix); shader->set_uniform("volume_mirrored", is_left_handed); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); #else m_triangle_selectors[mesh_id]->render(m_imgui); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -586,11 +586,11 @@ ColorRGBA GLGizmoMmuSegmentation::get_cursor_sphere_right_button_color() const return color; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void TriangleSelectorMmGui::render(ImGuiWrapper* imgui, const Transform3d& matrix) #else void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { if (m_update_render_data) update_render_data(); @@ -598,11 +598,11 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) auto *shader = wxGetApp().get_current_shader(); if (!shader) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES assert(shader->get_name() == "mm_gouraud_attr"); #else assert(shader->get_name() == "mm_gouraud"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) if (m_gizmo_scene.has_VBOs(color_idx)) { @@ -615,11 +615,11 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_paint_contour(matrix); #else render_paint_contour(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else if (m_paint_contour.has_VBO()) { ScopeGuard guard_mm_gouraud([shader]() { shader->start_using(); }); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 21835f902f..5d23973379 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -66,13 +66,13 @@ public: : TriangleSelectorGUI(mesh), m_colors(colors), m_default_volume_color(default_volume_color), m_gizmo_scene(2 * (colors.size() + 1)) {} ~TriangleSelectorMmGui() override = default; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render(ImGuiWrapper* imgui, const Transform3d& matrix) override; #else // Render current selection. Transformation matrices are supposed // to be already set. void render(ImGuiWrapper* imgui) override; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES private: void update_render_data(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 325073fba9..f4e468a267 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -2,9 +2,9 @@ #include "GLGizmoMove.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include @@ -154,20 +154,20 @@ void GLGizmoMove3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // draw axes for (unsigned int i = 0; i < 3; ++i) { @@ -199,29 +199,29 @@ void GLGizmoMove3D::on_render() else { // draw axis #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabber_connection(m_hover_id); shader->stop_using(); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else glsafe(::glColor4fv(AXES_COLOR[m_hover_id].data())); ::glBegin(GL_LINES); @@ -286,11 +286,11 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box const double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -309,7 +309,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box } #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); if (axis == X) @@ -331,11 +331,11 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cone.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if !ENABLE_LEGACY_OPENGL_REMOVAL if (! picking) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 731dfc590c..e0b0242d4f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -80,11 +80,11 @@ GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_pl void GLGizmoPainterBase::render_triangles(const Selection& selection) const { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto* shader = wxGetApp().get_shader("gouraud_attr"); #else auto* shader = wxGetApp().get_shader("gouraud"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (! shader) return; shader->start_using(); @@ -109,7 +109,7 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; shader->set_uniform("view_model_matrix", matrix); @@ -118,7 +118,7 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // For printers with multiple extruders, it is necessary to pass trafo_matrix // to the shader input variable print_box.volume_world_matrix before @@ -126,13 +126,13 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const // wrong transformation matrix is used for "Clipping of view". shader->set_uniform("volume_world_matrix", trafo_matrix); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); #else m_triangle_selectors[mesh_id]->render(m_imgui); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -167,14 +167,14 @@ void GLGizmoPainterBase::render_cursor() void GLGizmoPainterBase::render_cursor_circle() { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES const Camera &camera = wxGetApp().plater()->get_camera(); const float zoom = float(camera.get_zoom()); const float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES const Size cnv_size = m_parent.get_canvas_size(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const float cnv_width = float(cnv_size.get_width()); const float cnv_height = float(cnv_size.get_height()); if (cnv_width == 0.0f || cnv_height == 0.0f) @@ -193,7 +193,7 @@ void GLGizmoPainterBase::render_cursor_circle() const Vec2d mouse_pos(m_parent.get_local_mouse_position().x(), m_parent.get_local_mouse_position().y()); Vec2d center(mouse_pos.x() - cnv_half_width, cnv_half_height - mouse_pos.y()); center = center * inv_zoom; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.5f)); #if !ENABLE_LEGACY_OPENGL_REMOVAL @@ -202,7 +202,7 @@ void GLGizmoPainterBase::render_cursor_circle() #endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisable(GL_DEPTH_TEST)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the circle is renderered inside the frustrum @@ -210,20 +210,20 @@ void GLGizmoPainterBase::render_cursor_circle() // ensure that the overlay fits the frustrum near z plane const double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { m_old_cursor_radius = radius; #else if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - m_cursor_radius) > EPSILON) { m_old_cursor_radius = m_cursor_radius; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_old_center = center; m_circle.reset(); @@ -238,29 +238,29 @@ void GLGizmoPainterBase::render_cursor_circle() // vertices + indices for (unsigned short i = 0; i < StepsCount; ++i) { const float angle = float(i * StepSize); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); #else init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_ushort_index(i); } m_circle.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_circle.render(); shader->stop_using(); } @@ -272,9 +272,9 @@ void GLGizmoPainterBase::render_cursor_circle() #endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); } @@ -292,25 +292,25 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo.data())); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glTranslatef(m_rr.hit.x(), m_rr.hit.y(), m_rr.hit.z())); glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data())); glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (is_left_handed) glFrontFace(GL_CW); @@ -323,7 +323,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const #if ENABLE_LEGACY_OPENGL_REMOVAL shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d view_model_matrix = camera.get_view_matrix() * trafo * Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * @@ -331,7 +331,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES assert(s_sphere != nullptr); s_sphere->set_color(render_color); @@ -349,9 +349,9 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const if (is_left_handed) glFrontFace(GL_CCW); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } @@ -910,11 +910,11 @@ ColorRGBA TriangleSelectorGUI::get_seed_fill_color(const ColorRGBA& base_color) return saturate(base_color, 0.75f); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void TriangleSelectorGUI::render(ImGuiWrapper* imgui, const Transform3d& matrix) #else void TriangleSelectorGUI::render(ImGuiWrapper* imgui) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { static const ColorRGBA enforcers_color = { 0.47f, 0.47f, 1.0f, 1.0f }; static const ColorRGBA blockers_color = { 1.0f, 0.44f, 0.44f, 1.0f }; @@ -927,11 +927,11 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) auto* shader = wxGetApp().get_current_shader(); if (! shader) return; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES assert(shader->get_name() == "gouraud_attr"); #else assert(shader->get_name() == "gouraud"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES ScopeGuard guard([shader]() { if (shader) shader->set_uniform("offset_depth_buffer", false);}); shader->set_uniform("offset_depth_buffer", true); for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), @@ -969,11 +969,11 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) #endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_paint_contour(matrix); #else render_paint_contour(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else if (m_paint_contour.has_VBO()) { ScopeGuard guard_gouraud([shader]() { shader->start_using(); }); @@ -1288,19 +1288,19 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_LEGACY_OPENGL_REMOVAL ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); @@ -1348,9 +1348,9 @@ void TriangleSelectorGUI::update_paint_contour() init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(2 * contour_edges.size()) }; init_data.reserve_vertices(2 * contour_edges.size()); init_data.reserve_indices(2 * contour_edges.size()); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES init_data.color = ColorRGBA::WHITE(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES // // vertices + indices unsigned int vertices_count = 0; @@ -1368,29 +1368,29 @@ void TriangleSelectorGUI::update_paint_contour() m_paint_contour.init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void TriangleSelectorGUI::render_paint_contour(const Transform3d& matrix) #else void TriangleSelectorGUI::render_paint_contour() -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { auto* curr_shader = wxGetApp().get_current_shader(); if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); #else auto* contour_shader = wxGetApp().get_shader("mm_contour"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (contour_shader != nullptr) { contour_shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glDepthFunc(GL_LEQUAL)); m_paint_contour.render(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index d7fbf6e898..64f5317937 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -77,7 +77,7 @@ public: : TriangleSelector(mesh) {} virtual ~TriangleSelectorGUI() = default; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES virtual void render(ImGuiWrapper* imgui, const Transform3d& matrix); void render(const Transform3d& matrix) { this->render(nullptr, matrix); } #else @@ -85,7 +85,7 @@ public: // to be already set. virtual void render(ImGuiWrapper *imgui); void render() { this->render(nullptr); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void request_update_render_data() { m_update_render_data = true; } @@ -122,11 +122,11 @@ protected: GLModel m_paint_contour; void update_paint_contour(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_paint_contour(const Transform3d& matrix); #else void render_paint_contour(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLPaintContour m_paint_contour; #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 70c94223d7..e9d07f21c3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -163,30 +163,30 @@ void GLGizmoRotate::on_render() glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_grabbers.front().matrix = local_transform(selection); #else glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; m_old_radius = m_radius; @@ -223,10 +223,10 @@ void GLGizmoRotate::on_render() render_angle(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabber(box); render_grabber_extension(box, false); @@ -240,20 +240,20 @@ void GLGizmoRotate::on_render_for_picking() glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES m_grabbers.front().matrix = local_transform(selection); #else glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES const BoundingBoxf3& box = selection.get_bounding_box(); render_grabbers_for_picking(box); render_grabber_extension(box, true); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit) @@ -576,11 +576,11 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const double size = m_dragging ? double(m_grabbers.front().get_dragging_half_size(mean_size)) : double(m_grabbers.front().get_half_size(mean_size)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -602,7 +602,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const Vec3d& center = m_grabbers.front().center; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); @@ -620,9 +620,9 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cone.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES view_model_matrix = view_matrix * m_grabbers.front().matrix * Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); @@ -637,11 +637,11 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cone.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if !ENABLE_LEGACY_OPENGL_REMOVAL if (! picking) @@ -649,7 +649,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick shader->stop_using(); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d GLGizmoRotate::local_transform(const Selection& selection) const { Transform3d ret; @@ -679,7 +679,7 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const return Geometry::assemble_transform(m_center) * ret; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void GLGizmoRotate::transform_to_local(const Selection& selection) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 8968fef8d2..c31b1f6f0c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -106,9 +106,9 @@ private: void render_grabber(const BoundingBoxf3& box); void render_grabber_extension(const BoundingBoxf3& box, bool picking); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d local_transform(const Selection& selection) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void transform_to_local(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 0dfe2e2d35..f32aac604d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -2,9 +2,9 @@ #include "GLGizmoScale.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include @@ -265,18 +265,18 @@ void GLGizmoScale3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); if (m_grabbers[2].enabled && m_grabbers[3].enabled) @@ -316,28 +316,28 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 0 || m_hover_id == 1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); } // draw grabbers -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[0].color.data())); @@ -357,28 +357,28 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 2 || m_hover_id == 3) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); } // draw grabbers -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[2].color.data())); @@ -398,28 +398,28 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 4 || m_hover_id == 5) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); } // draw grabbers -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[4].color.data())); @@ -439,18 +439,18 @@ void GLGizmoScale3D::on_render() else if (m_hover_id >= 6) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); render_grabbers_connection(8, 9, m_drag_color); @@ -459,11 +459,11 @@ void GLGizmoScale3D::on_render() } // draw grabbers -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader = wxGetApp().get_shader("gouraud_light_attr"); #else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_drag_color.data())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 5ac9df549f..1a383187c6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -737,53 +737,53 @@ void GLGizmoSimplify::on_render() GLModel &glmodel = it->second; const Transform3d trafo_matrix = selected_volume->world_matrix(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto* gouraud_shader = wxGetApp().get_shader("gouraud_light_attr"); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); auto *gouraud_shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushAttrib(GL_DEPTH_TEST)); glsafe(::glEnable(GL_DEPTH_TEST)); gouraud_shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * trafo_matrix; gouraud_shader->set_uniform("view_model_matrix", view_model_matrix); gouraud_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); gouraud_shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glmodel.render(); gouraud_shader->stop_using(); if (m_show_wireframe) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); #else auto *contour_shader = wxGetApp().get_shader("mm_contour"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES contour_shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES contour_shader->set_uniform("view_model_matrix", view_model_matrix); contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); const ColorRGBA color = glmodel.get_color(); glmodel.set_color(ColorRGBA::WHITE()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glLineWidth(1.0f)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); glmodel.render(); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES glmodel.set_color(color); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES contour_shader->stop_using(); } glsafe(::glPopAttrib()); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 60f1731f3e..4253c1a923 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -130,11 +130,11 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -152,7 +152,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); const Camera& camera = wxGetApp().plater()->get_camera(); @@ -167,7 +167,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glPushMatrix()); glsafe(::glTranslated(0.0, 0.0, z_shift)); glsafe(::glMultMatrixd(instance_matrix.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES ColorRGBA render_color; for (size_t i = 0; i < cache_size; ++i) { @@ -211,13 +211,13 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) shader->set_uniform("emission_factor", 0.5f); // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d support_matrix = Geometry::assemble_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); @@ -234,7 +234,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const Eigen::AngleAxisd aa(q); const double cone_radius = 0.25; // mm const double cone_height = 0.75; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); @@ -247,15 +247,15 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); glsafe(::glRotated(180., 1., 0., 0.)); glsafe(::glScaled(cone_radius, cone_radius, cone_height)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cone.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } const double radius = (double)support_point.head_front_radius * RenderPointScale; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); @@ -264,18 +264,18 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) #else glsafe(::glPushMatrix()); glsafe(::glScaled(radius, radius, radius)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_sphere.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CCW); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } // Now render the drain holes: @@ -292,14 +292,14 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (is_mesh_point_clipped(drain_hole.pos.cast())) continue; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; #else // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (vol->is_left_handed()) glFrontFace(GL_CW); @@ -308,7 +308,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); const Eigen::AngleAxisd aa(q); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); @@ -318,20 +318,20 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_cylinder.render(); if (vol->is_left_handed()) glFrontFace(GL_CCW); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index e161c759e2..0d6ec1eb0d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -213,9 +213,9 @@ void InstancesHider::render_cut() const else clipper->set_limiting_plane(ClippingPlane::ClipsNothing()); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if !ENABLE_LEGACY_OPENGL_REMOVAL if (mv->is_model_part()) glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); @@ -232,9 +232,9 @@ void InstancesHider::render_cut() const clipper->render_cut(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES ++clipper_id; } @@ -427,18 +427,18 @@ void ObjectClipper::render_cut() const clipper->set_plane(*m_clp); clipper->set_transformation(trafo); clipper->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL clipper->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); clipper->render_cut(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES ++clipper_id; } @@ -548,18 +548,18 @@ void SupportsClipper::render_cut() const m_clipper->set_plane(*ocl->get_clipping_plane()); m_clipper->set_transformation(supports_trafo); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL m_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); #else glsafe(::glColor3f(1.0f, 0.f, 0.37f)); m_clipper->render_cut(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 0a2d5b2857..21b55ea694 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -124,7 +124,7 @@ bool GLGizmosManager::init() return true; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES bool GLGizmosManager::init_arrow(const std::string& filename) { if (m_arrow_texture.get_id() != 0) @@ -149,7 +149,7 @@ bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata & arrow_textu return res; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void GLGizmosManager::set_overlay_icon_size(float size) { @@ -676,7 +676,7 @@ void GLGizmosManager::update_after_undo_redo(const UndoRedo::Snapshot& snapshot) dynamic_cast(m_gizmos[SlaSupports].get())->reslice_SLA_supports(true); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { const unsigned int tex_id = m_background_texture.texture.get_id(); @@ -782,9 +782,9 @@ void GLGizmosManager::render_background(float left, float top, float right, floa GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const { const std::vector selectable_idxs = get_selectable_idxs(); @@ -870,9 +870,9 @@ void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_t zoomed_top_y -= zoomed_stride_y; } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void GLGizmosManager::do_render_overlay() const { const std::vector selectable_idxs = get_selectable_idxs(); @@ -1017,7 +1017,7 @@ void GLGizmosManager::do_render_overlay() const m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); } } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES float GLGizmosManager::get_scaled_total_height() const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 225aa97779..187afd889f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -105,11 +105,11 @@ private: GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLTexture m_arrow_texture; #else BackgroundTexture m_arrow_texture; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES Layout m_layout; EType m_current; EType m_hover; @@ -137,11 +137,11 @@ public: bool init(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES bool init_arrow(const std::string& filename); #else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES template void load(Archive& ar) @@ -242,11 +242,11 @@ private: bool alt_down = false, bool control_down = false); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; #else void render_background(float left, float top, float right, float bottom, float border) const; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES void do_render_overlay() const; diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 7554146298..4e4b268304 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -10,9 +10,9 @@ #include "slic3r/GUI/GUI_App.hpp" #endif // ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/Camera.hpp" -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include @@ -87,18 +87,18 @@ void MeshClipper::render_cut() if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); shader->stop_using(); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index c6bc939a12..9f554b64d9 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1275,11 +1275,11 @@ void Selection::render_center(bool gizmo_is_dragging) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1290,7 +1290,7 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(center); @@ -1299,7 +1299,7 @@ void Selection::render_center(bool gizmo_is_dragging) #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL m_vbo_sphere.set_color(ColorRGBA::WHITE()); @@ -1308,9 +1308,9 @@ void Selection::render_center(bool gizmo_is_dragging) #endif // ENABLE_LEGACY_OPENGL_REMOVAL m_vbo_sphere.render(); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -1324,11 +1324,11 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat" : "gouraud_light"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1348,27 +1348,27 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d base_matrix = Geometry::assemble_transform(get_bounding_box().center()); Transform3d orient_matrix = Transform3d::Identity(); #else glsafe(::glPushMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!boost::starts_with(sidebar_field, "layer")) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("emission_factor", 0.05f); #else const Vec3d& center = get_bounding_box().center(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glTranslated(center.x(), center.y(), center.z())); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (!boost::starts_with(sidebar_field, "position")) { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES Transform3d orient_matrix = Transform3d::Identity(); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES if (boost::starts_with(sidebar_field, "scale")) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); else if (boost::starts_with(sidebar_field, "rotation")) { @@ -1382,27 +1382,27 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) orient_matrix.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); } } -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glMultMatrixd(orient_matrix.data())); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } } else if (is_single_volume() || is_single_modifier()) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); #else glsafe(::glTranslated(center.x(), center.y(), center.z())); Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!boost::starts_with(sidebar_field, "position")) orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glMultMatrixd(orient_matrix.data())); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } else { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (requires_local_axes()) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); #else @@ -1411,7 +1411,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) const Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } } @@ -1420,7 +1420,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES if (boost::starts_with(sidebar_field, "position")) render_sidebar_position_hints(sidebar_field, *shader, base_matrix * orient_matrix); else if (boost::starts_with(sidebar_field, "rotation")) @@ -1440,7 +1440,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) render_sidebar_layers_hints(sidebar_field); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if !ENABLE_LEGACY_OPENGL_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) @@ -2020,20 +2020,20 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con glsafe(::glLineWidth(2.0f * m_scale_factor)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); #else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; shader->start_using(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_box.set_color(to_rgba(color)); m_box.render(); shader->stop_using(); @@ -2081,46 +2081,46 @@ static ColorRGBA get_color(Axis axis) return AXES_COLOR[axis]; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Selection::render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_position_hints(const std::string& sidebar_field) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_matrix = camera.get_view_matrix() * matrix; shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x")) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); shader.set_uniform("view_model_matrix", view_model_matrix); shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(X)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "y")) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES shader.set_uniform("view_model_matrix", view_matrix); shader.set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(Y)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "z")) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX()); shader.set_uniform("view_model_matrix", view_model_matrix); shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.set_color(get_color(Z)); m_arrow.render(); } @@ -2142,14 +2142,14 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto render_sidebar_rotation_hint = [this](GLShaderProgram& shader, const Transform3d& matrix) { Transform3d view_model_matrix = matrix; shader.set_uniform("view_model_matrix", view_model_matrix); @@ -2170,37 +2170,37 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); m_curved_arrow.render(); }; -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x")) { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(X)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY())); #else render_sidebar_rotation_hint(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } else if (boost::ends_with(sidebar_field, "y")) { -#if !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); -#endif // !ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(Y)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX())); #else render_sidebar_rotation_hint(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } else if (boost::ends_with(sidebar_field, "z")) { m_curved_arrow.set_color(get_color(Z)); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_rotation_hint(shader, view_matrix); #else render_sidebar_rotation_hint(); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } #else auto render_sidebar_rotation_hint = [this]() { @@ -2226,26 +2226,26 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { const bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis, GLShaderProgram& shader, const Transform3d& matrix) { #else auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #else m_arrow.set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d view_model_matrix = matrix * Geometry::assemble_transform(5.0 * Vec3d::UnitY()); shader.set_uniform("view_model_matrix", view_model_matrix); shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); @@ -2255,64 +2255,64 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) shader->set_uniform("emission_factor", 0.0f); glsafe(::glTranslated(0.0, 5.0, 0.0)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.render(); -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES view_model_matrix = matrix * Geometry::assemble_transform(-5.0 * Vec3d::UnitY(), PI * Vec3d::UnitZ()); shader.set_uniform("view_model_matrix", view_model_matrix); shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else glsafe(::glTranslated(0.0, -10.0, 0.0)); glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_arrow.render(); }; -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_matrix = camera.get_view_matrix() * matrix; shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x") || uniform_scale) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_scale_hint(X, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ())); #else glsafe(::glPushMatrix()); glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); render_sidebar_scale_hint(X); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (boost::ends_with(sidebar_field, "y") || uniform_scale) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_scale_hint(Y, shader, view_matrix); #else glsafe(::glPushMatrix()); render_sidebar_scale_hint(Y); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (boost::ends_with(sidebar_field, "z") || uniform_scale) { -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES render_sidebar_scale_hint(Z, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX())); #else glsafe(::glPushMatrix()); glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); render_sidebar_scale_hint(Z); glsafe(::glPopMatrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader) #else void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { static const float Margin = 10.0f; @@ -2410,11 +2410,11 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) m_planes.models[1].init_from(std::move(init_data)); } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader.set_uniform("view_model_matrix", camera.get_view_matrix()); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); m_planes.models[0].render(); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 594f70f4a9..c9e55cf828 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -376,7 +376,7 @@ private: void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); @@ -386,7 +386,7 @@ private: void render_sidebar_rotation_hints(const std::string& sidebar_field); void render_sidebar_scale_hints(const std::string& sidebar_field); void render_sidebar_layers_hints(const std::string& sidebar_field); -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_SHADERS_ATTRIBUTES public: enum SyncRotationType { From f8ce187262df8ef588f649c414a095c971f36e67 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 9 Mar 2022 11:51:02 +0100 Subject: [PATCH 091/149] Tech ENABLE_LEGACY_OPENGL_REMOVAL - Refactoring of GLModel to automatically detect the data type to use into the index buffer in dependence of vertices count --- src/slic3r/GUI/3DBed.cpp | 17 +- src/slic3r/GUI/3DScene.cpp | 95 ++- src/slic3r/GUI/GCodeViewer.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 51 +- src/slic3r/GUI/GLModel.cpp | 666 +++++++------------ src/slic3r/GUI/GLModel.hpp | 47 +- src/slic3r/GUI/GLSelectionRectangle.cpp | 10 +- src/slic3r/GUI/GLTexture.cpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 10 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 7 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 23 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 40 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 4 +- src/slic3r/GUI/MeshUtils.cpp | 7 +- src/slic3r/GUI/Selection.cpp | 18 +- 16 files changed, 416 insertions(+), 591 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 0964aba2ef..177c508ad3 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -366,7 +366,7 @@ void Bed3D::init_triangles() return; GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3T2, GLModel::Geometry::index_type(triangles.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3T2 }; init_data.reserve_vertices(triangles.size()); init_data.reserve_indices(triangles.size() / 3); @@ -390,12 +390,8 @@ void Bed3D::init_triangles() const Vec3f p = { v.x(), v.y(), GROUND_Z }; init_data.add_vertex(p, (Vec2f)(v - min).cwiseProduct(inv_size).eval()); ++vertices_counter; - if (vertices_counter % 3 == 0) { - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_triangle((unsigned short)vertices_counter - 3, (unsigned short)vertices_counter - 2, (unsigned short)vertices_counter - 1); - else - init_data.add_uint_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); - } + if (vertices_counter % 3 == 0) + init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } m_triangles.init_from(std::move(init_data)); @@ -434,7 +430,7 @@ void Bed3D::init_gridlines() std::copy(contour_lines.begin(), contour_lines.end(), std::back_inserter(gridlines)); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(2 * gridlines.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2 * gridlines.size()); init_data.reserve_indices(2 * gridlines.size()); @@ -442,10 +438,7 @@ void Bed3D::init_gridlines() init_data.add_vertex(Vec3f(unscale(l.a.x()), unscale(l.a.y()), GROUND_Z)); init_data.add_vertex(Vec3f(unscale(l.b.x()), unscale(l.b.y()), GROUND_Z)); const unsigned int vertices_counter = (unsigned int)init_data.vertices_count(); - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_line((unsigned short)vertices_counter - 2, (unsigned short)vertices_counter - 1); - else - init_data.add_uint_line(vertices_counter - 2, vertices_counter - 1); + init_data.add_line(vertices_counter - 2, vertices_counter - 1); } m_gridlines.init_from(std::move(init_data)); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index d13ffa9129..0e7c551d57 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -335,7 +335,7 @@ void GLVolume::SinkingContours::update() m_model.reset(); GUI::GLModel::Geometry init_data; #if ENABLE_LEGACY_OPENGL_REMOVAL - init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3, GUI::GLModel::Geometry::EIndexType::UINT }; + init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Triangles, GUI::GLModel::Geometry::EVertexLayout::P3 }; init_data.color = ColorRGBA::WHITE(); unsigned int vertices_counter = 0; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -351,7 +351,7 @@ void GLVolume::SinkingContours::update() init_data.add_vertex((Vec3f)(v.cast() + 0.015f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting ++vertices_counter; if (vertices_counter % 3 == 0) - init_data.add_uint_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } } m_model.init_from(std::move(init_data)); @@ -431,7 +431,7 @@ void GLVolume::NonManifoldEdges::update() if (!edges.empty()) { GUI::GLModel::Geometry init_data; #if ENABLE_LEGACY_OPENGL_REMOVAL - init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Lines, GUI::GLModel::Geometry::EVertexLayout::P3, GUI::GLModel::Geometry::index_type(2 * edges.size()) }; + init_data.format = { GUI::GLModel::Geometry::EPrimitiveType::Lines, GUI::GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2 * edges.size()); init_data.reserve_indices(2 * edges.size()); @@ -441,10 +441,7 @@ void GLVolume::NonManifoldEdges::update() init_data.add_vertex((Vec3f)mesh.its.vertices[edge.first].cast()); init_data.add_vertex((Vec3f)mesh.its.vertices[edge.second].cast()); vertices_count += 2; - if (init_data.format.index_type == GUI::GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_line((unsigned short)vertices_count - 2, (unsigned short)vertices_count - 1); - else - init_data.add_uint_line(vertices_count - 2, vertices_count - 1); + init_data.add_line(vertices_count - 2, vertices_count - 1); } m_model.init_from(std::move(init_data)); #else @@ -1480,8 +1477,8 @@ static void thick_lines_to_geometry( if (!is_first && bottom_z_different) { // Found a change of the layer thickness -> Add a cap at the end of the previous segment. - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); + geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); + geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); } // Share top / bottom vertices if possible. @@ -1531,13 +1528,13 @@ static void thick_lines_to_geometry( geometry.add_vertex(Vec3f(a2.x(), a2.y(), middle_z), Vec3f(-xy_right_normal.x(), -xy_right_normal.y(), 0.0f)); if (cross2(v_prev, v) > 0.0) { // Right turn. Fill in the right turn wedge. - geometry.add_uint_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]); - geometry.add_uint_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]); + geometry.add_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]); + geometry.add_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]); } else { // Left turn. Fill in the left turn wedge. - geometry.add_uint_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]); - geometry.add_uint_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]); + geometry.add_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]); + geometry.add_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]); } } } @@ -1559,11 +1556,11 @@ static void thick_lines_to_geometry( // Replace the left / right vertex indices to point to the start of the loop. const size_t indices_count = geometry.indices_count(); for (size_t u = indices_count - 24; u < indices_count; ++u) { - const unsigned int id = geometry.extract_uint_index(u); + const unsigned int id = geometry.extract_index(u); if (id == (unsigned int)idx_prev[Left]) - geometry.set_uint_index(u, (unsigned int)idx_initial[Left]); + geometry.set_index(u, (unsigned int)idx_initial[Left]); else if (id == (unsigned int)idx_prev[Right]) - geometry.set_uint_index(u, (unsigned int)idx_initial[Right]); + geometry.set_index(u, (unsigned int)idx_initial[Right]); } } } @@ -1600,36 +1597,36 @@ static void thick_lines_to_geometry( if (bottom_z_different && (closed || (!is_first && !is_last))) { // Found a change of the layer thickness -> Add a cap at the beginning of this segment. - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); + geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); + geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); } if (!closed) { // Terminate open paths with caps. if (is_first) { - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); + geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); + geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); } // We don't use 'else' because both cases are true if we have only one line. if (is_last) { - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); + geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); + geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); } } // Add quads for a straight hollow tube-like segment. // bottom-right face - geometry.add_uint_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]); - geometry.add_uint_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]); + geometry.add_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]); + geometry.add_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]); // top-right face - geometry.add_uint_triangle(idx_a[Right], idx_b[Right], idx_b[Top]); - geometry.add_uint_triangle(idx_a[Right], idx_b[Top], idx_a[Top]); + geometry.add_triangle(idx_a[Right], idx_b[Right], idx_b[Top]); + geometry.add_triangle(idx_a[Right], idx_b[Top], idx_a[Top]); // top-left face - geometry.add_uint_triangle(idx_a[Top], idx_b[Top], idx_b[Left]); - geometry.add_uint_triangle(idx_a[Top], idx_b[Left], idx_a[Left]); + geometry.add_triangle(idx_a[Top], idx_b[Top], idx_b[Left]); + geometry.add_triangle(idx_a[Top], idx_b[Left], idx_a[Left]); // bottom-left face - geometry.add_uint_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]); - geometry.add_uint_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]); + geometry.add_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]); + geometry.add_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]); } } @@ -1769,13 +1766,13 @@ static void thick_lines_to_geometry( if (is_right_turn) { // Right turn. Fill in the right turn wedge. - geometry.add_uint_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]); - geometry.add_uint_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]); + geometry.add_triangle(idx_prev[Right], idx_a[Right], idx_prev[Top]); + geometry.add_triangle(idx_prev[Right], idx_prev[Bottom], idx_a[Right]); } else { // Left turn. Fill in the left turn wedge. - geometry.add_uint_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]); - geometry.add_uint_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]); + geometry.add_triangle(idx_prev[Left], idx_prev[Top], idx_a[Left]); + geometry.add_triangle(idx_prev[Left], idx_a[Left], idx_prev[Bottom]); } } else { @@ -1794,11 +1791,11 @@ static void thick_lines_to_geometry( // Replace the left / right vertex indices to point to the start of the loop. const size_t indices_count = geometry.indices_count(); for (size_t u = indices_count - 24; u < indices_count; ++u) { - const unsigned int id = geometry.extract_uint_index(u); + const unsigned int id = geometry.extract_index(u); if (id == (unsigned int)idx_prev[Left]) - geometry.set_uint_index(u, (unsigned int)idx_initial[Left]); + geometry.set_index(u, (unsigned int)idx_initial[Left]); else if (id == (unsigned int)idx_prev[Right]) - geometry.set_uint_index(u, (unsigned int)idx_initial[Right]); + geometry.set_index(u, (unsigned int)idx_initial[Right]); } } @@ -1837,30 +1834,30 @@ static void thick_lines_to_geometry( if (!closed) { // Terminate open paths with caps. if (i == 0) { - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); - geometry.add_uint_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); + geometry.add_triangle(idx_a[Bottom], idx_a[Right], idx_a[Top]); + geometry.add_triangle(idx_a[Bottom], idx_a[Top], idx_a[Left]); } // We don't use 'else' because both cases are true if we have only one line. if (i + 1 == lines.size()) { - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); - geometry.add_uint_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); + geometry.add_triangle(idx_b[Bottom], idx_b[Left], idx_b[Top]); + geometry.add_triangle(idx_b[Bottom], idx_b[Top], idx_b[Right]); } } // Add quads for a straight hollow tube-like segment. // bottom-right face - geometry.add_uint_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]); - geometry.add_uint_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]); + geometry.add_triangle(idx_a[Bottom], idx_b[Bottom], idx_b[Right]); + geometry.add_triangle(idx_a[Bottom], idx_b[Right], idx_a[Right]); // top-right face - geometry.add_uint_triangle(idx_a[Right], idx_b[Right], idx_b[Top]); - geometry.add_uint_triangle(idx_a[Right], idx_b[Top], idx_a[Top]); + geometry.add_triangle(idx_a[Right], idx_b[Right], idx_b[Top]); + geometry.add_triangle(idx_a[Right], idx_b[Top], idx_a[Top]); // top-left face - geometry.add_uint_triangle(idx_a[Top], idx_b[Top], idx_b[Left]); - geometry.add_uint_triangle(idx_a[Top], idx_b[Left], idx_a[Left]); + geometry.add_triangle(idx_a[Top], idx_b[Top], idx_b[Left]); + geometry.add_triangle(idx_a[Top], idx_b[Left], idx_a[Left]); // bottom-left face - geometry.add_uint_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]); - geometry.add_uint_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]); + geometry.add_triangle(idx_a[Left], idx_b[Left], idx_b[Bottom]); + geometry.add_triangle(idx_a[Left], idx_b[Bottom], idx_a[Bottom]); } } #else diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 4f6fdc7afd..0c3dd6560a 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1675,7 +1675,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) #if ENABLE_LEGACY_OPENGL_REMOVAL const size_t indices_count = data.indices_count(); for (size_t i = 0; i < indices_count; ++i) { - indices.push_back(static_cast(data.extract_ushort_index(i) + base_index)); + indices.push_back(static_cast(data.extract_index(i) + base_index)); } #else for (const auto& entity : data.entities) { diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 10e4efc116..4a42e11c1b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -161,7 +161,11 @@ void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id) bool GLCanvas3D::LayersEditing::is_allowed() const { +#if ENABLE_GL_SHADERS_ATTRIBUTES + return wxGetApp().get_shader("variable_layer_height_attr") != nullptr && m_z_texture_id > 0; +#else return wxGetApp().get_shader("variable_layer_height") != nullptr && m_z_texture_id > 0; +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } bool GLCanvas3D::LayersEditing::is_enabled() const @@ -324,7 +328,11 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) bool GLCanvas3D::LayersEditing::is_initialized() const { +#if ENABLE_GL_SHADERS_ATTRIBUTES + return wxGetApp().get_shader("variable_layer_height_attr") != nullptr; +#else return wxGetApp().get_shader("variable_layer_height") != nullptr; +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const @@ -402,7 +410,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 m_profile.background.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -424,8 +432,8 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 init_data.add_vertex(Vec2f(l, t), Vec2f(0.0f, 1.0f)); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); m_profile.background.init_from(std::move(init_data)); } @@ -491,7 +499,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.baseline.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P2 }; init_data.color = ColorRGBA::BLACK(); init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -508,7 +516,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) #endif // ENABLE_GL_SHADERS_ATTRIBUTES // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_profile.baseline.init_from(std::move(init_data)); } @@ -522,7 +530,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.profile.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::index_type(m_layer_height_profile.size() / 2) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P2 }; init_data.color = ColorRGBA::BLUE(); init_data.reserve_vertices(m_layer_height_profile.size() / 2); init_data.reserve_indices(m_layer_height_profile.size() / 2); @@ -536,10 +544,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) init_data.add_vertex(Vec2f(bar_rect.get_left() + float(m_layer_height_profile[i + 1]) * scale_x, bar_rect.get_bottom() + float(m_layer_height_profile[i]) * scale_y)); #endif // ENABLE_GL_SHADERS_ATTRIBUTES - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_index((unsigned short)i / 2); - else - init_data.add_uint_index(i / 2); + init_data.add_index(i / 2); } m_profile.profile.init_from(std::move(init_data)); @@ -994,7 +999,7 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons if (m_render_fill) { GLModel::Geometry fill_data; #if ENABLE_LEGACY_OPENGL_REMOVAL - fill_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::UINT }; + fill_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; fill_data.color = { 0.3333f, 0.0f, 0.0f, 0.5f }; // vertices + indices @@ -1008,7 +1013,7 @@ void GLCanvas3D::SequentialPrintClearance::set_polygons(const Polygons& polygons fill_data.add_vertex((Vec3f)(v.cast() + 0.0125f * Vec3f::UnitZ())); // add a small positive z to avoid z-fighting ++vertices_counter; if (vertices_counter % 3 == 0) - fill_data.add_uint_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + fill_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } } @@ -5439,7 +5444,7 @@ void GLCanvas3D::_render_background() m_background.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -5450,8 +5455,8 @@ void GLCanvas3D::_render_background() init_data.add_vertex(Vec2f(-1.0f, 1.0f), Vec2f(0.0f, 1.0f)); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); m_background.init_from(std::move(init_data)); } @@ -6142,7 +6147,7 @@ void GLCanvas3D::_render_sla_slices() #if ENABLE_LEGACY_OPENGL_REMOVAL auto init_model = [](GLModel& model, const Pointf3s& triangles, const ColorRGBA& color) { GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(triangles.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(triangles.size()); init_data.reserve_indices(triangles.size() / 3); init_data.color = color; @@ -6151,12 +6156,8 @@ void GLCanvas3D::_render_sla_slices() for (const Vec3d& v : triangles) { init_data.add_vertex((Vec3f)v.cast()); ++vertices_count; - if (vertices_count % 3 == 0) { - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_triangle((unsigned short)vertices_count - 3, (unsigned short)vertices_count - 2, (unsigned short)vertices_count - 1); - else - init_data.add_uint_triangle(vertices_count - 3, vertices_count - 2, vertices_count - 1); - } + if (vertices_count % 3 == 0) + init_data.add_triangle(vertices_count - 3, vertices_count - 2, vertices_count - 1); } if (!init_data.is_empty()) @@ -6485,7 +6486,7 @@ void GLCanvas3D::_load_print_toolpaths(const BuildVolume &build_volume) #if ENABLE_LEGACY_OPENGL_REMOVAL GLVolume* volume = m_volumes.new_toolpath_volume(color); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; #else GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -6750,7 +6751,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c #if ENABLE_LEGACY_OPENGL_REMOVAL assert(vols.size() == geometries.size()); for (GLModel::Geometry& g : geometries) { - g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; } #else for (GLVolume *vol : vols) @@ -7006,7 +7007,7 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con #if ENABLE_LEGACY_OPENGL_REMOVAL assert(vols.size() == geometries.size()); for (GLModel::Geometry& g : geometries) { - g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + g.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; } #else for (GLVolume *volume : vols) diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index d659e66a08..af650875ba 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -59,16 +59,6 @@ static void smooth_normals_corner(const TriangleMesh& mesh, std::vector::iterator it = vertices.begin() + id * stride; + const size_t stride = vertex_stride_floats(format); + std::vector::const_iterator it = vertices.begin() + id * stride; vertices.erase(it, it + stride); } } @@ -402,21 +311,17 @@ size_t GLModel::Geometry::tex_coord_offset_floats(const Format& format) }; } -size_t GLModel::Geometry::index_stride_bytes(const Format& format) +size_t GLModel::Geometry::index_stride_bytes(const Geometry& data) { - switch (format.index_type) + switch (data.index_type) { case EIndexType::UINT: { return sizeof(unsigned int); } case EIndexType::USHORT: { return sizeof(unsigned short); } + case EIndexType::UBYTE: { return sizeof(unsigned char); } default: { assert(false); return 0; } }; } -GLModel::Geometry::EIndexType GLModel::Geometry::index_type(size_t vertices_count) -{ - return (vertices_count < 65536) ? EIndexType::USHORT : EIndexType::UINT; -} - bool GLModel::Geometry::has_position(const Format& format) { switch (format.vertex_layout) @@ -616,7 +521,7 @@ void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bb } Geometry& data = m_render_data.geometry; - data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3, GLModel::Geometry::index_type(3 * its.indices.size()) }; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(3 * its.indices.size()); data.reserve_indices(3 * its.indices.size()); @@ -630,10 +535,7 @@ void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bb data.add_vertex(vertex[j], n); } vertices_counter += 3; - if (data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - data.add_ushort_triangle((unsigned short)vertices_counter - 3, (unsigned short)vertices_counter - 2, (unsigned short)vertices_counter - 1); - else - data.add_uint_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } // update bounding box @@ -695,7 +597,7 @@ void GLModel::init_from(const Polygons& polygons, float z) } Geometry& data = m_render_data.geometry; - data.format = { Geometry::EPrimitiveType::Lines, Geometry::EVertexLayout::P3, Geometry::EIndexType::UINT }; + data.format = { Geometry::EPrimitiveType::Lines, Geometry::EVertexLayout::P3 }; size_t segments_count = 0; for (const Polygon& polygon : polygons) { @@ -714,7 +616,7 @@ void GLModel::init_from(const Polygons& polygons, float z) data.add_vertex(Vec3f(unscale(p0.x()), unscale(p0.y()), z)); data.add_vertex(Vec3f(unscale(p1.x()), unscale(p1.y()), z)); vertices_counter += 2; - data.add_uint_line(vertices_counter - 2, vertices_counter - 1); + data.add_line(vertices_counter - 2, vertices_counter - 1); } } @@ -809,7 +711,7 @@ void GLModel::reset() m_render_data.vertices_count = 0; m_render_data.indices_count = 0; m_render_data.geometry.vertices = std::vector(); - m_render_data.geometry.indices = std::vector(); + m_render_data.geometry.indices = std::vector(); #else for (RenderData& data : m_render_data) { // release gpu memory @@ -841,13 +743,14 @@ static GLenum get_primitive_mode(const GLModel::Geometry::Format& format) } } -static GLenum get_index_type(const GLModel::Geometry::Format& format) +static GLenum get_index_type(const GLModel::Geometry& data) { - switch (format.index_type) + switch (data.index_type) { default: case GLModel::Geometry::EIndexType::UINT: { return GL_UNSIGNED_INT; } case GLModel::Geometry::EIndexType::USHORT: { return GL_UNSIGNED_SHORT; } + case GLModel::Geometry::EIndexType::UBYTE: { return GL_UNSIGNED_BYTE; } } } @@ -861,58 +764,6 @@ void GLModel::render() const #else GLShaderProgram* shader = wxGetApp().get_current_shader(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//#if ENABLE_LEGACY_OPENGL_REMOVAL -// if (shader == nullptr) -// return; -// -// // sends data to gpu if not done yet -// if (m_render_data.vbo_id == 0 || m_render_data.ibo_id == 0) { -// if (m_render_data.geometry.vertices_count() > 0 && m_render_data.geometry.indices_count() > 0 && !send_to_gpu()) -// return; -// } -// -// const Geometry& data = m_render_data.geometry; -// -// const GLenum mode = get_primitive_mode(data.format); -// const GLenum index_type = get_index_type(data.format); -// -// const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); -// const bool position = Geometry::has_position(data.format); -// const bool normal = Geometry::has_normal(data.format); -// const bool tex_coord = Geometry::has_tex_coord(data.format); -// -// glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); -// -// if (position) { -// glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); -// glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -// } -// if (normal) { -// glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); -// glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -// } -// if (tex_coord) { -// glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); -// glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); -// } -// -// shader->set_uniform("uniform_color", data.color); -// -// glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); -// glsafe(::glDrawElements(mode, indices_count(), index_type, nullptr)); -// glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -// -// if (tex_coord) -// glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); -// if (normal) -// glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); -// if (position) -// glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -// -// glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); -//#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (const RenderData& data : m_render_data) { if (data.vbo_id == 0 || data.ibo_id == 0) continue; @@ -948,9 +799,6 @@ void GLModel::render() const glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//#endif // ENABLE_LEGACY_OPENGL_REMOVAL -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_LEGACY_OPENGL_REMOVAL } @@ -976,7 +824,7 @@ void GLModel::render(const std::pair& range) const Geometry& data = m_render_data.geometry; const GLenum mode = get_primitive_mode(data.format); - const GLenum index_type = get_index_type(data.format); + const GLenum index_type = get_index_type(data); const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); const bool position = Geometry::has_position(data.format); @@ -1031,7 +879,7 @@ void GLModel::render(const std::pair& range) shader->set_uniform("uniform_color", data.color); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); - glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data.format)))); + glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data)))); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -1073,14 +921,14 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance return; // vertex attributes - GLint position_id = shader->get_attrib_location("v_position"); - GLint normal_id = shader->get_attrib_location("v_normal"); + const GLint position_id = shader->get_attrib_location("v_position"); + const GLint normal_id = shader->get_attrib_location("v_normal"); if (position_id == -1 || normal_id == -1) return; // instance attributes - GLint offset_id = shader->get_attrib_location("i_offset"); - GLint scales_id = shader->get_attrib_location("i_scales"); + const GLint offset_id = shader->get_attrib_location("i_offset"); + const GLint scales_id = shader->get_attrib_location("i_scales"); if (offset_id == -1 || scales_id == -1) return; @@ -1127,8 +975,8 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance #if ENABLE_LEGACY_OPENGL_REMOVAL const Geometry& data = m_render_data.geometry; - GLenum mode = get_primitive_mode(data.format); - GLenum index_type = get_index_type(data.format); + const GLenum mode = get_primitive_mode(data.format); + const GLenum index_type = get_index_type(data); shader->set_uniform("uniform_color", data.color); @@ -1233,10 +1081,32 @@ bool GLModel::send_to_gpu() // indices glsafe(::glGenBuffers(1, &m_render_data.ibo_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (m_render_data.vertices_count <= 256) { + // convert indices to unsigned char to save gpu memory + std::vector reduced_indices(data.indices.size()); + for (size_t i = 0; i < data.indices.size(); ++i) { + reduced_indices[i] = (unsigned char)data.indices[i]; + } + data.index_type = Geometry::EIndexType::UBYTE; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, reduced_indices.size() * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + else if (m_render_data.vertices_count <= 65536) { + // convert indices to unsigned short to save gpu memory + std::vector reduced_indices(data.indices.size()); + for (size_t i = 0; i < data.indices.size(); ++i) { + reduced_indices[i] = (unsigned short)data.indices[i]; + } + data.index_type = Geometry::EIndexType::USHORT; + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, reduced_indices.size() * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + else { + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } m_render_data.indices_count = indices_count(); - data.indices = std::vector(); + data.indices = std::vector(); return true; } @@ -1260,20 +1130,6 @@ void GLModel::send_to_gpu(RenderData& data, const std::vector& vertices, } #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_LEGACY_OPENGL_REMOVAL -static void append_vertex(GLModel::Geometry& data, const Vec3f& position, const Vec3f& normal) -{ - data.add_vertex(position, normal); -} - -static void append_triangle(GLModel::Geometry& data, unsigned short v1, unsigned short v2, unsigned short v3) -{ - data.add_ushort_index(v1); - data.add_ushort_index(v2); - data.add_ushort_index(v3); -} -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - #if ENABLE_LEGACY_OPENGL_REMOVAL template inline bool all_vertices_inside(const GLModel::Geometry& geometry, Fn fn) @@ -1330,7 +1186,7 @@ bool contains(const BuildVolume& volume, const GLModel& model, bool ignore_botto } #endif // ENABLE_LEGACY_OPENGL_REMOVAL -GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) +GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height) { #if !ENABLE_LEGACY_OPENGL_REMOVAL auto append_vertex = [](GLModel::Geometry::Entity& entity, const Vec3f& position, const Vec3f& normal) { @@ -1344,14 +1200,11 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl }; #endif // !ENABLE_LEGACY_OPENGL_REMOVAL - resolution = std::max(4, resolution); -#if ENABLE_LEGACY_OPENGL_REMOVAL - resolution = std::min(10922, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_LEGACY_OPENGL_REMOVAL + resolution = std::max(4, resolution); GLModel::Geometry data; #if ENABLE_LEGACY_OPENGL_REMOVAL - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(6 * resolution + 2); data.reserve_indices(6 * resolution * 3); #else @@ -1363,7 +1216,7 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl std::vector cosines(resolution); std::vector sines(resolution); - for (unsigned short i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { const float angle = angle_step * float(i); cosines[i] = ::cos(angle); sines[i] = -::sin(angle); @@ -1373,63 +1226,63 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl // tip vertices/normals #if ENABLE_LEGACY_OPENGL_REMOVAL - append_vertex(data, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + data.add_vertex(Vec3f(0.0f, 0.0f, total_height), (Vec3f)Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // tip triangles - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short v3 = (i < resolution - 1) ? i + 2 : 1; - append_triangle(data, 0, i + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 2 : 1; + data.add_triangle(0, i + 1, v3); } // tip cap outer perimeter vertices - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(tip_radius * sines[i], tip_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap inner perimeter vertices - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), (Vec3f)(-Vec3f::UnitZ())); } // tip cap triangles - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; - const unsigned short v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; - append_triangle(data, i + resolution + 1, v3, v2); - append_triangle(data, i + resolution + 1, i + 2 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; + data.add_triangle(i + resolution + 1, v3, v2); + data.add_triangle(i + resolution + 1, i + 2 * resolution + 1, v3); } // stem bottom vertices - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], stem_height), Vec3f(sines[i], cosines[i], 0.0f)); } // stem top vertices - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, { sines[i], cosines[i], 0.0f }); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), Vec3f(sines[i], cosines[i], 0.0f)); } // stem triangles - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; - const unsigned short v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; - append_triangle(data, i + 3 * resolution + 1, v3, v2); - append_triangle(data, i + 3 * resolution + 1, i + 4 * resolution + 1, v3); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; + data.add_triangle(i + 3 * resolution + 1, v3, v2); + data.add_triangle(i + 3 * resolution + 1, i + 4 * resolution + 1, v3); } // stem cap vertices - append_vertex(data, Vec3f::Zero(), -Vec3f::UnitZ()); - for (unsigned short i = 0; i < resolution; ++i) { - append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, -Vec3f::UnitZ()); + data.add_vertex((Vec3f)Vec3f::Zero(), (Vec3f)(-Vec3f::UnitZ())); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_vertex(Vec3f(stem_radius * sines[i], stem_radius * cosines[i], 0.0f), (Vec3f)(-Vec3f::UnitZ())); } // stem cap triangles - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; - append_triangle(data, 5 * resolution + 1, v3, i + 5 * resolution + 2); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; + data.add_triangle(5 * resolution + 1, v3, i + 5 * resolution + 2); } #else append_vertex(entity, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); @@ -1497,7 +1350,7 @@ GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, fl return data; } -GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) +GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness) { #if !ENABLE_LEGACY_OPENGL_REMOVAL auto append_vertex = [](GLModel::Geometry::Entity& entity, const Vec3f& position, const Vec3f& normal) { @@ -1511,14 +1364,11 @@ GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float }; #endif // !ENABLE_LEGACY_OPENGL_REMOVAL - resolution = std::max(2, resolution); -#if ENABLE_LEGACY_OPENGL_REMOVAL - resolution = std::min(8188, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_LEGACY_OPENGL_REMOVAL + resolution = std::max(2, resolution); GLModel::Geometry data; #if ENABLE_LEGACY_OPENGL_REMOVAL - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(8 * (resolution + 1) + 30); data.reserve_indices((8 * resolution + 16) * 3); #else @@ -1537,146 +1387,146 @@ GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float #if ENABLE_LEGACY_OPENGL_REMOVAL // tip // top face vertices - append_vertex(data, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { -tip_height, radius, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_triangle(data, 0, 1, 2); - append_triangle(data, 0, 2, 4); - append_triangle(data, 4, 2, 3); + data.add_triangle(0, 1, 2); + data.add_triangle(0, 2, 4); + data.add_triangle(4, 2, 3); // bottom face vertices - append_vertex(data, { 0.0f, outer_radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { -tip_height, radius, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { 0.0f, inner_radius, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_triangle(data, 5, 7, 6); - append_triangle(data, 5, 9, 7); - append_triangle(data, 9, 8, 7); + data.add_triangle(5, 7, 6); + data.add_triangle(5, 9, 7); + data.add_triangle(9, 8, 7); // side faces vertices - append_vertex(data, { 0.0f, outer_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, outer_radius, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); Vec3f normal(-half_tip_width, tip_height, 0.0f); normal.normalize(); - append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, normal); - append_vertex(data, { -tip_height, radius, -half_thickness }, normal); - append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, normal); - append_vertex(data, { -tip_height, radius, half_thickness }, normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius + half_tip_width, half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); normal = { -half_tip_width, -tip_height, 0.0f }; normal.normalize(); - append_vertex(data, { -tip_height, radius, -half_thickness }, normal); - append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, normal); - append_vertex(data, { -tip_height, radius, half_thickness }, normal); - append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, normal); + data.add_vertex(Vec3f(-tip_height, radius, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), normal); + data.add_vertex(Vec3f(-tip_height, radius, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), normal); - append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, inner_radius, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitX()); - append_vertex(data, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, radius - half_tip_width, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(0.0f, inner_radius, half_thickness), (Vec3f)Vec3f::UnitX()); // side face triangles - for (unsigned short i = 0; i < 4; ++i) { - const unsigned short ii = i * 4; - append_triangle(data, 10 + ii, 11 + ii, 13 + ii); - append_triangle(data, 10 + ii, 13 + ii, 12 + ii); + for (unsigned int i = 0; i < 4; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(10 + ii, 11 + ii, 13 + ii); + data.add_triangle(10 + ii, 13 + ii, 12 + ii); } // stem // top face vertices - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; - append_vertex(data, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; - append_vertex(data, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness), (Vec3f)Vec3f::UnitZ()); } // top face triangles - for (unsigned short i = 0; i < resolution; ++i) { - append_triangle(data, 26 + i, 27 + i, 27 + resolution + i); - append_triangle(data, 27 + i, 28 + resolution + i, 27 + resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(26 + i, 27 + i, 27 + resolution + i); + data.add_triangle(27 + i, 28 + resolution + i, 27 + resolution + i); } // bottom face vertices - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; - append_vertex(data, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; - append_vertex(data, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness), (Vec3f)(-Vec3f::UnitZ())); } // bottom face triangles - for (unsigned short i = 0; i < resolution; ++i) { - append_triangle(data, 28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); - append_triangle(data, 29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); + data.add_triangle(29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); } // side faces vertices and triangles - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(data, { inner_radius * s, inner_radius * c, -half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, -half_thickness), Vec3f(-s, -c, 0.0f)); } - for (unsigned short i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(data, { inner_radius * s, inner_radius * c, half_thickness }, { -s, -c, 0.0f }); + data.add_vertex(Vec3f(inner_radius * s, inner_radius * c, half_thickness), Vec3f(-s, -c, 0.0f)); } - unsigned short first_id = 26 + 4 * (resolution + 1); - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short ii = first_id + i; - append_triangle(data, ii, ii + 1, ii + resolution + 2); - append_triangle(data, ii, ii + resolution + 2, ii + resolution + 1); + unsigned int first_id = 26 + 4 * (resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } - append_vertex(data, { inner_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { outer_radius, 0.0f, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { inner_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { outer_radius, 0.0f, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(inner_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(inner_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(outer_radius, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); first_id = 26 + 6 * (resolution + 1); - append_triangle(data, first_id, first_id + 1, first_id + 3); - append_triangle(data, first_id, first_id + 3, first_id + 2); + data.add_triangle(first_id, first_id + 1, first_id + 3); + data.add_triangle(first_id, first_id + 3, first_id + 2); - for (short i = resolution; i >= 0; --i) { + for (int i = resolution; i >= 0; --i) { const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(data, { outer_radius * s, outer_radius * c, -half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, -half_thickness), Vec3f(s, c, 0.0f)); } - for (short i = resolution; i >= 0; --i) { + for (int i = resolution; i >= 0; --i) { const float angle = float(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); - append_vertex(data, { outer_radius * s, outer_radius * c, +half_thickness }, { s, c, 0.0f }); + data.add_vertex(Vec3f(outer_radius * s, outer_radius * c, +half_thickness), Vec3f(s, c, 0.0f)); } first_id = 30 + 6 * (resolution + 1); - for (unsigned short i = 0; i < resolution; ++i) { - const unsigned short ii = first_id + i; - append_triangle(data, ii, ii + 1, ii + resolution + 2); - append_triangle(data, ii, ii + resolution + 2, ii + resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; + data.add_triangle(ii, ii + 1, ii + resolution + 2); + data.add_triangle(ii, ii + resolution + 2, ii + resolution + 1); } #else // tip @@ -1845,7 +1695,7 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w GLModel::Geometry data; #if ENABLE_LEGACY_OPENGL_REMOVAL - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(42); data.reserve_indices(72); #else @@ -1860,82 +1710,82 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w #if ENABLE_LEGACY_OPENGL_REMOVAL // top face vertices - append_vertex(data, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { 0.0, total_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { -half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { -half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ()); - append_vertex(data, { -half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitZ()); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitZ()); // top face triangles - append_triangle(data, 0, 1, 6); - append_triangle(data, 6, 1, 5); - append_triangle(data, 4, 5, 3); - append_triangle(data, 5, 1, 3); - append_triangle(data, 1, 2, 3); + data.add_triangle(0, 1, 6); + data.add_triangle(6, 1, 5); + data.add_triangle(4, 5, 3); + data.add_triangle(5, 1, 3); + data.add_triangle(1, 2, 3); // bottom face vertices - append_vertex(data, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { 0.0, total_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ()); - append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitZ())); // bottom face triangles - append_triangle(data, 7, 13, 8); - append_triangle(data, 13, 12, 8); - append_triangle(data, 12, 11, 10); - append_triangle(data, 8, 12, 10); - append_triangle(data, 9, 8, 10); + data.add_triangle(7, 13, 8); + data.add_triangle(13, 12, 8); + data.add_triangle(12, 11, 10); + data.add_triangle(8, 12, 10); + data.add_triangle(9, 8, 10); // side faces vertices - append_vertex(data, { half_stem_width, 0.0, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { half_stem_width, stem_height, -half_thickness }, Vec3f::UnitX()); - append_vertex(data, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitX()); - append_vertex(data, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)Vec3f::UnitX()); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)Vec3f::UnitX()); - append_vertex(data, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); Vec3f normal(tip_height, half_tip_width, 0.0f); normal.normalize(); - append_vertex(data, { half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(data, { 0.0, total_height, -half_thickness }, normal); - append_vertex(data, { half_tip_width, stem_height, half_thickness }, normal); - append_vertex(data, { 0.0, total_height, half_thickness }, normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(half_tip_width, stem_height, half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); normal = { -tip_height, half_tip_width, 0.0f }; normal.normalize(); - append_vertex(data, { 0.0, total_height, -half_thickness }, normal); - append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, normal); - append_vertex(data, { 0.0, total_height, half_thickness }, normal); - append_vertex(data, { -half_tip_width, stem_height, half_thickness }, normal); + data.add_vertex(Vec3f(0.0f, total_height, -half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), normal); + data.add_vertex(Vec3f(0.0f, total_height, half_thickness), normal); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), normal); - append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { -half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(-half_tip_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_tip_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitY())); - append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitX()); - append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitX()); - append_vertex(data, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitX()); - append_vertex(data, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitX()); + data.add_vertex(Vec3f(-half_stem_width, stem_height, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, stem_height, half_thickness), (Vec3f)(-Vec3f::UnitX())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitX())); - append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); - append_vertex(data, { half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY()); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, -half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(-half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); + data.add_vertex(Vec3f(half_stem_width, 0.0f, half_thickness), (Vec3f)(-Vec3f::UnitY())); // side face triangles - for (unsigned short i = 0; i < 7; ++i) { - const unsigned short ii = i * 4; - append_triangle(data, 14 + ii, 15 + ii, 17 + ii); - append_triangle(data, 14 + ii, 17 + ii, 16 + ii); + for (unsigned int i = 0; i < 7; ++i) { + const unsigned int ii = i * 4; + data.add_triangle(14 + ii, 15 + ii, 17 + ii); + data.add_triangle(14 + ii, 17 + ii, 16 + ii); } #else // top face vertices @@ -2023,16 +1873,13 @@ GLModel::Geometry straight_arrow(float tip_width, float tip_height, float stem_w return data; } -GLModel::Geometry diamond(unsigned short resolution) +GLModel::Geometry diamond(unsigned int resolution) { - resolution = std::max(4, resolution); -#if ENABLE_LEGACY_OPENGL_REMOVAL - resolution = std::min(65534, resolution); // ensure no unsigned short overflow of indices -#endif // ENABLE_LEGACY_OPENGL_REMOVAL + resolution = std::max(4, resolution); GLModel::Geometry data; #if ENABLE_LEGACY_OPENGL_REMOVAL - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(resolution + 2); data.reserve_indices((2 * (resolution + 1)) * 3); #else @@ -2044,28 +1891,28 @@ GLModel::Geometry diamond(unsigned short resolution) #if ENABLE_LEGACY_OPENGL_REMOVAL // vertices - for (unsigned short i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { const float ii = float(i) * step; const Vec3f p = { 0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f }; - append_vertex(data, p, p.normalized()); + data.add_vertex(p, (Vec3f)p.normalized()); } Vec3f p = { 0.0f, 0.0f, 0.5f }; - append_vertex(data, p, p.normalized()); + data.add_vertex(p, (Vec3f)p.normalized()); p = { 0.0f, 0.0f, -0.5f }; - append_vertex(data, p, p.normalized()); + data.add_vertex(p, (Vec3f)p.normalized()); // triangles // top - for (unsigned short i = 0; i < resolution; ++i) { - append_triangle(data, i + 0, i + 1, resolution); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, i + 1, resolution); } - append_triangle(data, resolution - 1, 0, resolution); + data.add_triangle(resolution - 1, 0, resolution); // bottom - for (unsigned short i = 0; i < resolution; ++i) { - append_triangle(data, i + 0, resolution + 1, i + 1); + for (unsigned int i = 0; i < resolution; ++i) { + data.add_triangle(i + 0, resolution + 1, i + 1); } - append_triangle(data, resolution - 1, resolution + 1, 0); + data.add_triangle(resolution - 1, resolution + 1, 0); #else // positions for (int i = 0; i < resolution; ++i) { @@ -2109,24 +1956,23 @@ GLModel::Geometry diamond(unsigned short resolution) #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG -GLModel::Geometry smooth_sphere(unsigned short resolution, float radius) +GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) { - resolution = std::max(4, resolution); - resolution = std::min(256, resolution); // ensure no unsigned short overflow of indices + resolution = std::max(4, resolution); - const unsigned short sectorCount = /*2 **/ resolution; - const unsigned short stackCount = resolution; + const unsigned int sectorCount = resolution; + const unsigned int stackCount = resolution; const float sectorStep = float(2.0 * M_PI / sectorCount); const float stackStep = float(M_PI / stackCount); GLModel::Geometry data; - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::USHORT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; data.reserve_vertices((stackCount - 1) * sectorCount + 2); data.reserve_indices((2 * (stackCount - 1) * sectorCount) * 3); // vertices - for (unsigned short i = 0; i <= stackCount; ++i) { + for (unsigned int i = 0; i <= stackCount; ++i) { // from pi/2 to -pi/2 const double stackAngle = 0.5 * M_PI - stackStep * i; const double xy = double(radius) * ::cos(stackAngle); @@ -2136,7 +1982,7 @@ GLModel::Geometry smooth_sphere(unsigned short resolution, float radius) data.add_vertex(v, (Vec3f)v.normalized()); } else { - for (unsigned short j = 0; j < sectorCount; ++j) { + for (unsigned int j = 0; j < sectorCount; ++j) { // from 0 to 2pi const double sectorAngle = sectorStep * j; const Vec3f v(float(xy * std::cos(sectorAngle)), float(xy * std::sin(sectorAngle)), float(z)); @@ -2146,24 +1992,24 @@ GLModel::Geometry smooth_sphere(unsigned short resolution, float radius) } // triangles - for (unsigned short i = 0; i < stackCount; ++i) { + for (unsigned int i = 0; i < stackCount; ++i) { // Beginning of current stack. - unsigned short k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); - const unsigned short k1_first = k1; + unsigned int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount); + const unsigned int k1_first = k1; // Beginning of next stack. - unsigned short k2 = (i == 0) ? 1 : (k1 + sectorCount); - const unsigned short k2_first = k2; - for (unsigned short j = 0; j < sectorCount; ++j) { + unsigned int k2 = (i == 0) ? 1 : (k1 + sectorCount); + const unsigned int k2_first = k2; + for (unsigned int j = 0; j < sectorCount; ++j) { // 2 triangles per sector excluding first and last stacks - unsigned short k1_next = k1; - unsigned short k2_next = k2; + unsigned int k1_next = k1; + unsigned int k2_next = k2; if (i != 0) { k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1); - data.add_ushort_triangle(k1, k2, k1_next); + data.add_triangle(k1, k2, k1_next); } if (i + 1 != stackCount) { k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1); - data.add_ushort_triangle(k1_next, k2, k2_next); + data.add_triangle(k1_next, k2, k2_next); } k1 = k1_next; k2 = k2_next; diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 0894cf8531..e18d046783 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -68,23 +68,25 @@ namespace GUI { enum class EIndexType : unsigned char { UINT, // unsigned int - USHORT // unsigned short + USHORT, // unsigned short + UBYTE // unsigned byte }; struct Format { EPrimitiveType type{ EPrimitiveType::Triangles }; EVertexLayout vertex_layout{ EVertexLayout::P3N3 }; - EIndexType index_type{ EIndexType::UINT }; }; Format format; std::vector vertices; - std::vector indices; + std::vector indices; + EIndexType index_type{ EIndexType::UINT }; ColorRGBA color{ ColorRGBA::BLACK() }; - void reserve_vertices(size_t vertices_count); - void reserve_indices(size_t indices_count); + void reserve_vertices(size_t vertices_count) { vertices.reserve(vertices_count * vertex_stride_floats(format)); } + void reserve_indices(size_t indices_count) { indices.reserve(indices_count * index_stride_bytes(*this)); } + void add_vertex(const Vec2f& position); // EVertexLayout::P2 void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2 @@ -94,36 +96,29 @@ namespace GUI { void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 - void set_ushort_index(size_t id, unsigned short index); - void set_uint_index(size_t id, unsigned int index); + void set_index(size_t id, unsigned int index); - void add_ushort_index(unsigned short id); - void add_uint_index(unsigned int id); - - void add_ushort_line(unsigned short id1, unsigned short id2); - void add_uint_line(unsigned int id1, unsigned int id2); - - void add_ushort_triangle(unsigned short id1, unsigned short id2, unsigned short id3); - void add_uint_triangle(unsigned int id1, unsigned int id2, unsigned int id3); + void add_index(unsigned int id); + void add_line(unsigned int id1, unsigned int id2); + void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3); Vec2f extract_position_2(size_t id) const; Vec3f extract_position_3(size_t id) const; Vec3f extract_normal_3(size_t id) const; Vec2f extract_tex_coord_2(size_t id) const; - unsigned int extract_uint_index(size_t id) const; - unsigned short extract_ushort_index(size_t id) const; + unsigned int extract_index(size_t id) const; void remove_vertex(size_t id); bool is_empty() const { return vertices_count() == 0 || indices_count() == 0; } size_t vertices_count() const { return vertices.size() / vertex_stride_floats(format); } - size_t indices_count() const { return indices.size() / index_stride_bytes(format); } + size_t indices_count() const { return indices.size(); } size_t vertices_size_floats() const { return vertices.size(); } size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } - size_t indices_size_bytes() const { return indices.size(); } + size_t indices_size_bytes() const { return indices.size() * index_stride_bytes(*this); } static size_t vertex_stride_floats(const Format& format); static size_t vertex_stride_bytes(const Format& format) { return vertex_stride_floats(format) * sizeof(float); } @@ -143,9 +138,7 @@ namespace GUI { static size_t tex_coord_offset_floats(const Format& format); static size_t tex_coord_offset_bytes(const Format& format) { return tex_coord_offset_floats(format) * sizeof(float); } - static size_t index_stride_bytes(const Format& format); - - static EIndexType index_type(size_t vertices_count); + static size_t index_stride_bytes(const Geometry& data); static bool has_position(const Format& format); static bool has_normal(const Format& format); @@ -213,7 +206,7 @@ namespace GUI { size_t vertices_size_floats() const { return vertices_count() * Geometry::vertex_stride_floats(m_render_data.geometry.format); } size_t vertices_size_bytes() const { return vertices_size_floats() * sizeof(float); } - size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry.format); } + size_t indices_size_bytes() const { return indices_count() * Geometry::index_stride_bytes(m_render_data.geometry); } const Geometry& get_geometry() const { return m_render_data.geometry; } @@ -297,13 +290,13 @@ namespace GUI { // the origin of the arrow is in the center of the stem cap // the arrow has its axis of symmetry along the Z axis and is pointing upward // used to render bed axes and sequential marker - GLModel::Geometry stilized_arrow(unsigned short resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); + GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height); // create an arrow whose stem is a quarter of circle, with the given dimensions and resolution // the origin of the arrow is in the center of the circle // the arrow is contained in the 1st quadrant of the XY plane and is pointing counterclockwise // used to render sidebar hints for rotations - GLModel::Geometry circular_arrow(unsigned short resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); + GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness); // create an arrow with the given dimensions // the origin of the arrow is in the center of the stem cap @@ -314,13 +307,13 @@ namespace GUI { // create a diamond with the given resolution // the origin of the diamond is in its center // the diamond is contained into a box with size [1, 1, 1] - GLModel::Geometry diamond(unsigned short resolution); + GLModel::Geometry diamond(unsigned int resolution); #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SHOW_TOOLPATHS_COG // create a sphere with the given resolution and smooth normals // the origin of the sphere is in its center - GLModel::Geometry smooth_sphere(unsigned short resolution, float radius); + GLModel::Geometry smooth_sphere(unsigned int resolution, float radius); #endif // ENABLE_SHOW_TOOLPATHS_COG #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index bbc66d7113..2563939cfd 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -145,7 +145,7 @@ namespace GUI { m_rectangle.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; init_data.reserve_vertices(4); init_data.reserve_indices(4); @@ -156,10 +156,10 @@ namespace GUI { init_data.add_vertex(Vec2f(left, top)); // indices - init_data.add_ushort_index(0); - init_data.add_ushort_index(1); - init_data.add_ushort_index(2); - init_data.add_ushort_index(3); + init_data.add_index(0); + init_data.add_index(1); + init_data.add_index(2); + init_data.add_index(3); m_rectangle.init_from(std::move(init_data)); } diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index dc21fdde27..064ca1a18b 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -341,7 +341,7 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, #if ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -352,8 +352,8 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, init_data.add_vertex(Vec2f(left, top), Vec2f(uvs.left_top.u, uvs.left_top.v)); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); GLModel model; model.init_from(std::move(init_data)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index c6d5259a09..5c9b08a93c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -126,7 +126,7 @@ void GLGizmoCut::on_render() m_plane.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; init_data.color = { 0.8f, 0.8f, 0.8f, 0.5f }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -138,8 +138,8 @@ void GLGizmoCut::on_render() init_data.add_vertex(Vec3f(min_x, max_y, plane_center.z())); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); m_plane.init_from(std::move(init_data)); } @@ -177,7 +177,7 @@ void GLGizmoCut::on_render() m_grabber_connection.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.color = ColorRGBA::YELLOW(); init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -187,7 +187,7 @@ void GLGizmoCut::on_render() init_data.add_vertex((Vec3f)m_grabbers[0].center.cast()); // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_grabber_connection.init_from(std::move(init_data)); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 5ad8ba9d45..48c81bc5a1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -429,16 +429,13 @@ void GLGizmoFlatten::update_planes() for (auto& plane : m_planes) { #if ENABLE_LEGACY_OPENGL_REMOVAL GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::TriangleFan, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::index_type(plane.vertices.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::TriangleFan, GLModel::Geometry::EVertexLayout::P3N3 }; init_data.reserve_vertices(plane.vertices.size()); init_data.reserve_indices(plane.vertices.size()); // vertices + indices for (size_t i = 0; i < plane.vertices.size(); ++i) { init_data.add_vertex((Vec3f)plane.vertices[i].cast(), (Vec3f)plane.normal.cast()); - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_index((unsigned short)i); - else - init_data.add_uint_index((unsigned int)i); + init_data.add_index((unsigned int)i); } plane.vbo.init_from(std::move(init_data)); #else diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index f4e468a267..18acf6e9be 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -132,7 +132,7 @@ void GLGizmoMove3D::on_render() m_grabber_connections[id].model.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.color = AXES_COLOR[id]; init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -142,7 +142,7 @@ void GLGizmoMove3D::on_render() init_data.add_vertex((Vec3f)m_grabbers[id].center.cast()); // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_grabber_connections[id].model.init_from(std::move(init_data)); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index e0b0242d4f..03d60440ad 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -230,21 +230,21 @@ void GLGizmoPainterBase::render_cursor_circle() GLModel::Geometry init_data; static const unsigned int StepsCount = 32; static const float StepSize = 2.0f * float(PI) / float(StepsCount); - init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f }; init_data.reserve_vertices(StepsCount); init_data.reserve_indices(StepsCount); // vertices + indices - for (unsigned short i = 0; i < StepsCount; ++i) { - const float angle = float(i * StepSize); + for (unsigned int i = 0; i < StepsCount; ++i) { + const float angle = float(i) * StepSize; #if ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); #else init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius)); #endif // ENABLE_GL_SHADERS_ATTRIBUTES - init_data.add_ushort_index(i); + init_data.add_index(i); } m_circle.init_from(std::move(init_data)); @@ -1014,12 +1014,12 @@ void TriangleSelectorGUI::update_render_data() } GLModel::Geometry iva_enforcers_data; - iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; GLModel::Geometry iva_blockers_data; - iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; std::array iva_seed_fills_data; for (auto& data : iva_seed_fills_data) - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; #else for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) iva->release_geometry(); @@ -1055,7 +1055,7 @@ void TriangleSelectorGUI::update_render_data() iva.add_vertex(v0, n); iva.add_vertex(v1, n); iva.add_vertex(v2, n); - iva.add_uint_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2); + iva.add_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2); #else iva.push_geometry(v0, n); iva.push_geometry(v1, n); @@ -1345,7 +1345,7 @@ void TriangleSelectorGUI::update_paint_contour() GLModel::Geometry init_data; const std::vector contour_edges = this->get_seed_fill_contour(); - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::index_type(2 * contour_edges.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2 * contour_edges.size()); init_data.reserve_indices(2 * contour_edges.size()); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -1358,10 +1358,7 @@ void TriangleSelectorGUI::update_paint_contour() init_data.add_vertex(m_vertices[edge(0)].v); init_data.add_vertex(m_vertices[edge(1)].v); vertices_count += 2; - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_line((unsigned short)vertices_count - 2, (unsigned short)vertices_count - 1); - else - init_data.add_uint_line(vertices_count - 2, vertices_count - 1); + init_data.add_line(vertices_count - 2, vertices_count - 1); } if (!init_data.is_empty()) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index e9d07f21c3..33866c64fd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -297,15 +297,15 @@ void GLGizmoRotate::render_circle() const m_circle.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(ScaleStepsCount); init_data.reserve_indices(ScaleStepsCount); // vertices + indices - for (unsigned short i = 0; i < ScaleStepsCount; ++i) { + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { const float angle = float(i * ScaleStepRad); init_data.add_vertex(Vec3f(::cos(angle) * m_radius, ::sin(angle) * m_radius, 0.0f)); - init_data.add_ushort_index(i); + init_data.add_index(i); } m_circle.init_from(std::move(init_data)); @@ -340,12 +340,12 @@ void GLGizmoRotate::render_scale() const m_scale.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2 * ScaleStepsCount); init_data.reserve_indices(2 * ScaleStepsCount); // vertices + indices - for (unsigned short i = 0; i < ScaleStepsCount; ++i) { + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { const float angle = float(i * ScaleStepRad); const float cosa = ::cos(angle); const float sina = ::sin(angle); @@ -354,10 +354,12 @@ void GLGizmoRotate::render_scale() const const float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; const float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; + // vertices init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); - init_data.add_ushort_index(i * 2); - init_data.add_ushort_index(i * 2 + 1); + + // indices + init_data.add_line(i * 2, i * 2 + 1); } m_scale.init_from(std::move(init_data)); @@ -399,12 +401,12 @@ void GLGizmoRotate::render_snap_radii() const m_snap_radii.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2 * ScaleStepsCount); init_data.reserve_indices(2 * ScaleStepsCount); // vertices + indices - for (unsigned short i = 0; i < ScaleStepsCount; ++i) { + for (unsigned int i = 0; i < ScaleStepsCount; ++i) { const float angle = float(i * step); const float cosa = ::cos(angle); const float sina = ::sin(angle); @@ -413,10 +415,12 @@ void GLGizmoRotate::render_snap_radii() const const float out_x = cosa * out_radius; const float out_y = sina * out_radius; + // vertices init_data.add_vertex(Vec3f(in_x, in_y, 0.0f)); init_data.add_vertex(Vec3f(out_x, out_y, 0.0f)); - init_data.add_ushort_index(i * 2); - init_data.add_ushort_index(i * 2 + 1); + + // indices + init_data.add_line(i * 2, i * 2 + 1); } m_snap_radii.init_from(std::move(init_data)); @@ -450,7 +454,7 @@ void GLGizmoRotate::render_reference_radius(const ColorRGBA& color, bool radius_ m_reference_radius.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -459,7 +463,7 @@ void GLGizmoRotate::render_reference_radius(const ColorRGBA& color, bool radius_ init_data.add_vertex(Vec3f(m_radius * (1.0f + GrabberOffset), 0.0f, 0.0f)); // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_reference_radius.init_from(std::move(init_data)); } @@ -494,15 +498,15 @@ void GLGizmoRotate::render_angle() const m_angle_arc.reset(); if (m_angle > 0.0f) { GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::LineStrip, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(1 + AngleResolution); init_data.reserve_indices(1 + AngleResolution); // vertices + indices - for (unsigned short i = 0; i <= AngleResolution; ++i) { + for (unsigned int i = 0; i <= AngleResolution; ++i) { const float angle = float(i) * step_angle; init_data.add_vertex(Vec3f(::cos(angle) * ex_radius, ::sin(angle) * ex_radius, 0.0f)); - init_data.add_ushort_index(i); + init_data.add_index(i); } m_angle_arc.init_from(std::move(init_data)); @@ -532,7 +536,7 @@ void GLGizmoRotate::render_grabber_connection(const ColorRGBA& color, bool radiu m_grabber_connection.old_center = m_grabbers.front().center; GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -541,7 +545,7 @@ void GLGizmoRotate::render_grabber_connection(const ColorRGBA& color, bool radiu init_data.add_vertex((Vec3f)m_grabbers.front().center.cast()); // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_grabber_connection.model.init_from(std::move(init_data)); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index f32aac604d..373a2396d8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -515,7 +515,7 @@ void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int m_grabber_connections[id].model.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(2); init_data.reserve_indices(2); @@ -524,7 +524,7 @@ void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int init_data.add_vertex((Vec3f)m_grabbers[id_2].center.cast()); // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_grabber_connections[id].model.init_from(std::move(init_data)); } diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 4e4b268304..e7e9ba2fbe 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -202,7 +202,7 @@ void MeshClipper::recalculate_triangles() m_model.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::index_type(m_triangles2d.size()) }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; init_data.reserve_vertices(m_triangles2d.size()); init_data.reserve_indices(m_triangles2d.size()); @@ -212,10 +212,7 @@ void MeshClipper::recalculate_triangles() init_data.add_vertex((Vec3f)(tr * Vec3d((*(it + 1)).x(), (*(it + 1)).y(), height_mesh)).cast(), (Vec3f)up.cast()); init_data.add_vertex((Vec3f)(tr * Vec3d((*(it + 2)).x(), (*(it + 2)).y(), height_mesh)).cast(), (Vec3f)up.cast()); const size_t idx = it - m_triangles2d.cbegin(); - if (init_data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - init_data.add_ushort_triangle((unsigned short)idx, (unsigned short)idx + 1, (unsigned short)idx + 2); - else - init_data.add_uint_triangle((unsigned int)idx, (unsigned int)idx + 1, (unsigned int)idx + 2); + init_data.add_triangle((unsigned int)idx, (unsigned int)idx + 1, (unsigned int)idx + 2); } if (!init_data.is_empty()) diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 9f554b64d9..68a052341a 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1947,7 +1947,7 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con const Vec3f size = 0.2f * box.size().cast(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(48); init_data.reserve_indices(48); @@ -2009,8 +2009,8 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con init_data.add_vertex(Vec3f(b_min.x(), b_max.y(), b_max.z() - size.z())); // indices - for (unsigned short i = 0; i < 48; ++i) { - init_data.add_ushort_index(i); + for (unsigned int i = 0; i < 48; ++i) { + init_data.add_index(i); } m_box.init_from(std::move(init_data)); @@ -2371,7 +2371,7 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) m_planes.models[0].reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -2382,8 +2382,8 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) init_data.add_vertex(Vec3f(p1.x(), p2.y(), z1)); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); m_planes.models[0].init_from(std::move(init_data)); } @@ -2393,7 +2393,7 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) m_planes.models[1].reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); @@ -2404,8 +2404,8 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) init_data.add_vertex(Vec3f(p1.x(), p2.y(), z2)); // indices - init_data.add_ushort_triangle(0, 1, 2); - init_data.add_ushort_triangle(2, 3, 0); + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); m_planes.models[1].init_from(std::move(init_data)); } From c2140b4b1e5176bba7b023d74fa9da68c011fded Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 10 Mar 2022 09:22:57 +0100 Subject: [PATCH 092/149] Added 4Max Pro 2.0 profile and resources --- resources/profiles/Anycubic.idx | 2 + resources/profiles/Anycubic.ini | 436 ++++++++++++++---- resources/profiles/Anycubic/4MAXPRO20_bed.stl | Bin 0 -> 7884 bytes .../profiles/Anycubic/4MAXPRO20_texture.svg | 259 +++++++++++ .../profiles/Anycubic/4MAXPRO20_thumbnail.png | Bin 0 -> 38307 bytes 5 files changed, 597 insertions(+), 100 deletions(-) create mode 100644 resources/profiles/Anycubic/4MAXPRO20_bed.stl create mode 100644 resources/profiles/Anycubic/4MAXPRO20_texture.svg create mode 100644 resources/profiles/Anycubic/4MAXPRO20_thumbnail.png diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index 12652625c3..47bdd8c271 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.4.1-rc1 +0.1.0 Added Anycubic 4Max Pro 2.0 min_slic3r_version = 2.3.2-alpha0 0.0.12 Updated Anycubic i3 MEGA(S) profiles. 0.0.11 Added bed model and texture for i3 Mega, i3 Mega S. diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 821d87462c..40c6b17953 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,7 +5,7 @@ name = Anycubic # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.12 +config_version = 0.1.0 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -57,6 +57,15 @@ family = MEGA bed_model = i3megas_bed.stl bed_texture = i3megas.svg +[printer_model:4MAXPRO20] +name = Anycubic 4Max Pro 2.0 +variants = 0.4 +technology = FFF +family = 4Max +bed_model = 4MAXPRO20_bed.stl +bed_texture = 4MAXPRO20_texture.svg +default_materials = Generic PLA @4Max Pro 2.0; Generic TPU @4Max Pro 2.0; Generic ABS @4Max Pro 2.0 + [printer_model:PREDATOR] name = Anycubic Predator variants = 0.4; 0.6; 0.8 @@ -64,13 +73,6 @@ technology = FFF family = PREDATOR default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR -[printer_model:PHOTON MONO X] -name = Photon Mono X -variants = default -technology = SLA -family = PHOTON MONO -default_materials = Generic Blue Resin @MONO 0.05 - # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -1902,97 +1904,331 @@ min_layer_height = 0.16 max_layer_height = 0.48 default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR -######################################### -########## end printer presets ########## -######################################### +## Anycubic 4MAX Pro 2.0 +## based on https://hartrusion.com/en/prusaslicer-config-for-anycubic-4max-pro-2-0/ -######################################### -########## SLA printer presets ########## -######################################### - - -[sla_print:*common print ANYCUBIC SLA*] -compatible_printers_condition = family=="PHOTON MONO" -layer_height = 0.05 -output_filename_format = [input_filename_base].pwmx -pad_edge_radius = 0.5 -pad_enable = 0 -pad_max_merge_distance = 50 -pad_wall_height = 0 -pad_wall_thickness = 1 -pad_wall_slope = 45 -faded_layers = 8 -slice_closing_radius = 0.005 -support_base_diameter = 3 -support_base_height = 1 -support_critical_angle = 45 -support_density_at_45 = 250 -support_density_at_horizontal = 500 -support_head_front_diameter = 0.4 -support_head_penetration = 0.4 -support_head_width = 3 -support_max_bridge_length = 10 -support_minimal_z = 0 -support_object_elevation = 5 -support_pillar_diameter = 1 -support_pillar_connection_mode = zigzag -support_pillar_widening_factor = 0 -supports_enable = 1 -support_small_pillar_diameter_percent = 60% - -[sla_print:0.05 Normal @ANYCUBIC] -inherits = *common print ANYCUBIC SLA* -layer_height = 0.05 - -########### Materials - -[sla_material:*common ANYCUBIC SLA*] -compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ -compatible_prints_condition = layer_height == 0.05 -exposure_time = 7 -initial_exposure_time = 40 -initial_layer_height = 0.05 -material_correction = 1,1,1 -material_notes = LIFT_DISTANCE=8.0\nLIFT_SPEED=2.5\nRETRACT_SPEED=3.0\nBOTTOM_LIFT_SPEED=2.0\nBOTTOM_LIFT_DISTANCE=9.0\nDELAY_BEFORE_EXPOSURE=0.5 - -[sla_material:*common 0.05 ANYCUBIC SLA*] -inherits = *common ANYCUBIC SLA* - -[sla_material:Generic Blue Resin @MONO 0.05] -inherits = *common 0.05 ANYCUBIC SLA* -exposure_time = 2.5 -initial_exposure_time = 40 -material_type = Tough -material_vendor = Generic -material_colour = #6080EC -compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ - -########## Printers - -[printer:Anycubic Photon Mono X] -printer_technology = SLA -printer_model = PHOTON MONO X -printer_variant = default -default_sla_material_profile = Generic Blue Resin @MONO 0.05 -default_sla_print_profile = 0.05 Normal @ANYCUBIC -thumbnails = 224x168 -sla_archive_format = pwmx -bed_shape = 1.48x1.02,193.48x1.02,193.48x121.02,1.48x121.02 -display_height = 120 -display_orientation = landscape -display_mirror_x = 1 -display_mirror_y = 0 -display_pixels_x = 3840 -display_pixels_y = 2400 -display_width = 192 -max_print_height = 245 +[print:*common_4max*] +avoid_crossing_perimeters = 0 +avoid_crossing_perimeters_max_detour = 0 +bottom_fill_pattern = monotonic +bottom_solid_layers = 4 +bridge_acceleration = 300 +bridge_angle = 0 +bridge_flow_ratio = 0.65 +bridge_speed = 30 +brim_separation = 0 +brim_type = outer_only +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers_condition = printer_model=="4MAXPRO20" and nozzle_diameter[0]==0.4 +complete_objects = 0 +default_acceleration = 900 +dont_support_bridges = 1 +draft_shield = disabled elefant_foot_compensation = 0.2 -elefant_foot_min_width = 0.2 -min_exposure_time = 1 -max_exposure_time = 120 -min_initial_exposure_time = 1 -max_initial_exposure_time = 300 -printer_correction = 1,1,1 -gamma_correction = 1 -area_fill = 45 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.'\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTONMONOX\n +ensure_vertical_shell_thickness = 1 +external_perimeter_extrusion_width = 0 +external_perimeter_speed = 35 +external_perimeters_first = 0 +extra_perimeters = 0 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = gyroid +first_layer_acceleration = 300 +first_layer_acceleration_over_raft = 0 +first_layer_extrusion_width = 0.65 +first_layer_height = 0.3 +first_layer_speed = 20 +first_layer_speed_over_raft = 30 +fuzzy_skin = none +fuzzy_skin_point_dist = 0.8 +fuzzy_skin_thickness = 0.3 +gap_fill_enabled = 1 +gap_fill_speed = 40 +gcode_comments = 0 +gcode_label_objects = 0 +gcode_resolution = 0.0125 +infill_acceleration = 600 +infill_anchor = 400% +infill_anchor_max = 50 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 23% +infill_speed = 45 +inherits = +interface_shells = 0 +ironing = 0 +ironing_flowrate = 15% +ironing_spacing = 0.1 +ironing_speed = 15 +ironing_type = top +layer_height = 0.2 +max_print_speed = 50 +max_volumetric_speed = 0 +min_skirt_length = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode +overhangs = 1 +perimeter_acceleration = 500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0 +perimeter_speed = 45 +perimeters = 3 +post_process = +print_settings_id = +raft_contact_distance = 0.1 +raft_expansion = 1.5 +raft_first_layer_density = 90% +raft_first_layer_expansion = 3 +raft_layers = 0 +resolution = 0 +seam_position = aligned +single_extruder_multi_material_priming = 1 +skirt_distance = 5 +skirt_height = 1 +skirts = 2 +slicing_mode = regular +small_perimeter_speed = 20 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0 +solid_infill_speed = 45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 0 +support_material_auto = 1 +support_material_bottom_contact_distance = 0 +support_material_bottom_interface_layers = -1 +support_material_buildplate_only = 1 +support_material_closing_radius = 2 +support_material_contact_distance = 0.2 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0.4 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 1 +support_material_interface_layers = 2 +support_material_interface_pattern = rectilinear +support_material_interface_spacing = 0.2 +support_material_interface_speed = 30 +support_material_pattern = rectilinear-grid +support_material_spacing = 2.5 +support_material_speed = 45 +support_material_style = grid +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 1 +support_material_xy_spacing = 60% +thick_bridges = 1 +thin_walls = 0 +top_fill_pattern = monotonic +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +top_solid_layers = 5 +travel_speed = 60 +travel_speed_z = 0 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_brim_width = 2 +wipe_tower_no_sparse_layers = 0 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:0.15mm Detail @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 7 +perimeter_speed = 40 +external_perimeter_speed = 25 + +[print:0.20mm Quality @4Max Pro 2.0] +inherits = *common_4max* +external_perimeter_speed = 25 + +[print:0.30mm Draft @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.3 +bottom_solid_layers = 3 +top_solid_layers = 3 + +[filament:*common_4max*] +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 30 +filament_density = 1.24 +filament_diameter = 1.75 +filament_max_volumetric_speed = 0 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 210 +full_fan_speed_layer = 5 +max_fan_speed = 100 +min_fan_speed = 80 +min_print_speed = 10 +slowdown_below_layer_time = 15 +temperature = 205 + +[filament:*PLA_4max*] +inherits = *common_4max* + +[filament:Generic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +filament_vendor = Generic + +[filament:Anycubic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +first_layer_temperature = 215 +temperature = 207 +filament_vendor = Anycubic + +[filament:Generic ABS @4Max Pro 2.0] +filament_vendor = Generic +compatible_printers_condition = printer_model=="4MAXPRO20" +bed_temperature = 100 +first_layer_bed_temperature = 100 +temperature = 245 +first_layer_temperature = 245 +bridge_fan_speed = 15 +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #800000 +filament_density = 1.04 +filament_diameter = 1.75 +filament_type = ABS +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 25 + +[filament:Generic TPU @4Max Pro 2.0] +filament_vendor = Generic +bed_temperature = 60 +bridge_fan_speed = 0 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #211AB5 +filament_density = 1.19 +filament_deretract_speed = 20 +filament_diameter = 1.75 +filament_retract_speed = 30 +filament_type = FLEX +filament_max_volumetric_speed = 1.65 +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 20 +temperature = 215 + +[filament:Polymaker PolyFlex TPU95 @4Max Pro 2.0] +filament_vendor = Polymaker +bed_temperature = 45 +bridge_fan_speed = 80 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 5 +extrusion_multiplier = 1.04 +fan_always_on = 1 +fan_below_layer_time = 45 +filament_colour = #FD7D2F +filament_density = 1.22 +filament_deretract_speed = 25 +filament_diameter = 1.75 +filament_max_volumetric_speed = 1.65 +filament_retract_length = 4 +filament_retract_restart_extra = 0.1 +filament_retract_speed = 60 +filament_type = FLEX +first_layer_bed_temperature = 55 +first_layer_temperature = 215 +full_fan_speed_layer = 8 +max_fan_speed = 50 +min_fan_speed = 25 +min_print_speed = 10 +slowdown_below_layer_time = 10 +temperature = 217 + +[printer:Anycubic 4Max Pro 2.0] +printer_model = 4MAXPRO20 +printer_variant = 0.4 +printer_technology = FFF +bed_shape = 0x0,270x0,270x210,0x210 +color_change_gcode = M600 +default_filament_profile = Generic PLA @4Max Pro 2.0 +default_print_profile = 0.20mm Quality @4Max Pro 2.0 +deretract_speed = 25 +end_gcode = M104 S0 ; turn off extruder heating\nM140 S0 ; turn off bed heating\nM107 ; turn off fans\nG91 ; relative positioning\nG0 Z+0.5 ; move Z up a tiny bit\nG90 ; absolute positioning\nG0 X135 Y105 F{machine_max_feedrate_x[0]*60} ; move extruder to center position\nG0 Z190.5 F{machine_max_feedrate_z[0]*60} ; lower the plattform to Z min\nM84 ; steppers off\nG90 ; absolute positioning\n +extruder_offset = 0x0 +gcode_flavor = marlin +machine_limits_usage = time_estimate_only +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 1250 +machine_max_acceleration_retracting = 1250 +machine_max_acceleration_travel = 1500 +machine_max_acceleration_x = 900 +machine_max_acceleration_y = 900 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 16 +machine_max_jerk_e = 5 +machine_max_jerk_x = 6 +machine_max_jerk_y = 6 +machine_max_jerk_z = 0.2 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +max_layer_height = 0.3 +max_print_height = 190 +min_layer_height = 0.07 +nozzle_diameter = 0.4 +pause_print_gcode = M601 +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 2.5 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 35 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = G21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 X0 Y0 ; home X and Y\nG28 Z0 ; home Z\nG1 Z30 F{machine_max_feedrate_z[0]*60} ; move Z a bit down to not blow on the bed edge while heating\nG1 X10 F3900 ; let some space on x to prevent the filament cooling exhaust from beeing blocked by the servo motor\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM104 S[first_layer_temperature] ; set extruder temp\nM106 S80 ; turn on fan to prevent air nozzle melt while heating up\nM109 S[first_layer_temperature] ; wait for extruder temp\nM107 ; start with the fan off\nG28 X0 ; goto X home again\nG92 E0 ; zero the extruded length\nG1 Z0.2 F360 ; move plattform upwards\n; extrude material next to the plattform (comment or remove following lines to disable)\nG1 F180 E20 ; extrude some material next to the plattform\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG92 E0 ; zero the extruded length again\nG1 X5 F3900 ; move sideways to get rid of that string\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\nG92 E0 ; zero the extruded length again\n; draw intro line (comment or remove following lines to disable)\nG1 X30 E5 F700 ; draw intro line\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG1 X40 Z2.0 ; move away from the introline\nG92 E0 ; zero the extruded length again\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\n; end of intro line code\nM117 Printing...\nG5 +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 0 +z_offset = 0 \ No newline at end of file diff --git a/resources/profiles/Anycubic/4MAXPRO20_bed.stl b/resources/profiles/Anycubic/4MAXPRO20_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..2b3534fa99d4b71db74c87b3d3400b09cecedf24 GIT binary patch literal 7884 zcmbW6Uuc(A7{}k#w(_Q!;Gb@i=t6{bkuC+@e!3S+!zG*Rk9HA}pf^zprIFxkC?SD~ zHN3H)L{b97ZB~}<7yH$8dE<1jm8C^pR8UA45nXtCo^#&k{e9l;EHrO?*!TJTp7Yyz z{+x5xv1S|u!y|%f1&0{OOHZ(uHuB&5Zck}=FmmE%#2vy%fYpSY(RYCYG(&z&PdB}RDKZCkl#Kx157x4lBbZ1sBUWJ7Ia z&|;7%DfvoBgcv8Ljr$ni&f8KUVYYhxa9d+-_700df=Y}CF*=VlRrPy3G1gfjVYYg0 zd$h53yvbsapb{fOjD@3%eT>uiFC1JLDCCMGN19w^s5>#SDi1F7q zuk~qOB}rDQ!86kv(j*xj{Kr+w_2^=ReijL{ljP+V=km|j?~+;FX`NfPv*y(<5sB6I zM8fj;zX^I-R!$-^DwbF3#n@A?iiBm%q!^{|K`-0?Nkm4)cJSs`MS{8D+-O(JBH4=S z&fbq9i8aaNJO(l`p+e#jsoKv@+p4A_=(Rz5$?Ka&A~C4^B3*5G z#wG8?*yX&ULSnY`-6K7Lo|>T7R+$DLHeHUaipn*aOLKPwFUFoa28n|*IY$R$G5A^Z zx*=2a&~*@*W}^OHXeHXGmotdz(93UKJG*vcgnmZJs6EK@#+m`cGwY)`?nw?}P}(`1WClo>tzNQE=!qn##E1|BC$a$&W~&$bqjMyv#E1|BC(9}cv(<|o)j1MW zVnm366LOV=+3Ll9Tsl)%slGFk8LY=ba-#B}Rl8 zxOr7cn5|yr`9Xq8j7V0TmfXb+vP!~i^^!`%nSlhA7!hK~30cl1`Y)>*p^EkStenvZ_{%Aa~~~6|*%4C#wJE1wkc7cv|nyZ5l)F&Q%g-s~6|4D-k6n zpY0?|L^m~ktb!zSwpJldsan3tOf=Y}C zF{I9Y47od3Ntmr(JPr6dF9<3zBE*pH;|aMtS4o(yUOYeeepL`uVnm4X!XKMG@!Og4 z0TO1b7f&C~k)RSILX45t?LNl&b9)9zn5|wsqc}%`N{k3G_dV|j8MAx=9&Di+DMqKUNYfuTFQS{ zo}dyVLX3O|GuiVt5@xHHOt|8#RqVMZsKkg6BhTGT-+f4!tzI(Wa3Ui?B}Rl8c@1Xz zenrA;^^ysPGaLyjF(SNWneq^ju;;w^y8S zvm>F3dXZ2&oB;Imb!GB@A|1!S8)^)h&i)o=@uXi3s_ooQ&$h~HvdV?8TJ@V3tC~Rg zdt0avBX%Dv6G9hWYHLpn9ZpvhTb1-(|9U!cg~iRwe-EyNgiHqiz8k&=W00Vi%q#!u zJei;(lheO{-~6gb*h}H$7+e*-h(wZn@&vHOAcJ}M+OVoz^u&up7y77>U=Ma~ zyt>yD4ZX|ysgPhtb#CW_^W~dmm3@1^E4sc$C&B($&MPV;*zL*$6%y=SWr7L`cA^rI z@th#L>E9`>6V)rq_I&@&yNIm7!G&p>>zuFpZ6YMie&Em>*K{R`_#E3N + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Anycubic/4MAXPRO20_thumbnail.png b/resources/profiles/Anycubic/4MAXPRO20_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9679483c2541d05f9c0930f9f953852108dd72 GIT binary patch literal 38307 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 b4G_GzM4Y)-ngfp%!QH4U>nK$!*na*$4Htm4 literal 0 HcmV?d00001 From 578b80e12c7cca714993a657fe5b8d13814e7e72 Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 10 Mar 2022 09:41:09 +0100 Subject: [PATCH 093/149] Readded Photon Mono X --- resources/profiles/Anycubic.ini | 97 ++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 40c6b17953..0999c168c8 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -73,6 +73,13 @@ technology = FFF family = PREDATOR default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR +[printer_model:PHOTON MONO X] +name = Photon Mono X +variants = default +technology = SLA +family = PHOTON MONO +default_materials = Generic Blue Resin @MONO 0.05 + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -2231,4 +2238,92 @@ use_relative_e_distances = 0 use_volumetric_e = 0 variable_layer_height = 1 wipe = 0 -z_offset = 0 \ No newline at end of file +z_offset = 0 + +########## SLA printer presets ########## + +[sla_print:*common print ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +layer_height = 0.05 +output_filename_format = [input_filename_base].pwmx +pad_edge_radius = 0.5 +pad_enable = 0 +pad_max_merge_distance = 50 +pad_wall_height = 0 +pad_wall_thickness = 1 +pad_wall_slope = 45 +faded_layers = 8 +slice_closing_radius = 0.005 +support_base_diameter = 3 +support_base_height = 1 +support_critical_angle = 45 +support_density_at_45 = 250 +support_density_at_horizontal = 500 +support_head_front_diameter = 0.4 +support_head_penetration = 0.4 +support_head_width = 3 +support_max_bridge_length = 10 +support_minimal_z = 0 +support_object_elevation = 5 +support_pillar_diameter = 1 +support_pillar_connection_mode = zigzag +support_pillar_widening_factor = 0 +supports_enable = 1 +support_small_pillar_diameter_percent = 60% + +[sla_print:0.05 Normal @ANYCUBIC] +inherits = *common print ANYCUBIC SLA* +layer_height = 0.05 + +########### Materials + +[sla_material:*common ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +compatible_prints_condition = layer_height == 0.05 +exposure_time = 7 +initial_exposure_time = 40 +initial_layer_height = 0.05 +material_correction = 1,1,1 +material_notes = LIFT_DISTANCE=8.0\nLIFT_SPEED=2.5\nRETRACT_SPEED=3.0\nBOTTOM_LIFT_SPEED=2.0\nBOTTOM_LIFT_DISTANCE=9.0\nDELAY_BEFORE_EXPOSURE=0.5 + +[sla_material:*common 0.05 ANYCUBIC SLA*] +inherits = *common ANYCUBIC SLA* + +[sla_material:Generic Blue Resin @MONO 0.05] +inherits = *common 0.05 ANYCUBIC SLA* +exposure_time = 2.5 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Generic +material_colour = #6080EC +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ + +########## Printers + +[printer:Anycubic Photon Mono X] +printer_technology = SLA +printer_model = PHOTON MONO X +printer_variant = default +default_sla_material_profile = Generic Blue Resin @MONO 0.05 +default_sla_print_profile = 0.05 Normal @ANYCUBIC +thumbnails = 224x168 +sla_archive_format = pwmx +bed_shape = 1.48x1.02,193.48x1.02,193.48x121.02,1.48x121.02 +display_height = 120 +display_orientation = landscape +display_mirror_x = 1 +display_mirror_y = 0 +display_pixels_x = 3840 +display_pixels_y = 2400 +display_width = 192 +max_print_height = 245 +elefant_foot_compensation = 0.2 +elefant_foot_min_width = 0.2 +min_exposure_time = 1 +max_exposure_time = 120 +min_initial_exposure_time = 1 +max_initial_exposure_time = 300 +printer_correction = 1,1,1 +gamma_correction = 1 +area_fill = 45 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.'\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTONMONOX\n \ No newline at end of file From 7a9be877759c0f57b310fe8f71d593a84292231d Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 10 Mar 2022 10:12:41 +0100 Subject: [PATCH 094/149] Added Anycubic 4Max Pro 2.0 profile and resources. based on https://hartrusion.com/en/prusaslicer-config-for-anycubic-4max-pro-2-0/ --- resources/profiles/Anycubic.idx | 2 + resources/profiles/Anycubic.ini | 342 +++++++++++++++++- resources/profiles/Anycubic/4MAXPRO20_bed.stl | Bin 0 -> 7884 bytes .../profiles/Anycubic/4MAXPRO20_texture.svg | 259 +++++++++++++ .../profiles/Anycubic/4MAXPRO20_thumbnail.png | Bin 0 -> 38307 bytes 5 files changed, 599 insertions(+), 4 deletions(-) create mode 100644 resources/profiles/Anycubic/4MAXPRO20_bed.stl create mode 100644 resources/profiles/Anycubic/4MAXPRO20_texture.svg create mode 100644 resources/profiles/Anycubic/4MAXPRO20_thumbnail.png diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index 12652625c3..47bdd8c271 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.4.1-rc1 +0.1.0 Added Anycubic 4Max Pro 2.0 min_slic3r_version = 2.3.2-alpha0 0.0.12 Updated Anycubic i3 MEGA(S) profiles. 0.0.11 Added bed model and texture for i3 Mega, i3 Mega S. diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 053aecbd59..40c6b17953 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,7 +5,7 @@ name = Anycubic # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.12 +config_version = 0.1.0 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -57,6 +57,15 @@ family = MEGA bed_model = i3megas_bed.stl bed_texture = i3megas.svg +[printer_model:4MAXPRO20] +name = Anycubic 4Max Pro 2.0 +variants = 0.4 +technology = FFF +family = 4Max +bed_model = 4MAXPRO20_bed.stl +bed_texture = 4MAXPRO20_texture.svg +default_materials = Generic PLA @4Max Pro 2.0; Generic TPU @4Max Pro 2.0; Generic ABS @4Max Pro 2.0 + [printer_model:PREDATOR] name = Anycubic Predator variants = 0.4; 0.6; 0.8 @@ -1895,6 +1904,331 @@ min_layer_height = 0.16 max_layer_height = 0.48 default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR -######################################### -########## end printer presets ########## -######################################### +## Anycubic 4MAX Pro 2.0 +## based on https://hartrusion.com/en/prusaslicer-config-for-anycubic-4max-pro-2-0/ + +[print:*common_4max*] +avoid_crossing_perimeters = 0 +avoid_crossing_perimeters_max_detour = 0 +bottom_fill_pattern = monotonic +bottom_solid_layers = 4 +bridge_acceleration = 300 +bridge_angle = 0 +bridge_flow_ratio = 0.65 +bridge_speed = 30 +brim_separation = 0 +brim_type = outer_only +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers_condition = printer_model=="4MAXPRO20" and nozzle_diameter[0]==0.4 +complete_objects = 0 +default_acceleration = 900 +dont_support_bridges = 1 +draft_shield = disabled +elefant_foot_compensation = 0.2 +ensure_vertical_shell_thickness = 1 +external_perimeter_extrusion_width = 0 +external_perimeter_speed = 35 +external_perimeters_first = 0 +extra_perimeters = 0 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = gyroid +first_layer_acceleration = 300 +first_layer_acceleration_over_raft = 0 +first_layer_extrusion_width = 0.65 +first_layer_height = 0.3 +first_layer_speed = 20 +first_layer_speed_over_raft = 30 +fuzzy_skin = none +fuzzy_skin_point_dist = 0.8 +fuzzy_skin_thickness = 0.3 +gap_fill_enabled = 1 +gap_fill_speed = 40 +gcode_comments = 0 +gcode_label_objects = 0 +gcode_resolution = 0.0125 +infill_acceleration = 600 +infill_anchor = 400% +infill_anchor_max = 50 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 23% +infill_speed = 45 +inherits = +interface_shells = 0 +ironing = 0 +ironing_flowrate = 15% +ironing_spacing = 0.1 +ironing_speed = 15 +ironing_type = top +layer_height = 0.2 +max_print_speed = 50 +max_volumetric_speed = 0 +min_skirt_length = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode +overhangs = 1 +perimeter_acceleration = 500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0 +perimeter_speed = 45 +perimeters = 3 +post_process = +print_settings_id = +raft_contact_distance = 0.1 +raft_expansion = 1.5 +raft_first_layer_density = 90% +raft_first_layer_expansion = 3 +raft_layers = 0 +resolution = 0 +seam_position = aligned +single_extruder_multi_material_priming = 1 +skirt_distance = 5 +skirt_height = 1 +skirts = 2 +slicing_mode = regular +small_perimeter_speed = 20 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0 +solid_infill_speed = 45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 0 +support_material_auto = 1 +support_material_bottom_contact_distance = 0 +support_material_bottom_interface_layers = -1 +support_material_buildplate_only = 1 +support_material_closing_radius = 2 +support_material_contact_distance = 0.2 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0.4 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 1 +support_material_interface_layers = 2 +support_material_interface_pattern = rectilinear +support_material_interface_spacing = 0.2 +support_material_interface_speed = 30 +support_material_pattern = rectilinear-grid +support_material_spacing = 2.5 +support_material_speed = 45 +support_material_style = grid +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 1 +support_material_xy_spacing = 60% +thick_bridges = 1 +thin_walls = 0 +top_fill_pattern = monotonic +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +top_solid_layers = 5 +travel_speed = 60 +travel_speed_z = 0 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_brim_width = 2 +wipe_tower_no_sparse_layers = 0 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:0.15mm Detail @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 7 +perimeter_speed = 40 +external_perimeter_speed = 25 + +[print:0.20mm Quality @4Max Pro 2.0] +inherits = *common_4max* +external_perimeter_speed = 25 + +[print:0.30mm Draft @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.3 +bottom_solid_layers = 3 +top_solid_layers = 3 + +[filament:*common_4max*] +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 30 +filament_density = 1.24 +filament_diameter = 1.75 +filament_max_volumetric_speed = 0 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 210 +full_fan_speed_layer = 5 +max_fan_speed = 100 +min_fan_speed = 80 +min_print_speed = 10 +slowdown_below_layer_time = 15 +temperature = 205 + +[filament:*PLA_4max*] +inherits = *common_4max* + +[filament:Generic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +filament_vendor = Generic + +[filament:Anycubic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +first_layer_temperature = 215 +temperature = 207 +filament_vendor = Anycubic + +[filament:Generic ABS @4Max Pro 2.0] +filament_vendor = Generic +compatible_printers_condition = printer_model=="4MAXPRO20" +bed_temperature = 100 +first_layer_bed_temperature = 100 +temperature = 245 +first_layer_temperature = 245 +bridge_fan_speed = 15 +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #800000 +filament_density = 1.04 +filament_diameter = 1.75 +filament_type = ABS +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 25 + +[filament:Generic TPU @4Max Pro 2.0] +filament_vendor = Generic +bed_temperature = 60 +bridge_fan_speed = 0 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #211AB5 +filament_density = 1.19 +filament_deretract_speed = 20 +filament_diameter = 1.75 +filament_retract_speed = 30 +filament_type = FLEX +filament_max_volumetric_speed = 1.65 +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 20 +temperature = 215 + +[filament:Polymaker PolyFlex TPU95 @4Max Pro 2.0] +filament_vendor = Polymaker +bed_temperature = 45 +bridge_fan_speed = 80 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 5 +extrusion_multiplier = 1.04 +fan_always_on = 1 +fan_below_layer_time = 45 +filament_colour = #FD7D2F +filament_density = 1.22 +filament_deretract_speed = 25 +filament_diameter = 1.75 +filament_max_volumetric_speed = 1.65 +filament_retract_length = 4 +filament_retract_restart_extra = 0.1 +filament_retract_speed = 60 +filament_type = FLEX +first_layer_bed_temperature = 55 +first_layer_temperature = 215 +full_fan_speed_layer = 8 +max_fan_speed = 50 +min_fan_speed = 25 +min_print_speed = 10 +slowdown_below_layer_time = 10 +temperature = 217 + +[printer:Anycubic 4Max Pro 2.0] +printer_model = 4MAXPRO20 +printer_variant = 0.4 +printer_technology = FFF +bed_shape = 0x0,270x0,270x210,0x210 +color_change_gcode = M600 +default_filament_profile = Generic PLA @4Max Pro 2.0 +default_print_profile = 0.20mm Quality @4Max Pro 2.0 +deretract_speed = 25 +end_gcode = M104 S0 ; turn off extruder heating\nM140 S0 ; turn off bed heating\nM107 ; turn off fans\nG91 ; relative positioning\nG0 Z+0.5 ; move Z up a tiny bit\nG90 ; absolute positioning\nG0 X135 Y105 F{machine_max_feedrate_x[0]*60} ; move extruder to center position\nG0 Z190.5 F{machine_max_feedrate_z[0]*60} ; lower the plattform to Z min\nM84 ; steppers off\nG90 ; absolute positioning\n +extruder_offset = 0x0 +gcode_flavor = marlin +machine_limits_usage = time_estimate_only +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 1250 +machine_max_acceleration_retracting = 1250 +machine_max_acceleration_travel = 1500 +machine_max_acceleration_x = 900 +machine_max_acceleration_y = 900 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 16 +machine_max_jerk_e = 5 +machine_max_jerk_x = 6 +machine_max_jerk_y = 6 +machine_max_jerk_z = 0.2 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +max_layer_height = 0.3 +max_print_height = 190 +min_layer_height = 0.07 +nozzle_diameter = 0.4 +pause_print_gcode = M601 +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 2.5 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 35 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = G21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 X0 Y0 ; home X and Y\nG28 Z0 ; home Z\nG1 Z30 F{machine_max_feedrate_z[0]*60} ; move Z a bit down to not blow on the bed edge while heating\nG1 X10 F3900 ; let some space on x to prevent the filament cooling exhaust from beeing blocked by the servo motor\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM104 S[first_layer_temperature] ; set extruder temp\nM106 S80 ; turn on fan to prevent air nozzle melt while heating up\nM109 S[first_layer_temperature] ; wait for extruder temp\nM107 ; start with the fan off\nG28 X0 ; goto X home again\nG92 E0 ; zero the extruded length\nG1 Z0.2 F360 ; move plattform upwards\n; extrude material next to the plattform (comment or remove following lines to disable)\nG1 F180 E20 ; extrude some material next to the plattform\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG92 E0 ; zero the extruded length again\nG1 X5 F3900 ; move sideways to get rid of that string\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\nG92 E0 ; zero the extruded length again\n; draw intro line (comment or remove following lines to disable)\nG1 X30 E5 F700 ; draw intro line\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG1 X40 Z2.0 ; move away from the introline\nG92 E0 ; zero the extruded length again\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\n; end of intro line code\nM117 Printing...\nG5 +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 0 +z_offset = 0 \ No newline at end of file diff --git a/resources/profiles/Anycubic/4MAXPRO20_bed.stl b/resources/profiles/Anycubic/4MAXPRO20_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..2b3534fa99d4b71db74c87b3d3400b09cecedf24 GIT binary patch literal 7884 zcmbW6Uuc(A7{}k#w(_Q!;Gb@i=t6{bkuC+@e!3S+!zG*Rk9HA}pf^zprIFxkC?SD~ zHN3H)L{b97ZB~}<7yH$8dE<1jm8C^pR8UA45nXtCo^#&k{e9l;EHrO?*!TJTp7Yyz z{+x5xv1S|u!y|%f1&0{OOHZ(uHuB&5Zck}=FmmE%#2vy%fYpSY(RYCYG(&z&PdB}RDKZCkl#Kx157x4lBbZ1sBUWJ7Ia z&|;7%DfvoBgcv8Ljr$ni&f8KUVYYhxa9d+-_700df=Y}CF*=VlRrPy3G1gfjVYYg0 zd$h53yvbsapb{fOjD@3%eT>uiFC1JLDCCMGN19w^s5>#SDi1F7q zuk~qOB}rDQ!86kv(j*xj{Kr+w_2^=ReijL{ljP+V=km|j?~+;FX`NfPv*y(<5sB6I zM8fj;zX^I-R!$-^DwbF3#n@A?iiBm%q!^{|K`-0?Nkm4)cJSs`MS{8D+-O(JBH4=S z&fbq9i8aaNJO(l`p+e#jsoKv@+p4A_=(Rz5$?Ka&A~C4^B3*5G z#wG8?*yX&ULSnY`-6K7Lo|>T7R+$DLHeHUaipn*aOLKPwFUFoa28n|*IY$R$G5A^Z zx*=2a&~*@*W}^OHXeHXGmotdz(93UKJG*vcgnmZJs6EK@#+m`cGwY)`?nw?}P}(`1WClo>tzNQE=!qn##E1|BC$a$&W~&$bqjMyv#E1|BC(9}cv(<|o)j1MW zVnm366LOV=+3Ll9Tsl)%slGFk8LY=ba-#B}Rl8 zxOr7cn5|yr`9Xq8j7V0TmfXb+vP!~i^^!`%nSlhA7!hK~30cl1`Y)>*p^EkStenvZ_{%Aa~~~6|*%4C#wJE1wkc7cv|nyZ5l)F&Q%g-s~6|4D-k6n zpY0?|L^m~ktb!zSwpJldsan3tOf=Y}C zF{I9Y47od3Ntmr(JPr6dF9<3zBE*pH;|aMtS4o(yUOYeeepL`uVnm4X!XKMG@!Og4 z0TO1b7f&C~k)RSILX45t?LNl&b9)9zn5|wsqc}%`N{k3G_dV|j8MAx=9&Di+DMqKUNYfuTFQS{ zo}dyVLX3O|GuiVt5@xHHOt|8#RqVMZsKkg6BhTGT-+f4!tzI(Wa3Ui?B}Rl8c@1Xz zenrA;^^ysPGaLyjF(SNWneq^ju;;w^y8S zvm>F3dXZ2&oB;Imb!GB@A|1!S8)^)h&i)o=@uXi3s_ooQ&$h~HvdV?8TJ@V3tC~Rg zdt0avBX%Dv6G9hWYHLpn9ZpvhTb1-(|9U!cg~iRwe-EyNgiHqiz8k&=W00Vi%q#!u zJei;(lheO{-~6gb*h}H$7+e*-h(wZn@&vHOAcJ}M+OVoz^u&up7y77>U=Ma~ zyt>yD4ZX|ysgPhtb#CW_^W~dmm3@1^E4sc$C&B($&MPV;*zL*$6%y=SWr7L`cA^rI z@th#L>E9`>6V)rq_I&@&yNIm7!G&p>>zuFpZ6YMie&Em>*K{R`_#E3N + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Anycubic/4MAXPRO20_thumbnail.png b/resources/profiles/Anycubic/4MAXPRO20_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9679483c2541d05f9c0930f9f953852108dd72 GIT binary patch literal 38307 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 b4G_GzM4Y)-ngfp%!QH4U>nK$!*na*$4Htm4 literal 0 HcmV?d00001 From a9465ddedcc3d1c5644791c915b2036449fd72d6 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 10 Mar 2022 11:27:05 +0100 Subject: [PATCH 095/149] A few small refactorings --- src/slic3r/GUI/GCodeViewer.cpp | 8 ++++---- src/slic3r/GUI/GLModel.cpp | 17 +++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 11 ++++------- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 3 ++- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 0c3dd6560a..cb54376357 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4629,14 +4629,14 @@ void GCodeViewer::render_statistics() ImGuiWrapper& imgui = *wxGetApp().imgui(); - auto add_time = [this, &imgui](const std::string& label, int64_t time) { + auto add_time = [&imgui](const std::string& label, int64_t time) { imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); ImGui::SameLine(offset); imgui.text(std::to_string(time) + " ms (" + get_time_dhms(static_cast(time) * 0.001f) + ")"); }; - auto add_memory = [this, &imgui](const std::string& label, int64_t memory) { - auto format_string = [memory](const std::string& units, float value) { + auto add_memory = [&imgui](const std::string& label, int64_t memory) { + auto format_string = [memory](const std::string& units, float value) { return std::to_string(memory) + " bytes (" + Slic3r::float_to_string_decimal_point(float(memory) * value, 3) + " " + units + ")"; @@ -4658,7 +4658,7 @@ void GCodeViewer::render_statistics() imgui.text(format_string("GB", inv_gb)); }; - auto add_counter = [this, &imgui](const std::string& label, int64_t counter) { + auto add_counter = [&imgui](const std::string& label, int64_t counter) { imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); ImGui::SameLine(offset); imgui.text(std::to_string(counter)); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index af650875ba..a92153330c 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -540,7 +540,7 @@ void GLModel::init_from(const indexed_triangle_set& its, const BoundingBoxf3 &bb // update bounding box for (size_t i = 0; i < vertices_count(); ++i) { - m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + m_bounding_box.merge(data.extract_position_3(i).cast()); } #else if (!m_render_data.empty()) // call reset() if you want to reuse this model @@ -622,7 +622,7 @@ void GLModel::init_from(const Polygons& polygons, float z) // update bounding box for (size_t i = 0; i < vertices_count(); ++i) { - m_bounding_box.merge(m_render_data.geometry.extract_position_3(i).cast()); + m_bounding_box.merge(data.extract_position_3(i).cast()); } #else auto append_polygon = [](const Polygon& polygon, float z, GUI::GLModel::Geometry& data) { @@ -1081,31 +1081,32 @@ bool GLModel::send_to_gpu() // indices glsafe(::glGenBuffers(1, &m_render_data.ibo_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); + const size_t indices_count = data.indices.size(); if (m_render_data.vertices_count <= 256) { // convert indices to unsigned char to save gpu memory - std::vector reduced_indices(data.indices.size()); - for (size_t i = 0; i < data.indices.size(); ++i) { + std::vector reduced_indices(indices_count); + for (size_t i = 0; i < indices_count; ++i) { reduced_indices[i] = (unsigned char)data.indices[i]; } data.index_type = Geometry::EIndexType::UBYTE; - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, reduced_indices.size() * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } else if (m_render_data.vertices_count <= 65536) { // convert indices to unsigned short to save gpu memory - std::vector reduced_indices(data.indices.size()); + std::vector reduced_indices(indices_count); for (size_t i = 0; i < data.indices.size(); ++i) { reduced_indices[i] = (unsigned short)data.indices[i]; } data.index_type = Geometry::EIndexType::USHORT; - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, reduced_indices.size() * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } else { glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } - m_render_data.indices_count = indices_count(); + m_render_data.indices_count = indices_count; data.indices = std::vector(); return true; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 33866c64fd..266b6a3cac 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -223,15 +223,12 @@ void GLGizmoRotate::on_render() render_angle(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - transform_to_local(selection); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - render_grabber(box); render_grabber_extension(box, false); +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } void GLGizmoRotate::on_render_for_picking() @@ -683,8 +680,7 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const return Geometry::assemble_transform(m_center) * ret; } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - +#else void GLGizmoRotate::transform_to_local(const Selection& selection) const { glsafe(::glTranslated(m_center.x(), m_center.y(), m_center.z())); @@ -716,6 +712,7 @@ void GLGizmoRotate::transform_to_local(const Selection& selection) const } } } +#endif // ENABLE_GL_SHADERS_ATTRIBUTES Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index c31b1f6f0c..b58fde1eec 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -108,9 +108,10 @@ private: #if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d local_transform(const Selection& selection) const; +#else + void transform_to_local(const Selection& selection) const; #endif // ENABLE_GL_SHADERS_ATTRIBUTES - void transform_to_local(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; }; From f196294da5bba5b415ad786cef49fde01cca5c66 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 10 Mar 2022 11:35:03 +0100 Subject: [PATCH 096/149] Bumped up version number to 2.4.1 --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index d5ec2b3f26..ad4052788d 100644 --- a/version.inc +++ b/version.inc @@ -3,7 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -set(SLIC3R_VERSION "2.4.1-rc1") +set(SLIC3R_VERSION "2.4.1") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,4,1,0") set(SLIC3R_RC_VERSION_DOTS "2.4.1.0") From f0a4fd1123878930bc64d5867fcd45aa0ab26956 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 10 Mar 2022 12:48:31 +0100 Subject: [PATCH 097/149] Fixed GLVolumes color when tech ENABLE_LEGACY_OPENGL_REMOVAL is disabled --- src/slic3r/GUI/3DScene.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 0e7c551d57..50e488686e 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1157,6 +1157,8 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(volume.first->render_color); +#else + shader->set_uniform("uniform_color", volume.first->render_color); #endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d matrix = view_matrix * volume.first->world_matrix(); From 9d2314557dcc26cd8e5aff43f618fdeb8aafb023 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 10 Mar 2022 13:40:37 +0100 Subject: [PATCH 098/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Removed remaining pairs glPushMatrix()/glPopMatrix() --- src/slic3r/GUI/GLCanvas3D.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4a42e11c1b..d8d1556c87 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5764,6 +5764,7 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() void GLCanvas3D::_render_overlays() { glsafe(::glDisable(GL_DEPTH_TEST)); +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the textures are renderered inside the frustrum @@ -5772,6 +5773,7 @@ void GLCanvas3D::_render_overlays() // ensure that the overlay fits the frustrum near z plane double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES _check_and_update_toolbar_icon_scale(); @@ -5810,7 +5812,9 @@ void GLCanvas3D::_render_overlays() } m_labels.render(sorted_instances); +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } void GLCanvas3D::_render_volumes_for_picking() const From 3dddfa919a6340a73973c6c48db3a7c0d98fe650 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 10 Mar 2022 15:55:15 +0100 Subject: [PATCH 099/149] Debug tech ENABLE_GLMODEL_STATISTICS - Shows an imgui dialog with GLModel statistics data --- src/libslic3r/Technologies.hpp | 2 + src/slic3r/GUI/GLCanvas3D.cpp | 7 ++ src/slic3r/GUI/GLModel.cpp | 95 +++++++++++++++++++++++++ src/slic3r/GUI/GLModel.hpp | 31 ++++++++ src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 3 +- 5 files changed, 136 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index f8f9f80e21..85158ccb22 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -70,6 +70,8 @@ #define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable using vertex attributes and matrices in shaders #define ENABLE_GL_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) +// Shows an imgui dialog with GLModel statistics data +#define ENABLE_GLMODEL_STATISTICS (0 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable show non-manifold edges #define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d8d1556c87..46219c1d12 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1667,6 +1667,10 @@ void GLCanvas3D::render() wxGetApp().plater()->init_environment_texture(); #endif // ENABLE_ENVIRONMENT_MAP +#if ENABLE_GLMODEL_STATISTICS + GLModel::reset_statistics_counters(); +#endif // ENABLE_GLMODEL_STATISTICS + const Size& cnv_size = get_canvas_size(); // Probably due to different order of events on Linux/GTK2, when one switched from 3D scene // to preview, this was called before canvas had its final size. It reported zero width @@ -1776,6 +1780,9 @@ void GLCanvas3D::render() #if ENABLE_CAMERA_STATISTICS camera.debug_render(); #endif // ENABLE_CAMERA_STATISTICS +#if ENABLE_GLMODEL_STATISTICS + GLModel::render_statistics(); +#endif // ENABLE_GLMODEL_STATISTICS std::string tooltip; diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index a92153330c..b81287ecee 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -4,6 +4,10 @@ #include "3DScene.hpp" #include "GUI_App.hpp" #include "GLShader.hpp" +#if ENABLE_GLMODEL_STATISTICS +#include "Plater.hpp" +#include "GLCanvas3D.hpp" +#endif // ENABLE_GLMODEL_STATISTICS #include "libslic3r/TriangleMesh.hpp" #include "libslic3r/Model.hpp" @@ -13,6 +17,10 @@ #include "libslic3r/Geometry/ConvexHull.hpp" #endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GLMODEL_STATISTICS +#include +#endif // ENABLE_GLMODEL_STATISTICS + #include #include @@ -380,6 +388,10 @@ size_t GLModel::Geometry::indices_count() const } #endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GLMODEL_STATISTICS +GLModel::Statistics GLModel::s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + #if ENABLE_LEGACY_OPENGL_REMOVAL void GLModel::init_from(Geometry&& data) #else @@ -702,10 +714,16 @@ void GLModel::reset() if (m_render_data.ibo_id > 0) { glsafe(::glDeleteBuffers(1, &m_render_data.ibo_id)); m_render_data.ibo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current -= indices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS } if (m_render_data.vbo_id > 0) { glsafe(::glDeleteBuffers(1, &m_render_data.vbo_id)); m_render_data.vbo_id = 0; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current -= vertices_size_bytes(); +#endif // ENABLE_GLMODEL_STATISTICS } m_render_data.vertices_count = 0; @@ -899,6 +917,10 @@ void GLModel::render(const std::pair& range) #endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_calls; +#endif // ENABLE_GLMODEL_STATISTICS } #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -1054,6 +1076,10 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance #endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + +#if ENABLE_GLMODEL_STATISTICS + ++s_statistics.render_instanced_calls; +#endif // ENABLE_GLMODEL_STATISTICS } #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -1076,6 +1102,10 @@ bool GLModel::send_to_gpu() glsafe(::glBufferData(GL_ARRAY_BUFFER, data.vertices_size_bytes(), data.vertices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); m_render_data.vertices_count = vertices_count(); +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.vertices.current += data.vertices_size_bytes(); + s_statistics.gpu_memory.vertices.max = std::max(s_statistics.gpu_memory.vertices.current, s_statistics.gpu_memory.vertices.max); +#endif // ENABLE_GLMODEL_STATISTICS data.vertices = std::vector(); // indices @@ -1107,10 +1137,75 @@ bool GLModel::send_to_gpu() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } m_render_data.indices_count = indices_count; +#if ENABLE_GLMODEL_STATISTICS + s_statistics.gpu_memory.indices.current += data.indices_size_bytes(); + s_statistics.gpu_memory.indices.max = std::max(s_statistics.gpu_memory.indices.current, s_statistics.gpu_memory.indices.max); +#endif // ENABLE_GLMODEL_STATISTICS data.indices = std::vector(); return true; } + +#if ENABLE_GLMODEL_STATISTICS +void GLModel::render_statistics() +{ + static const float offset = 175.0f; + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_memory = [&imgui](const std::string& label, int64_t memory) { + auto format_string = [memory](const std::string& units, float value) { + return std::to_string(memory) + " bytes (" + + Slic3r::float_to_string_decimal_point(float(memory) * value, 3) + + " " + units + ")"; + }; + + static const float kb = 1024.0f; + static const float inv_kb = 1.0f / kb; + static const float mb = 1024.0f * kb; + static const float inv_mb = 1.0f / mb; + static const float gb = 1024.0f * mb; + static const float inv_gb = 1.0f / gb; + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + if (static_cast(memory) < mb) + imgui.text(format_string("KB", inv_kb)); + else if (static_cast(memory) < gb) + imgui.text(format_string("MB", inv_mb)); + else + imgui.text(format_string("GB", inv_gb)); + }; + + auto add_counter = [&imgui](const std::string& label, int64_t counter) { + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(std::to_string(counter)); + }; + + imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f); + ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f }); + imgui.begin(std::string("GLModel Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + + add_counter(std::string("Render calls:"), s_statistics.render_calls); + add_counter(std::string("Render instanced calls:"), s_statistics.render_instanced_calls); + + if (ImGui::CollapsingHeader("GPU memory")) { + ImGui::Indent(10.0f); + if (ImGui::CollapsingHeader("Vertices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.vertices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.vertices.max); + } + if (ImGui::CollapsingHeader("Indices")) { + add_memory(std::string("Current:"), s_statistics.gpu_memory.indices.current); + add_memory(std::string("Max:"), s_statistics.gpu_memory.indices.max); + } + ImGui::Unindent(10.0f); + } + + imgui.end(); +} +#endif // ENABLE_GLMODEL_STATISTICS + #else void GLModel::send_to_gpu(RenderData& data, const std::vector& vertices, const std::vector& indices) { diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index e18d046783..e2da09484d 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -177,6 +177,29 @@ namespace GUI { private: #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GLMODEL_STATISTICS + struct Statistics + { + struct Buffers + { + struct Data + { + size_t current{ 0 }; + size_t max{ 0 }; + }; + Data indices; + Data vertices; + }; + + Buffers gpu_memory; + + int64_t render_calls{ 0 }; + int64_t render_instanced_calls{ 0 }; + }; + + static Statistics s_statistics; +#endif // ENABLE_GLMODEL_STATISTICS + RenderData m_render_data; // By default the vertex and index buffers data are sent to gpu at the first call to render() method. @@ -272,6 +295,14 @@ namespace GUI { ret += indices_size_bytes(); return ret; } + +#if ENABLE_GLMODEL_STATISTICS + static void render_statistics(); + static void reset_statistics_counters() { + s_statistics.render_calls = 0; + s_statistics.render_instanced_calls = 0; + } +#endif // ENABLE_GLMODEL_STATISTICS #endif // ENABLE_LEGACY_OPENGL_REMOVAL private: diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 266b6a3cac..1d817b58bc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -182,8 +182,7 @@ void GLGizmoRotate::on_render() #if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; - + const Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GL_SHADERS_ATTRIBUTES From b32c97ea76493dc4125e390585f2cedc4478e44d Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 11 Mar 2022 10:55:47 +0100 Subject: [PATCH 100/149] Added Ender-3 Pro. --- resources/profiles/Creality.idx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index f8abfb40a0..1ff148aad3 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.4.1 +0.1.4 Added Ender-3 Pro. Added M25 support for some printers. min_slic3r_version = 2.4.0-rc 0.1.3 Ender-3 S1 improvements. 0.1.2 Added alpha Ender 3 S1 profiles. From 2342002151a2ce4f25cb3b0b9cae10ce797ddc8e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 11 Mar 2022 11:28:08 +0100 Subject: [PATCH 101/149] Tech ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE - Fixed volumes moving after releasing CTRL key Tech ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION - Selection rectangle not started while hovering on a volume --- src/slic3r/GUI/GLCanvas3D.cpp | 39 +++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 76bcde9471..6e1c1c536f 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2928,8 +2928,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) if (imgui->update_key_data(evt)) { render(); } - else - { + else { if (!m_gizmos.on_key(evt)) { if (evt.GetEventType() == wxEVT_KEY_UP) { if (evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_SPACE) { @@ -2970,8 +2969,17 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } // set_cursor(Standard); } - else if (keyCode == WXK_CONTROL) + else if (keyCode == WXK_CONTROL) { +#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + if (m_mouse.dragging) { + // if the user releases CTRL while rotating the 3D scene + // prevent from moving the selected volume + m_mouse.drag.move_volume_idx = -1; + m_mouse.set_start_position_3D_as_invalid(); + } +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE m_dirty = true; + } else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { translationProcessor.process(evt); @@ -3444,10 +3452,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else { #if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { - if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports - && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports - && m_gizmos.get_current_type() != GLGizmosManager::Seam - && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { + if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && + m_gizmos.get_current_type() != GLGizmosManager::FdmSupports && + m_gizmos.get_current_type() != GLGizmosManager::Seam && + m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::EState::Select : GLSelectionRectangle::EState::Deselect); m_dirty = true; } @@ -3459,7 +3467,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // during the scene manipulation. #if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION - if (m_picking_enabled && (!any_gizmo_active || !evt.ShiftDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { + if (m_picking_enabled && (!any_gizmo_active || !evt.ShiftDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()) && + !m_rectangle_selection.is_dragging()) { #else if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { #endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION @@ -3507,7 +3516,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + if (!m_hover_volume_idxs.empty() && !m_rectangle_selection.is_dragging()) { +#else if (!m_hover_volume_idxs.empty()) { +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) { // Only accept the initial position, if it is inside the volume bounding box. const int volume_idx = get_first_hover_volume_idx(); @@ -3518,6 +3531,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // The dragging operation is initiated. m_mouse.drag.move_volume_idx = volume_idx; #if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE + m_selection.setup_cache(); if (!evt.CmdDown()) #endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE m_mouse.drag.start_position_3D = m_mouse.scene_position; @@ -3529,7 +3543,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } #if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE - else if (evt.Dragging() && evt.LeftIsDown() && !evt.CmdDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { + else if (evt.Dragging() && evt.LeftIsDown() && !evt.CmdDown() && m_layers_editing.state == LayersEditing::Unknown && + m_mouse.drag.move_volume_idx != -1 && m_mouse.is_start_position_3D_defined()) { #else else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { #endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE @@ -3578,7 +3593,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { +#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION + // keeps the mouse position updated while dragging the selection rectangle + m_mouse.position = pos.cast(); + m_rectangle_selection.dragging(m_mouse.position); +#else m_rectangle_selection.dragging(pos.cast()); +#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_dirty = true; } else if (evt.Dragging()) { From ac0ec5fa4391423e6a23dd8d4463431fb6c43d02 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 11 Mar 2022 12:36:09 +0100 Subject: [PATCH 102/149] Tech ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE renamed as ENABLE_NEW_CAMERA_MOVEMENTS Tech ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE merged into ENABLE_NEW_CAMERA_MOVEMENTS Tech ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION renamed as ENABLE_NEW_RECTANGLE_SELECTION --- src/libslic3r/Technologies.hpp | 8 +- src/slic3r/GUI/GLCanvas3D.cpp | 97 ++++++++++++------------- src/slic3r/GUI/GLSelectionRectangle.hpp | 4 +- 3 files changed, 53 insertions(+), 56 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index c306cccc4d..b46b8731fd 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -80,10 +80,10 @@ #define ENABLE_SHOW_TOOLPATHS_COG (1 && ENABLE_2_5_0_ALPHA1) // Enable recalculating toolpaths when switching to/from volumetric rate visualization #define ENABLE_VOLUMETRIC_RATE_TOOLPATHS_RECALC (1 && ENABLE_2_5_0_ALPHA1) -// Enable modified camera control and selection using mouse -#define ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE (1 && ENABLE_2_5_0_ALPHA1) -#define ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE (1 && ENABLE_2_5_0_ALPHA1) -#define ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION (1 && ENABLE_2_5_0_ALPHA1) +// Enable modified camera control using mouse +#define ENABLE_NEW_CAMERA_MOVEMENTS (1 && ENABLE_2_5_0_ALPHA1) +// Enable modified rectangle selection +#define ENABLE_NEW_RECTANGLE_SELECTION (1 && ENABLE_2_5_0_ALPHA1) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6e1c1c536f..ea08f98711 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1696,11 +1696,11 @@ void GLCanvas3D::render() wxGetApp().imgui()->new_frame(); if (m_picking_enabled) { -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (m_rectangle_selection.is_dragging() && !m_rectangle_selection.is_empty()) #else if (m_rectangle_selection.is_dragging()) -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION // picking pass using rectangle selection _rectangular_selection_picking_pass(); else if (!m_volumes.empty()) @@ -2951,13 +2951,13 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); m_mouse.ignore_left_up = true; -#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if !ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; -#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // !ENABLE_NEW_RECTANGLE_SELECTION } -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION // set_cursor(Standard); } else if (keyCode == WXK_ALT) { @@ -2970,14 +2970,14 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // set_cursor(Standard); } else if (keyCode == WXK_CONTROL) { -#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#if ENABLE_NEW_CAMERA_MOVEMENTS if (m_mouse.dragging) { // if the user releases CTRL while rotating the 3D scene // prevent from moving the selected volume m_mouse.drag.move_volume_idx = -1; m_mouse.set_start_position_3D_as_invalid(); } -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#endif // ENABLE_NEW_CAMERA_MOVEMENTS m_dirty = true; } else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { @@ -3014,9 +3014,9 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_mouse.ignore_left_up = false; // set_cursor(Cross); } -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION } else if (keyCode == WXK_ALT) { if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { @@ -3438,7 +3438,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.state = LayersEditing::Editing; _perform_layer_editing_action(&evt); } -#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if !ENABLE_NEW_RECTANGLE_SELECTION else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports @@ -3448,9 +3448,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } -#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // !ENABLE_NEW_RECTANGLE_SELECTION else { -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports && @@ -3460,41 +3460,40 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION // Select volume in this 3D canvas. // Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected // during the scene manipulation. -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (m_picking_enabled && (!any_gizmo_active || !evt.ShiftDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()) && !m_rectangle_selection.is_dragging()) { #else if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION if (evt.LeftDown() && !m_hover_volume_idxs.empty()) { int volume_idx = get_first_hover_volume_idx(); bool already_selected = m_selection.contains_volume(volume_idx); -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION bool shift_down = evt.ShiftDown(); #else bool ctrl_down = evt.CmdDown(); -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (already_selected && shift_down) -#else - if (already_selected && ctrl_down) -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_selection.remove(volume_idx); else { -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION m_selection.add(volume_idx, !shift_down, true); #else + if (already_selected && ctrl_down) + m_selection.remove(volume_idx); + else { m_selection.add(volume_idx, !ctrl_down, true); -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION m_mouse.drag.move_requires_threshold = !already_selected; if (already_selected) m_mouse.set_move_start_threshold_position_2D_as_invalid(); @@ -3516,11 +3515,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (!m_hover_volume_idxs.empty() && !m_rectangle_selection.is_dragging()) { #else if (!m_hover_volume_idxs.empty()) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) { // Only accept the initial position, if it is inside the volume bounding box. const int volume_idx = get_first_hover_volume_idx(); @@ -3530,11 +3529,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None; // The dragging operation is initiated. m_mouse.drag.move_volume_idx = volume_idx; -#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#if ENABLE_NEW_CAMERA_MOVEMENTS m_selection.setup_cache(); if (!evt.CmdDown()) -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE - m_mouse.drag.start_position_3D = m_mouse.scene_position; +#endif // ENABLE_NEW_CAMERA_MOVEMENTS + m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; m_moving = true; } @@ -3542,12 +3541,12 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } } -#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#if ENABLE_NEW_CAMERA_MOVEMENTS else if (evt.Dragging() && evt.LeftIsDown() && !evt.CmdDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1 && m_mouse.is_start_position_3D_defined()) { #else else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#endif // ENABLE_NEW_CAMERA_MOVEMENTS if (!m_mouse.drag.move_requires_threshold) { m_mouse.dragging = true; Vec3d cur_pos = m_mouse.drag.start_position_3D; @@ -3593,13 +3592,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION // keeps the mouse position updated while dragging the selection rectangle m_mouse.position = pos.cast(); m_rectangle_selection.dragging(m_mouse.position); #else m_rectangle_selection.dragging(pos.cast()); -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; } else if (evt.Dragging()) { @@ -3612,17 +3611,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } // do not process the dragging if the left mouse was set down in another canvas -#if ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE +#if ENABLE_NEW_CAMERA_MOVEMENTS else if (evt.LeftIsDown() || evt.MiddleIsDown()) { -#else - else if (evt.LeftIsDown()) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE // if dragging over blank area with left button, rotate -#if ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE if ((any_gizmo_active || evt.CmdDown() || evt.MiddleIsDown() || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { #else + // if dragging over blank area with left button, rotate + else if (evt.LeftIsDown()) { if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_CTRL_ROTATE +#endif // ENABLE_NEW_CAMERA_MOVEMENTS const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.0) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.0); if (wxGetApp().app_config->get("use_free_camera") == "1") // Virtual track ball (similar to the 3DConnexion mouse). @@ -3641,13 +3638,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } m_mouse.drag.start_position_3D = Vec3d((double)pos.x(), (double)pos.y(), 0.0); } -#if ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE +#if ENABLE_NEW_CAMERA_MOVEMENTS else if (evt.RightIsDown()) { // If dragging with right button, pan. #else else if (evt.MiddleIsDown() || evt.RightIsDown()) { // If dragging over blank area with right button, pan. -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_MIDMOUSE_ROTATE +#endif // ENABLE_NEW_CAMERA_MOVEMENTS if (m_mouse.is_start_position_2D_defined()) { // get point in model space at Z = 0 float z = 0.0f; @@ -6418,9 +6415,9 @@ void GLCanvas3D::_update_volumes_hover_state() return; } -#if !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if !ENABLE_NEW_RECTANGLE_SELECTION bool selection_modifiers_only = m_selection.is_empty() || m_selection.is_any_modifier(); -#endif // !ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // !ENABLE_NEW_RECTANGLE_SELECTION bool hover_modifiers_only = true; for (int i : m_hover_volume_idxs) { @@ -6449,14 +6446,14 @@ void GLCanvas3D::_update_volumes_hover_state() if (volume.hover != GLVolume::HS_None) continue; -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION bool deselect = volume.selected && ((shift_pressed && m_rectangle_selection.is_empty()) || (alt_pressed && !m_rectangle_selection.is_empty())); - bool select = !volume.selected && (m_rectangle_selection.is_empty() || (shift_pressed && !m_rectangle_selection.is_empty())); + bool select = !volume.selected && (m_rectangle_selection.is_empty() || (shift_pressed && !m_rectangle_selection.is_empty())); #else bool deselect = volume.selected && ((ctrl_pressed && !shift_pressed) || alt_pressed); // (volume->is_modifier && !selection_modifiers_only && !is_ctrl_pressed) -> allows hovering on selected modifiers belonging to selection of type Instance bool select = (!volume.selected || (volume.is_modifier && !selection_modifiers_only && !ctrl_pressed)) && !alt_pressed; -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION if (select || deselect) { bool as_volume = @@ -7391,9 +7388,9 @@ void GLCanvas3D::_update_selection_from_hover() } bool selection_changed = false; -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION if (!m_rectangle_selection.is_empty()) { -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION if (state == GLSelectionRectangle::EState::Select) { bool contains_all = true; for (int i : m_hover_volume_idxs) { @@ -7424,9 +7421,9 @@ void GLCanvas3D::_update_selection_from_hover() selection_changed = true; } } -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION } -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION if (!selection_changed) return; diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index f18dc4a6ab..49b3447ba9 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -36,9 +36,9 @@ public: void render(const GLCanvas3D& canvas); bool is_dragging() const { return m_state != EState::Off; } -#if ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#if ENABLE_NEW_RECTANGLE_SELECTION bool is_empty() const { return m_state == EState::Off || m_start_corner.isApprox(m_end_corner); } -#endif // ENABLE_NEW_CAMERA_MOVEMENTS_SHIFT_SELECTION +#endif // ENABLE_NEW_RECTANGLE_SELECTION EState get_state() const { return m_state; } From d0d89a4d5bc02a87f417a2f2c73f5f91db0da5d6 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 09:04:44 +0100 Subject: [PATCH 103/149] Tech ENABLE_GL_IMGUI_SHADERS - Render imgui using shaders --- resources/shaders/imgui.fs | 11 +++ resources/shaders/imgui.vs | 17 ++++ src/libslic3r/Technologies.hpp | 2 + src/slic3r/GUI/GLShader.cpp | 16 +++- src/slic3r/GUI/GLShader.hpp | 8 ++ src/slic3r/GUI/GLShadersManager.cpp | 2 + src/slic3r/GUI/ImGuiWrapper.cpp | 133 ++++++++++++++++++++++++++-- 7 files changed, 182 insertions(+), 7 deletions(-) create mode 100644 resources/shaders/imgui.fs create mode 100644 resources/shaders/imgui.vs diff --git a/resources/shaders/imgui.fs b/resources/shaders/imgui.fs new file mode 100644 index 0000000000..4b0e27ce9d --- /dev/null +++ b/resources/shaders/imgui.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform sampler2D Texture; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/imgui.vs b/resources/shaders/imgui.vs new file mode 100644 index 0000000000..100813e2b5 --- /dev/null +++ b/resources/shaders/imgui.vs @@ -0,0 +1,17 @@ +#version 110 + +uniform mat4 ProjMtx; + +attribute vec2 Position; +attribute vec2 UV; +attribute vec4 Color; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 85158ccb22..b90769541c 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -70,6 +70,8 @@ #define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable using vertex attributes and matrices in shaders #define ENABLE_GL_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) +// Enable rendering imgui using shaders +#define ENABLE_GL_IMGUI_SHADERS (1 && ENABLE_GL_SHADERS_ATTRIBUTES) // Shows an imgui dialog with GLModel statistics data #define ENABLE_GLMODEL_STATISTICS (0 && ENABLE_LEGACY_OPENGL_REMOVAL) // Enable show non-manifold edges diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 7e5704e87d..c82658e5c0 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -122,8 +122,7 @@ bool GLShaderProgram::init_from_texts(const std::string& name, const ShaderSourc for (size_t i = 0; i < static_cast(EShaderType::Count); ++i) { const std::string& source = sources[i]; - if (!source.empty()) - { + if (!source.empty()) { EShaderType type = static_cast(i); auto [result, id] = create_shader(type); if (result) @@ -303,6 +302,19 @@ void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const } #endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_IMGUI_SHADERS +void GLShaderProgram::set_uniform(int id, const Matrix4f& value) const +{ + if (id >= 0) + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Matrix4d& value) const +{ + set_uniform(id, (Matrix4f)value.cast()); +} +#endif // ENABLE_GL_IMGUI_SHADERS + void GLShaderProgram::set_uniform(int id, const Vec3f& value) const { if (id >= 0) diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index a867a62bda..3b669fc77d 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -64,6 +64,10 @@ public: #if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } #endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_IMGUI_SHADERS + void set_uniform(const char* name, const Matrix4f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Matrix4d& value) const { set_uniform(get_uniform_location(name), value); } +#endif // ENABLE_GL_IMGUI_SHADERS void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } @@ -86,6 +90,10 @@ public: #if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(int id, const Matrix3d& value) const; #endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_IMGUI_SHADERS + void set_uniform(int id, const Matrix4f& value) const; + void set_uniform(int id, const Matrix4d& value) const; +#endif // ENABLE_GL_IMGUI_SHADERS void set_uniform(int id, const Vec3f& value) const; void set_uniform(int id, const Vec3d& value) const; void set_uniform(int id, const ColorRGB& value) const; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 75b6824a70..9f0b03ea0e 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -35,6 +35,8 @@ std::pair GLShadersManager::init() #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES + // imgui shader + valid &= append_shader("imgui", { "imgui.vs", "imgui.fs" }); // basic shader, used to render all what was previously rendered using the immediate mode valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); // basic shader for textures, used to render textures diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 4b75befb6c..819d6141e0 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -26,13 +26,18 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" #include "libslic3r/Color.hpp" + #include "3DScene.hpp" #include "GUI.hpp" #include "I18N.hpp" #include "Search.hpp" #include "BitmapCache.hpp" +#if ENABLE_GL_IMGUI_SHADERS +#include "GUI_App.hpp" +#endif // ENABLE_GL_IMGUI_SHADERS #include "../Utils/MacDarkMode.hpp" + #include "nanosvg/nanosvg.h" #include "nanosvg/nanosvgrast.h" @@ -1442,12 +1447,30 @@ void ImGuiWrapper::init_style() void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) { + if (draw_data == nullptr || draw_data->CmdListsCount == 0) + return; + +#if ENABLE_GL_IMGUI_SHADERS + GLShaderProgram* shader = wxGetApp().get_shader("imgui"); + if (shader == nullptr) + return; +#endif // ENABLE_GL_IMGUI_SHADERS + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) ImGuiIO& io = ImGui::GetIO(); const int fb_width = (int)(draw_data->DisplaySize.x * io.DisplayFramebufferScale.x); const int fb_height = (int)(draw_data->DisplaySize.y * io.DisplayFramebufferScale.y); if (fb_width == 0 || fb_height == 0) return; + +#if ENABLE_GL_IMGUI_SHADERS + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + shader->start_using(); +#endif // ENABLE_GL_IMGUI_SHADERS + draw_data->ScaleClipRects(io.DisplayFramebufferScale); // We are using the OpenGL fixed pipeline to make the example code simpler to read! @@ -1464,17 +1487,37 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glDisable(GL_LIGHTING)); glsafe(::glDisable(GL_COLOR_MATERIAL)); glsafe(::glEnable(GL_SCISSOR_TEST)); +#if !ENABLE_GL_IMGUI_SHADERS glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glEnableClientState(GL_COLOR_ARRAY)); +#endif // !ENABLE_GL_IMGUI_SHADERS glsafe(::glEnable(GL_TEXTURE_2D)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); GLint texture_env_mode = GL_MODULATE; glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &texture_env_mode)); glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); - //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound +#if ENABLE_GL_IMGUI_SHADERS + // Setup viewport, orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + glsafe(::glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); + const float L = draw_data->DisplayPos.x; + const float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + const float T = draw_data->DisplayPos.y; + const float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + + Matrix4f ortho_projection; + ortho_projection << + 2.0f / (R - L), 0.0f, 0.0f, (R + L) / (L - R), + 0.0f, 2.0f / (T - B), 0.0f, (T + B) / (B - T), + 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f; + + shader->set_uniform("Texture", 0); + shader->set_uniform("ProjMtx", ortho_projection); +#else // Setup viewport, orthographic projection matrix // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps. glsafe(::glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); @@ -1485,16 +1528,57 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); +#endif // ENABLE_GL_IMGUI_SHADERS + +#if ENABLE_GL_IMGUI_SHADERS + // Will project scissor/clipping rectangles into framebuffer space + const ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + const ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) +#else + const ImVec2 pos = draw_data->DisplayPos; +#endif // ENABLE_GL_IMGUI_SHADERS // Render command lists - ImVec2 pos = draw_data->DisplayPos; for (int n = 0; n < draw_data->CmdListsCount; ++n) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; +#if ENABLE_GL_IMGUI_SHADERS + const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); + const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); + + GLuint vbo_id; + glsafe(::glGenBuffers(1, &vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, nullptr, GL_STREAM_DRAW)); + glsafe(::glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data)); + + GLuint ibo_id; + glsafe(::glGenBuffers(1, &ibo_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, nullptr, GL_STREAM_DRAW)); + glsafe(::glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data)); + + const int position_id = shader->get_attrib_location("Position"); + if (position_id != -1) { + glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos)); + glEnableVertexAttribArray(position_id); + } + const int uv_id = shader->get_attrib_location("UV"); + if (uv_id != -1) { + glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv)); + glEnableVertexAttribArray(uv_id); + } + const int color_id = shader->get_attrib_location("Color"); + if (color_id != -1) { + glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col)); + glEnableVertexAttribArray(color_id); + } +#else glsafe(::glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)))); glsafe(::glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)))); glsafe(::glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)))); +#endif // ENABLE_GL_IMGUI_SHADERS for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; ++cmd_i) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; @@ -1502,34 +1586,73 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) // User callback (registered via ImDrawList::AddCallback) pcmd->UserCallback(cmd_list, pcmd); else { - ImVec4 clip_rect = ImVec4(pcmd->ClipRect.x - pos.x, pcmd->ClipRect.y - pos.y, pcmd->ClipRect.z - pos.x, pcmd->ClipRect.w - pos.y); +#if ENABLE_GL_IMGUI_SHADERS + // Project scissor/clipping rectangles into framebuffer space + const ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + const ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle (Y is inverted in OpenGL) + glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y)); + + // Bind texture, Draw + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); +#else + const ImVec4 clip_rect = ImVec4(pcmd->ClipRect.x - pos.x, pcmd->ClipRect.y - pos.y, pcmd->ClipRect.z - pos.x, pcmd->ClipRect.w - pos.y); if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f) { // Apply scissor/clipping rectangle glsafe(::glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y))); // Bind texture, Draw - glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId)); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer)); + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); } +#endif // ENABLE_GL_IMGUI_SHADERS } idx_buffer += pcmd->ElemCount; } + +#if ENABLE_GL_IMGUI_SHADERS + if (position_id != -1) + glDisableVertexAttribArray(position_id); + if (uv_id != -1) + glDisableVertexAttribArray(uv_id); + if (color_id != -1) + glDisableVertexAttribArray(color_id); + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + glsafe(::glDeleteBuffers(1, &ibo_id)); + glsafe(::glDeleteBuffers(1, &vbo_id)); +#endif // ENABLE_GL_IMGUI_SHADERS } // Restore modified state glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texture_env_mode)); +#if !ENABLE_GL_IMGUI_SHADERS glsafe(::glDisableClientState(GL_COLOR_ARRAY)); glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#endif // !ENABLE_GL_IMGUI_SHADERS glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture)); +#if !ENABLE_GL_IMGUI_SHADERS glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glPopMatrix()); +#endif // !ENABLE_GL_IMGUI_SHADERS glsafe(::glPopAttrib()); glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1])); glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); + +#if ENABLE_GL_IMGUI_SHADERS + if (curr_shader != nullptr) + curr_shader->start_using(); +#endif // ENABLE_GL_IMGUI_SHADERS } bool ImGuiWrapper::display_initialized() const From 5586fd92f2c32a7bb71a31fb5b6a31d540d32e20 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 09:50:25 +0100 Subject: [PATCH 104/149] Follow-up of d0d89a4d5bc02a87f417a2f2c73f5f91db0da5d6 - Fixed warnings --- src/slic3r/GUI/ImGuiWrapper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 819d6141e0..622f3b3907 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1551,13 +1551,13 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glGenBuffers(1, &vbo_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, nullptr, GL_STREAM_DRAW)); - glsafe(::glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data)); + glsafe(::glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)vtx_buffer)); GLuint ibo_id; glsafe(::glGenBuffers(1, &ibo_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, nullptr, GL_STREAM_DRAW)); - glsafe(::glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data)); + glsafe(::glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)idx_buffer)); const int position_id = shader->get_attrib_location("Position"); if (position_id != -1) { From 4eee0d05f3367c9b05f195ec2e4e4ada41ba5b94 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 09:50:42 +0100 Subject: [PATCH 105/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Use shader's vertex attributes and matrices in GLMmSegmentationGizmo3DScene --- .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 13c8a71c62..49eb8cb95b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -600,11 +600,17 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) return; #if ENABLE_GL_SHADERS_ATTRIBUTES assert(shader->get_name() == "mm_gouraud_attr"); + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); #else assert(shader->get_name() == "mm_gouraud"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES - for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) + for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) { if (m_gizmo_scene.has_VBOs(color_idx)) { if (color_idx > m_colors.size()) // Seed fill VBO shader->set_uniform("uniform_color", TriangleSelectorGUI::get_seed_fill_color(color_idx == (m_colors.size() + 1) ? m_default_volume_color : m_colors[color_idx - (m_colors.size() + 1) - 1])); @@ -613,6 +619,7 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) m_gizmo_scene.render(color_idx); } + } #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -724,19 +731,41 @@ void GLMmSegmentationGizmo3DScene::render(size_t triangle_indices_idx) const assert(this->vertices_VBO_id != 0); assert(this->triangle_indices_VBO_ids[triangle_indices_idx] != 0); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), (const void*)(0 * sizeof(float)))); +#if ENABLE_GL_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; +#endif // ENABLE_GL_SHADERS_ATTRIBUTES + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); +#if ENABLE_GL_SHADERS_ATTRIBUTES + const GLint position_id = shader->get_attrib_location("v_position"); + if (position_id != -1) { + glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (GLvoid*)0)); + glsafe(::glEnableVertexAttribArray(position_id)); + } + + // Render using the Vertex Buffer Objects. + if (this->triangle_indices_VBO_ids[triangle_indices_idx] != 0 && + this->triangle_indices_sizes[triangle_indices_idx] > 0) { +#else + glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), (const void*)(0 * sizeof(float)))); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); // Render using the Vertex Buffer Objects. if (this->triangle_indices_sizes[triangle_indices_idx] > 0) { +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_ids[triangle_indices_idx])); glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(this->triangle_indices_sizes[triangle_indices_idx]), GL_UNSIGNED_INT, nullptr)); - glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } +#if ENABLE_GL_SHADERS_ATTRIBUTES + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); +#else glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } From f0bad14748f12ec758248627fd7a047c13f089e5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 09:59:38 +0100 Subject: [PATCH 106/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Small refactoring into GCodeViewer::render_toolpaths() --- src/slic3r/GUI/GCodeViewer.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index cb54376357..d174f781c6 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -3194,15 +3194,13 @@ void GCodeViewer::render_toolpaths() shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES - int position_id = -1; - int normal_id = -1; const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - position_id = shader->get_attrib_location("v_position"); - normal_id = shader->get_attrib_location("v_normal"); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { @@ -3319,16 +3317,14 @@ void GCodeViewer::render_toolpaths() shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES - int position_id = -1; - int normal_id = -1; const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - position_id = shader->get_attrib_location("v_position"); - normal_id = shader->get_attrib_location("v_normal"); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); From 2ab8469cb64bc7f8c37d5f7f583275510c68116b Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 13:34:08 +0100 Subject: [PATCH 107/149] Refactoring in ImGuiWrapper::render_draw_data() --- src/slic3r/GUI/ImGuiWrapper.cpp | 46 ++++++++++++++------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 622f3b3907..613b168415 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1458,7 +1458,7 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) ImGuiIO& io = ImGui::GetIO(); - const int fb_width = (int)(draw_data->DisplaySize.x * io.DisplayFramebufferScale.x); + const int fb_width = (int)(draw_data->DisplaySize.x * io.DisplayFramebufferScale.x); const int fb_height = (int)(draw_data->DisplaySize.y * io.DisplayFramebufferScale.y); if (fb_width == 0 || fb_height == 0) return; @@ -1469,9 +1469,9 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) curr_shader->stop_using(); shader->start_using(); -#endif // ENABLE_GL_IMGUI_SHADERS - +#else draw_data->ScaleClipRects(io.DisplayFramebufferScale); +#endif // ENABLE_GL_IMGUI_SHADERS // We are using the OpenGL fixed pipeline to make the example code simpler to read! // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. @@ -1479,15 +1479,16 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) GLint last_polygon_mode[2]; glsafe(::glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode)); GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLint last_texture_env_mode; glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_texture_env_mode)); glsafe(::glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); glsafe(::glDisable(GL_CULL_FACE)); glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_LIGHTING)); - glsafe(::glDisable(GL_COLOR_MATERIAL)); glsafe(::glEnable(GL_SCISSOR_TEST)); #if !ENABLE_GL_IMGUI_SHADERS + glsafe(::glDisable(GL_LIGHTING)); + glsafe(::glDisable(GL_COLOR_MATERIAL)); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glEnableClientState(GL_COLOR_ARRAY)); @@ -1495,9 +1496,6 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glEnable(GL_TEXTURE_2D)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); - GLint texture_env_mode = GL_MODULATE; - glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &texture_env_mode)); - glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); #if ENABLE_GL_IMGUI_SHADERS // Setup viewport, orthographic projection matrix @@ -1550,29 +1548,27 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) GLuint vbo_id; glsafe(::glGenBuffers(1, &vbo_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, nullptr, GL_STREAM_DRAW)); - glsafe(::glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)vtx_buffer)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, vtx_buffer, GL_STATIC_DRAW)); GLuint ibo_id; glsafe(::glGenBuffers(1, &ibo_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, nullptr, GL_STREAM_DRAW)); - glsafe(::glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)idx_buffer)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, idx_buffer, GL_STATIC_DRAW)); const int position_id = shader->get_attrib_location("Position"); if (position_id != -1) { - glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos)); - glEnableVertexAttribArray(position_id); + glsafe(::glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); + glsafe(::glEnableVertexAttribArray(position_id)); } const int uv_id = shader->get_attrib_location("UV"); if (uv_id != -1) { - glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv)); - glEnableVertexAttribArray(uv_id); + glsafe(::glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); + glsafe(::glEnableVertexAttribArray(uv_id)); } const int color_id = shader->get_attrib_location("Color"); if (color_id != -1) { - glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col)); - glEnableVertexAttribArray(color_id); + glsafe(::glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); + glsafe(::glEnableVertexAttribArray(color_id)); } #else glsafe(::glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)))); @@ -1594,7 +1590,7 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) continue; // Apply scissor/clipping rectangle (Y is inverted in OpenGL) - glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y)); + glsafe(::glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y))); // Bind texture, Draw glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); @@ -1616,11 +1612,11 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) #if ENABLE_GL_IMGUI_SHADERS if (position_id != -1) - glDisableVertexAttribArray(position_id); + glsafe(::glDisableVertexAttribArray(position_id)); if (uv_id != -1) - glDisableVertexAttribArray(uv_id); + glsafe(::glDisableVertexAttribArray(uv_id)); if (color_id != -1) - glDisableVertexAttribArray(color_id); + glsafe(::glDisableVertexAttribArray(color_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); @@ -1631,14 +1627,12 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) } // Restore modified state - glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texture_env_mode)); + glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_texture_env_mode)); + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture)); #if !ENABLE_GL_IMGUI_SHADERS glsafe(::glDisableClientState(GL_COLOR_ARRAY)); glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // !ENABLE_GL_IMGUI_SHADERS - glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture)); -#if !ENABLE_GL_IMGUI_SHADERS glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_PROJECTION)); From 9174fc487211d3434e2029a8136cda0b3b091591 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 14:25:09 +0100 Subject: [PATCH 108/149] Removed obsolete tech ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS --- src/libslic3r/Technologies.hpp | 2 -- src/slic3r/GUI/GCodeViewer.cpp | 8 -------- 2 files changed, 10 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index b90769541c..5a1e2dc7d3 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -34,8 +34,6 @@ #define ENABLE_ENVIRONMENT_MAP 0 // Enable smoothing of objects normals #define ENABLE_SMOOTH_NORMALS 0 -// Enable rendering markers for options in preview as fixed screen size points -#define ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS 1 //================ diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index d174f781c6..fcff51d37d 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -2968,11 +2968,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool void GCodeViewer::render_toolpaths() { -#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - const float point_size = 20.0f; -#else const float point_size = 0.8f; -#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS #if !ENABLE_GL_SHADERS_ATTRIBUTES const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; #endif // !ENABLE_GL_SHADERS_ATTRIBUTES @@ -2983,11 +2979,7 @@ void GCodeViewer::render_toolpaths() static_cast(viewport[3]) * 0.0005; auto shader_init_as_points = [zoom, point_size, near_plane_height](GLShaderProgram& shader) { -#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS - shader.set_uniform("use_fixed_screen_size", 1); -#else shader.set_uniform("use_fixed_screen_size", 0); -#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS shader.set_uniform("zoom", zoom); shader.set_uniform("percent_outline_radius", 0.0f); shader.set_uniform("percent_center_radius", 0.33f); From 033bee64311d7645a581020dde77b028aac9dbc2 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 14:55:25 +0100 Subject: [PATCH 109/149] Removed obsolete code from GCodeViewer --- src/slic3r/GUI/GCodeViewer.cpp | 75 +++------------------------------- src/slic3r/GUI/GCodeViewer.hpp | 7 ---- 2 files changed, 6 insertions(+), 76 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index fcff51d37d..84175e8033 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1310,18 +1310,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) log_memory_used(label, vertices_size + indices_size); }; - // format data into the buffers to be rendered as points - auto add_vertices_as_point = [](const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { - vertices.push_back(curr.position.x()); - vertices.push_back(curr.position.y()); - vertices.push_back(curr.position.z()); - }; - auto add_indices_as_point = [](const GCodeProcessorResult::MoveVertex& curr, TBuffer& buffer, - unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { - buffer.add_path(curr, ibuffer_id, indices.size(), move_id); - indices.push_back(static_cast(indices.size())); - }; - // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { #if !ENABLE_GL_SHADERS_ATTRIBUTES @@ -1816,7 +1804,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) switch (t_buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } #if ENABLE_VOLUMETRIC_RATE_TOOLPATHS_RECALC case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, move_id, account_for_volumetric_rate); break; } @@ -2152,8 +2139,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - indiced_size_to_add) { i_multibuffer.push_back(IndexBuffer()); vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point && - t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { Path& last_path = t_buffer.paths.back(); last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); } @@ -2169,8 +2155,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) curr_vertex_buffer.second = 0; vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); - if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point && - t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { Path& last_path = t_buffer.paths.back(); last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, move_id - 1); } @@ -2180,11 +2165,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) switch (t_buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { - add_indices_as_point(curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id); - curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); - break; - } case TBuffer::ERenderPrimitiveType::Line: { #if ENABLE_VOLUMETRIC_RATE_TOOLPATHS_RECALC add_indices_as_line(prev, curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, move_id, account_for_volumetric_rate); @@ -2732,10 +2712,6 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool unsigned int size_in_indices = 0; switch (buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { - size_in_indices = buffer.indices_per_segment(); - break; - } case TBuffer::ERenderPrimitiveType::Line: case TBuffer::ERenderPrimitiveType::Triangle: { unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id); @@ -2978,39 +2954,6 @@ void GCodeViewer::render_toolpaths() const float near_plane_height = camera.get_type() == Camera::EType::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : static_cast(viewport[3]) * 0.0005; - auto shader_init_as_points = [zoom, point_size, near_plane_height](GLShaderProgram& shader) { - shader.set_uniform("use_fixed_screen_size", 0); - shader.set_uniform("zoom", zoom); - shader.set_uniform("percent_outline_radius", 0.0f); - shader.set_uniform("percent_center_radius", 0.33f); - shader.set_uniform("point_size", point_size); - shader.set_uniform("near_plane_height", near_plane_height); - }; - - auto render_as_points = [ -#if ENABLE_GCODE_VIEWER_STATISTICS - this -#endif // ENABLE_GCODE_VIEWER_STATISTICS - ](std::vector::iterator it_path, std::vector::iterator it_end, GLShaderProgram& shader, int uniform_color) { - glsafe(::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)); - glsafe(::glEnable(GL_POINT_SPRITE)); - - for (auto it = it_path; it != it_end && it_path->ibuffer_id == it->ibuffer_id; ++it) { - const RenderPath& path = *it; - // Some OpenGL drivers crash on empty glMultiDrawElements, see GH #7415. - assert(! path.sizes.empty()); - assert(! path.offsets.empty()); - shader.set_uniform(uniform_color, path.color); - glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_points_calls_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - } - - glsafe(::glDisable(GL_POINT_SPRITE)); - glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); - }; - #if !ENABLE_GL_SHADERS_ATTRIBUTES auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { shader.set_uniform("light_intensity", light_intensity); @@ -3190,9 +3133,6 @@ void GCodeViewer::render_toolpaths() shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - - const int position_id = shader->get_attrib_location("v_position"); - const int normal_id = shader->get_attrib_location("v_normal"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { @@ -3203,6 +3143,8 @@ void GCodeViewer::render_toolpaths() else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { shader->set_uniform("emission_factor", 0.25f); #if ENABLE_GL_SHADERS_ATTRIBUTES + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); render_as_batched_model(buffer, *shader, position_id, normal_id); #else render_as_batched_model(buffer, *shader); @@ -3211,8 +3153,8 @@ void GCodeViewer::render_toolpaths() } else { #if ENABLE_GL_SHADERS_ATTRIBUTES - if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Point) - shader_init_as_points(*shader); + const int position_id = shader->get_attrib_location("v_position"); + const int normal_id = shader->get_attrib_location("v_normal"); #else switch (buffer.render_primitive_type) { case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; @@ -3259,10 +3201,6 @@ void GCodeViewer::render_toolpaths() // Render all elements with it_path->ibuffer_id == ibuffer_id, possible with varying colors. switch (buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { - render_as_points(it_path, buffer.render_paths.end(), *shader, uniform_color); - break; - } case TBuffer::ERenderPrimitiveType::Line: { glsafe(::glLineWidth(static_cast(line_width(zoom)))); render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); @@ -4670,7 +4608,6 @@ void GCodeViewer::render_statistics() } if (ImGui::CollapsingHeader("OpenGL calls")) { - add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count); add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); add_counter(std::string("GL_TRIANGLES:"), m_statistics.gl_triangles_calls_count); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 438fc55fd1..e2ee6dcd0d 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -284,7 +284,6 @@ class GCodeViewer { enum class ERenderPrimitiveType : unsigned char { - Point, Line, Triangle, InstancedModel, @@ -325,7 +324,6 @@ class GCodeViewer unsigned int max_vertices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } case ERenderPrimitiveType::Triangle: { return 8; } default: { return 0; } @@ -337,7 +335,6 @@ class GCodeViewer unsigned int indices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } case ERenderPrimitiveType::Triangle: { return 30; } // 3 indices x 10 triangles default: { return 0; } @@ -347,7 +344,6 @@ class GCodeViewer unsigned int max_indices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } case ERenderPrimitiveType::Triangle: { return 36; } // 3 indices x 12 triangles default: { return 0; } @@ -358,7 +354,6 @@ class GCodeViewer bool has_data() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: case ERenderPrimitiveType::Line: case ERenderPrimitiveType::Triangle: { return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; @@ -585,7 +580,6 @@ class GCodeViewer int64_t refresh_time{ 0 }; int64_t refresh_paths_time{ 0 }; // opengl calls - int64_t gl_multi_points_calls_count{ 0 }; int64_t gl_multi_lines_calls_count{ 0 }; int64_t gl_multi_triangles_calls_count{ 0 }; int64_t gl_triangles_calls_count{ 0 }; @@ -628,7 +622,6 @@ class GCodeViewer } void reset_opengl() { - gl_multi_points_calls_count = 0; gl_multi_lines_calls_count = 0; gl_multi_triangles_calls_count = 0; gl_triangles_calls_count = 0; From 0a2001ed1c862553ff9d1229cf09be8b9bdbf8c8 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 14 Mar 2022 15:21:00 +0100 Subject: [PATCH 110/149] #8032 - GCodeProcessor - Fixed parsing of LAYER_CHANGE tag for spiral vase mode --- src/libslic3r/GCode/GCodeProcessor.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 50c0ce4a54..3bf7c4ffd3 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1952,12 +1952,15 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers ++m_layer_id; #if ENABLE_SPIRAL_VASE_LAYERS if (m_spiral_vase_active) { - assert(!m_result.moves.empty()); - size_t move_id = m_result.moves.size() - 1; - if (!m_result.spiral_vase_layers.empty() && m_end_position[Z] == m_result.spiral_vase_layers.back().first) - m_result.spiral_vase_layers.back().second.second = move_id; - else - m_result.spiral_vase_layers.push_back({ static_cast(m_end_position[Z]), { move_id, move_id } }); + if (m_result.moves.empty()) + m_result.spiral_vase_layers.push_back({ m_first_layer_height, { 0, 0 } }); + else { + const size_t move_id = m_result.moves.size() - 1; + if (!m_result.spiral_vase_layers.empty() && m_end_position[Z] == m_result.spiral_vase_layers.back().first) + m_result.spiral_vase_layers.back().second.second = move_id; + else + m_result.spiral_vase_layers.push_back({ static_cast(m_end_position[Z]), { move_id, move_id } }); + } } #endif // ENABLE_SPIRAL_VASE_LAYERS return; From 887ce895580686f87693dbe8a59800950a9b767e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 15 Mar 2022 08:50:00 +0100 Subject: [PATCH 111/149] Limit width of GCodeViewer::SequentialView::GCodeWindow --- src/slic3r/GUI/GCodeViewer.cpp | 73 +++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 84175e8033..2a63a30049 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -459,6 +459,7 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u static const ImVec4 COMMAND_COLOR = { 0.8f, 0.8f, 0.0f, 1.0f }; static const ImVec4 PARAMETERS_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; static const ImVec4 COMMENT_COLOR = { 0.7f, 0.7f, 0.7f, 1.0f }; + static const ImVec4 ELLIPSIS_COLOR = { 0.0f, 0.7f, 0.0f, 1.0f }; if (!m_visible || m_filename.empty() || m_lines_ends.empty() || curr_line_id == 0) return; @@ -503,6 +504,35 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u ImGuiWrapper& imgui = *wxGetApp().imgui(); + auto add_item_to_line = [&imgui](const std::string& txt, const ImVec4& color, float spacing, size_t& current_length) { + static const size_t LENGTH_THRESHOLD = 60; + + if (txt.empty()) + return false; + + std::string out_text = txt; + bool reduced = false; + if (current_length + out_text.length() > LENGTH_THRESHOLD) { + out_text = out_text.substr(0, LENGTH_THRESHOLD - current_length); + reduced = true; + } + + current_length += out_text.length(); + + ImGui::SameLine(0.0f, spacing); + ImGui::PushStyleColor(ImGuiCol_Text, color); + imgui.text(out_text); + ImGui::PopStyleColor(); + if (reduced) { + ImGui::SameLine(0.0f, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, ELLIPSIS_COLOR); + imgui.text("..."); + ImGui::PopStyleColor(); + } + + return reduced; + }; + imgui.set_next_window_pos(0.0f, top, ImGuiCond_Always, 0.0f, 0.0f); imgui.set_next_window_size(0.0f, wnd_height, ImGuiCond_Always); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); @@ -527,41 +557,22 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, u ImGui::GetColorU32(SELECTION_RECT_COLOR)); } - // render line number const std::string id_str = std::to_string(id); // spacer to right align text ImGui::Dummy({ id_width - ImGui::CalcTextSize(id_str.c_str()).x, text_height }); - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, LINE_NUMBER_COLOR); - imgui.text(id_str); - ImGui::PopStyleColor(); - if (!line.command.empty() || !line.comment.empty()) - ImGui::SameLine(); - - // render command - if (!line.command.empty()) { - ImGui::PushStyleColor(ImGuiCol_Text, COMMAND_COLOR); - imgui.text(line.command); - ImGui::PopStyleColor(); - } - - // render parameters - if (!line.parameters.empty()) { - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, PARAMETERS_COLOR); - imgui.text(line.parameters); - ImGui::PopStyleColor(); - } - - // render comment - if (!line.comment.empty()) { - if (!line.command.empty()) - ImGui::SameLine(0.0f, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, COMMENT_COLOR); - imgui.text(line.comment); - ImGui::PopStyleColor(); - } + size_t line_length = 0; + // render line number + bool stop_adding = add_item_to_line(id_str, LINE_NUMBER_COLOR, 0.0f, line_length); + if (!stop_adding && !line.command.empty()) + // render command + stop_adding = add_item_to_line(line.command, COMMAND_COLOR, -1.0f, line_length); + if (!stop_adding && !line.parameters.empty()) + // render parameters + stop_adding = add_item_to_line(line.parameters, PARAMETERS_COLOR, 0.0f, line_length); + if (!stop_adding && !line.comment.empty()) + // render comment + stop_adding = add_item_to_line(line.comment, COMMENT_COLOR, line.command.empty() ? -1.0f : 0.0f, line_length); } imgui.end(); From 58701b237d233f2b0517106c7ce3a4f10db55873 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 15 Mar 2022 09:05:16 +0100 Subject: [PATCH 112/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Fixed rendering of bed texture in thumbnails --- src/slic3r/GUI/3DBed.cpp | 15 +++++++++++---- src/slic3r/GUI/3DBed.hpp | 8 +++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 177c508ad3..f3176d2c73 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -515,7 +515,7 @@ void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, co render_model(view_matrix, projection_matrix); if (show_texture) - render_texture(bottom, canvas); + render_texture(bottom, canvas, view_matrix, projection_matrix); } #else void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) @@ -528,7 +528,11 @@ void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) } #endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_SHADERS_ATTRIBUTES +void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix) +#else void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { if (m_texture_filename.empty()) { m_texture.reset(); @@ -600,9 +604,8 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", projection_matrix); #endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("transparent_background", bottom); shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg")); @@ -766,7 +769,11 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bo #endif // ENABLE_GL_SHADERS_ATTRIBUTES if (show_texture) +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_texture(bottom, canvas, view_matrix, projection_matrix); +#else render_texture(bottom, canvas); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES } void Bed3D::render_default(bool bottom, bool picking) diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index de4fa99cfc..167577882a 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -168,14 +168,12 @@ private: void render_axes(); #if ENABLE_GL_SHADERS_ATTRIBUTES void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture); -#else - void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - void render_texture(bool bottom, GLCanvas3D& canvas); -#if ENABLE_GL_SHADERS_ATTRIBUTES + void render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking); #else + void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture); + void render_texture(bool bottom, GLCanvas3D& canvas); void render_model(); void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); #endif // ENABLE_GL_SHADERS_ATTRIBUTES From 568bd39c5ab3ea4ed43b8f43f14e2c746b289087 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 15 Mar 2022 09:16:06 +0100 Subject: [PATCH 113/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Fixed rendering of default bed in thumbnails --- src/slic3r/GUI/3DBed.cpp | 37 ++++++++++++++++++++++++++++++++++--- src/slic3r/GUI/3DBed.hpp | 4 +++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index f3176d2c73..3cbebfff8c 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -536,7 +536,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) { if (m_texture_filename.empty()) { m_texture.reset(); +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } @@ -549,7 +553,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) { // generate a temporary lower resolution texture to show while no main texture levels have been compressed if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } canvas.request_extra_frame(); @@ -557,7 +565,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // starts generating the main texture, compression will run asynchronously if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } } @@ -565,7 +577,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // generate a temporary lower resolution texture to show while no main texture levels have been compressed if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) { if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false)) { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } canvas.request_extra_frame(); @@ -573,12 +589,20 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // starts generating the main texture, compression will run asynchronously if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } } else { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, false, view_matrix, projection_matrix); +#else render_default(bottom, false); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } } @@ -757,7 +781,11 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bo #endif // ENABLE_GL_SHADERS_ATTRIBUTES { if (m_texture_filename.empty() && m_model_filename.empty()) { +#if ENABLE_GL_SHADERS_ATTRIBUTES + render_default(bottom, picking, view_matrix, projection_matrix); +#else render_default(bottom, picking); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; } @@ -776,7 +804,11 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bo #endif // ENABLE_GL_SHADERS_ATTRIBUTES } +#if ENABLE_GL_SHADERS_ATTRIBUTES +void Bed3D::render_default(bool bottom, bool picking, const Transform3d& view_matrix, const Transform3d& projection_matrix) +#else void Bed3D::render_default(bool bottom, bool picking) +#endif // ENABLE_GL_SHADERS_ATTRIBUTES { m_texture.reset(); @@ -793,9 +825,8 @@ void Bed3D::render_default(bool bottom, bool picking) shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_model_matrix", view_matrix); + shader->set_uniform("projection_matrix", projection_matrix); #endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 167577882a..7c334cb939 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -171,13 +171,15 @@ private: void render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking); + void render_default(bool bottom, bool picking, const Transform3d& view_matrix, const Transform3d& projection_matrix); #else void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture); void render_texture(bool bottom, GLCanvas3D& canvas); void render_model(); void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES void render_default(bool bottom, bool picking); +#endif // ENABLE_GL_SHADERS_ATTRIBUTES + #if !ENABLE_LEGACY_OPENGL_REMOVAL void release_VBOs(); #endif // !ENABLE_LEGACY_OPENGL_REMOVAL From 9701d3b01d2d64c3e45d7357c645f8664990f6d2 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 15 Mar 2022 10:31:30 +0100 Subject: [PATCH 114/149] Follow-up of 033bee64311d7645a581020dde77b028aac9dbc2 - Fixed warnings --- src/slic3r/GUI/GCodeViewer.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 2a63a30049..d33004f494 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -2955,15 +2955,11 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool void GCodeViewer::render_toolpaths() { - const float point_size = 0.8f; #if !ENABLE_GL_SHADERS_ATTRIBUTES const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; #endif // !ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const double zoom = camera.get_zoom(); - const std::array& viewport = camera.get_viewport(); - const float near_plane_height = camera.get_type() == Camera::EType::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : - static_cast(viewport[3]) * 0.0005; #if !ENABLE_GL_SHADERS_ATTRIBUTES auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { @@ -3245,9 +3241,9 @@ void GCodeViewer::render_toolpaths() } #if ENABLE_GCODE_VIEWER_STATISTICS - auto render_sequential_range_cap = [this] + auto render_sequential_range_cap = [this, &camera] #else - auto render_sequential_range_cap = [] + auto render_sequential_range_cap = [&camera] #endif // ENABLE_GCODE_VIEWER_STATISTICS (const SequentialRangeCap& cap) { const TBuffer* buffer = cap.buffer; @@ -3258,7 +3254,6 @@ void GCodeViewer::render_toolpaths() shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); From 0c4df47bd095e571ed8609b4c8d1820e47f5c9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Wed, 16 Mar 2022 10:57:18 +0100 Subject: [PATCH 115/149] Fixed various issues in the ported Lightning infill. Added export to SVG for TreeNode. Also was finalized integration of Lightning infill and Lightning infill was enabled. --- src/libslic3r/Fill/Fill.cpp | 6 +- src/libslic3r/Fill/FillBase.cpp | 2 - src/libslic3r/Fill/FillRectilinear.cpp | 8 +- .../Fill/Lightning/DistanceField.cpp | 67 ++++++++++++---- .../Fill/Lightning/DistanceField.hpp | 26 ++++++- src/libslic3r/Fill/Lightning/Generator.cpp | 42 +++++----- src/libslic3r/Fill/Lightning/Generator.hpp | 2 +- src/libslic3r/Fill/Lightning/Layer.cpp | 77 ++++++++++++------- src/libslic3r/Fill/Lightning/Layer.hpp | 19 +++-- src/libslic3r/Fill/Lightning/TreeNode.cpp | 50 ++++++++---- src/libslic3r/Fill/Lightning/TreeNode.hpp | 33 +++++--- src/libslic3r/Layer.hpp | 8 +- src/libslic3r/Point.hpp | 5 ++ src/libslic3r/Print.hpp | 9 ++- src/libslic3r/PrintConfig.cpp | 6 -- src/libslic3r/PrintConfig.hpp | 8 +- src/libslic3r/PrintObject.cpp | 18 ++++- 17 files changed, 265 insertions(+), 121 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index a3e4aee311..e6b8201885 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -11,6 +11,7 @@ #include "FillBase.hpp" #include "FillRectilinear.hpp" +#include "FillLightning.hpp" namespace Slic3r { @@ -318,7 +319,7 @@ void export_group_fills_to_svg(const char *path, const std::vector #endif // friend to Layer -void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree) +void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) { for (LayerRegion *layerm : m_regions) layerm->fills.clear(); @@ -348,6 +349,9 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: f->angle = surface_fill.params.angle; f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; + if (surface_fill.params.pattern == ipLightning) + dynamic_cast(f.get())->generator = lightning_generator; + // calculate flow spacing for infill pattern generation bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.bridge; double link_max_length = 0.; diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 7ca0699c0f..c4f8d6f08f 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -46,9 +46,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ipAdaptiveCubic: return new FillAdaptive::Filler(); case ipSupportCubic: return new FillAdaptive::Filler(); case ipSupportBase: return new FillSupportBase(); -#if HAS_LIGHTNING_INFILL case ipLightning: return new FillLightning::Filler(); -#endif // HAS_LIGHTNING_INFILL default: throw Slic3r::InvalidArgument("unknown type"); } } diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 7d868860a7..264ae8a599 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -406,13 +406,15 @@ public: // for the infill pattern, don't cut the corners. // default miterLimt = 3 //double miterLimit = 10.; - assert(aoffset1 < 0); + // FIXME: Resolve properly the cases when it is constructed with aoffset1 = 0 and aoffset2 = 0, + // that is used in sample_grid_pattern() for Lightning infill. + // assert(aoffset1 < 0); assert(aoffset2 <= 0); - assert(aoffset2 == 0 || aoffset2 < aoffset1); + // assert(aoffset2 == 0 || aoffset2 < aoffset1); // bool sticks_removed = remove_sticks(polygons_src); // if (sticks_removed) BOOST_LOG_TRIVIAL(error) << "Sticks removed!"; - polygons_outer = offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); + polygons_outer = aoffset1 == 0 ? polygons_src : offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); if (aoffset2 < 0) polygons_inner = shrink(polygons_outer, float(aoffset1 - aoffset2), ClipperLib::jtMiter, miterLimit); // Filter out contours with zero area or small area, contours with 2 points only. diff --git a/src/libslic3r/Fill/Lightning/DistanceField.cpp b/src/libslic3r/Fill/Lightning/DistanceField.cpp index 6df1d043ca..308ca41c60 100644 --- a/src/libslic3r/Fill/Lightning/DistanceField.cpp +++ b/src/libslic3r/Fill/Lightning/DistanceField.cpp @@ -10,27 +10,29 @@ namespace Slic3r::FillLightning constexpr coord_t radius_per_cell_size = 6; // The cell-size should be small compared to the radius, but not so small as to be inefficient. -DistanceField::DistanceField(const coord_t& radius, const Polygons& current_outline, const Polygons& current_overhang) : - m_cell_size(radius / radius_per_cell_size), - m_supporting_radius(radius) +DistanceField::DistanceField(const coord_t& radius, const Polygons& current_outline, const BoundingBox& current_outlines_bbox, const Polygons& current_overhang) : + m_cell_size(radius / radius_per_cell_size), + m_supporting_radius(radius), + m_unsupported_points_bbox(current_outlines_bbox) { - m_supporting_radius2 = double(radius) * double(radius); + m_supporting_radius2 = Slic3r::sqr(int64_t(radius)); // Sample source polygons with a regular grid sampling pattern. - for (const ExPolygon &expoly : union_ex(current_outline)) { + for (const ExPolygon &expoly : union_ex(current_overhang)) { for (const Point &p : sample_grid_pattern(expoly, m_cell_size)) { // Find a squared distance to the source expolygon boundary. double d2 = std::numeric_limits::max(); - for (size_t icontour = 0; icontour <= expoly.holes.size(); ++ icontour) { + for (size_t icontour = 0; icontour <= expoly.holes.size(); ++icontour) { const Polygon &contour = icontour == 0 ? expoly.contour : expoly.holes[icontour - 1]; if (contour.size() > 2) { Point prev = contour.points.back(); for (const Point &p2 : contour.points) { - d2 = std::min(d2, Line::distance_to_squared(p, prev, p2)); + d2 = std::min(d2, Line::distance_to_squared(p, prev, p2)); prev = p2; } } } m_unsupported_points.emplace_back(p, sqrt(d2)); + assert(m_unsupported_points_bbox.contains(p)); } } m_unsupported_points.sort([&radius](const UnsupportedCell &a, const UnsupportedCell &b) { @@ -41,8 +43,11 @@ DistanceField::DistanceField(const coord_t& radius, const Polygons& current_outl }); for (auto it = m_unsupported_points.begin(); it != m_unsupported_points.end(); ++it) { UnsupportedCell& cell = *it; - m_unsupported_points_grid.emplace(Point{ cell.loc.x() / m_cell_size, cell.loc.y() / m_cell_size }, it); + m_unsupported_points_grid.emplace(this->to_grid_point(cell.loc), it); } + // Because the distance between two points is at least one axis equal to m_cell_size, every cell + // in m_unsupported_points_grid contains exactly one point. + assert(m_unsupported_points.size() == m_unsupported_points_grid.size()); } void DistanceField::update(const Point& to_node, const Point& added_leaf) @@ -60,17 +65,24 @@ void DistanceField::update(const Point& to_node, const Point& added_leaf) grid.merge(to_node + iextent); grid.merge(added_leaf - iextent); grid.merge(added_leaf + iextent); - grid.min /= m_cell_size; - grid.max /= m_cell_size; + + // Clip grid by m_unsupported_points_bbox. Mainly to ensure that grid.min is a non-negative value. + grid.min.x() = std::max(grid.min.x(), m_unsupported_points_bbox.min.x()); + grid.min.y() = std::max(grid.min.y(), m_unsupported_points_bbox.min.y()); + grid.max.x() = std::min(grid.max.x(), m_unsupported_points_bbox.max.x()); + grid.max.y() = std::min(grid.max.y(), m_unsupported_points_bbox.max.y()); + + grid.min = this->to_grid_point(grid.min); + grid.max = this->to_grid_point(grid.max); } + Point grid_addr; Point grid_loc; - for (coord_t row = grid.min.y(); row <= grid.max.y(); ++ row) { - grid_loc.y() = row * m_cell_size; - for (coord_t col = grid.min.x(); col <= grid.max.y(); ++ col) { - grid_loc.x() = col * m_cell_size; + for (grid_addr.y() = grid.min.y(); grid_addr.y() <= grid.max.y(); ++grid_addr.y()) { + for (grid_addr.x() = grid.min.x(); grid_addr.x() <= grid.max.x(); ++grid_addr.x()) { + grid_loc = this->from_grid_point(grid_addr); // Test inside a circle at the new leaf. - if ((grid_loc - added_leaf).cast().squaredNorm() > m_supporting_radius2) { + if ((grid_loc - added_leaf).cast().squaredNorm() > m_supporting_radius2) { // Not inside a circle at the end of the new leaf. // Test inside a rotated rectangle. Vec2d vx = (grid_loc - to_node).cast(); @@ -84,10 +96,10 @@ void DistanceField::update(const Point& to_node, const Point& added_leaf) } // Inside a circle at the end of the new leaf, or inside a rotated rectangle. // Remove unsupported leafs at this grid location. - if (auto it = m_unsupported_points_grid.find(grid_loc); it != m_unsupported_points_grid.end()) { + if (auto it = m_unsupported_points_grid.find(grid_addr); it != m_unsupported_points_grid.end()) { std::list::iterator& list_it = it->second; UnsupportedCell& cell = *list_it; - if ((cell.loc - added_leaf).cast().squaredNorm() <= m_supporting_radius2) { + if ((cell.loc - added_leaf).cast().squaredNorm() <= m_supporting_radius2) { m_unsupported_points.erase(list_it); m_unsupported_points_grid.erase(it); } @@ -96,4 +108,25 @@ void DistanceField::update(const Point& to_node, const Point& added_leaf) } } +#if 0 +void DistanceField::update(const Point &to_node, const Point &added_leaf) +{ + const Point supporting_radius_point(m_supporting_radius, m_supporting_radius); + const BoundingBox grid(this->to_grid_point(added_leaf - supporting_radius_point), this->to_grid_point(added_leaf + supporting_radius_point)); + + for (coord_t grid_y = grid.min.y(); grid_y <= grid.max.y(); ++grid_y) { + for (coord_t grid_x = grid.min.x(); grid_x <= grid.max.x(); ++grid_x) { + if (auto it = m_unsupported_points_grid.find({grid_x, grid_y}); it != m_unsupported_points_grid.end()) { + std::list::iterator &list_it = it->second; + UnsupportedCell &cell = *list_it; + if ((cell.loc - added_leaf).cast().squaredNorm() <= m_supporting_radius2) { + m_unsupported_points.erase(list_it); + m_unsupported_points_grid.erase(it); + } + } + } + } +} +#endif + } // namespace Slic3r::FillLightning diff --git a/src/libslic3r/Fill/Lightning/DistanceField.hpp b/src/libslic3r/Fill/Lightning/DistanceField.hpp index 7fdce434ce..beb46c5c57 100644 --- a/src/libslic3r/Fill/Lightning/DistanceField.hpp +++ b/src/libslic3r/Fill/Lightning/DistanceField.hpp @@ -4,6 +4,7 @@ #ifndef LIGHTNING_DISTANCE_FIELD_H #define LIGHTNING_DISTANCE_FIELD_H +#include "../../BoundingBox.hpp" #include "../../Point.hpp" #include "../../Polygon.hpp" @@ -29,7 +30,7 @@ public: * \param current_overhang The overhang that needs to be supported on this * layer. */ - DistanceField(const coord_t& radius, const Polygons& current_outline, const Polygons& current_overhang); + DistanceField(const coord_t& radius, const Polygons& current_outline, const BoundingBox& current_outlines_bbox, const Polygons& current_overhang); /*! * Gets the next unsupported location to be supported by a new branch. @@ -69,14 +70,14 @@ protected: * branch of a tree. */ coord_t m_supporting_radius; - double m_supporting_radius2; + int64_t m_supporting_radius2; /*! * Represents a small discrete area of infill that needs to be supported. */ struct UnsupportedCell { - UnsupportedCell(Point loc, coord_t dist_to_boundary) : loc(loc), dist_to_boundary(dist_to_boundary) {} + UnsupportedCell(const Point &loc, coord_t dist_to_boundary) : loc(loc), dist_to_boundary(dist_to_boundary) {} // The position of the center of this cell. Point loc; // How far this cell is removed from the ``current_outline`` polygon, the edge of the infill area. @@ -88,11 +89,30 @@ protected: */ std::list m_unsupported_points; + /*! + * BoundingBox of all points in m_unsupported_points. Used for mapping of sign integer numbers to positive integer numbers. + */ + const BoundingBox m_unsupported_points_bbox; + /*! * Links the unsupported points to a grid point, so that we can quickly look * up the cell belonging to a certain position in the grid. */ std::unordered_map::iterator, PointHash> m_unsupported_points_grid; + + /*! + * Maps the point to the grid coordinates. + */ + Point to_grid_point(const Point &point) const { + return (point - m_unsupported_points_bbox.min) / m_cell_size; + } + + /*! + * Maps the point to the grid coordinates. + */ + Point from_grid_point(const Point &point) const { + return point * m_cell_size + m_unsupported_points_bbox.min; + } }; } // namespace Slic3r::FillLightning diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp index 87b593f89b..6a4a675cbe 100644 --- a/src/libslic3r/Fill/Lightning/Generator.cpp +++ b/src/libslic3r/Fill/Lightning/Generator.cpp @@ -35,17 +35,17 @@ Generator::Generator(const PrintObject &print_object) // const int infill_extruder = region_config.infill_extruder.value; const double default_infill_extrusion_width = Flow::auto_extrusion_width(FlowRole::frInfill, float(max_nozzle_diameter)); // Note: There's not going to be a layer below the first one, so the 'initial layer height' doesn't have to be taken into account. - const double layer_thickness = object_config.layer_height; + const double layer_thickness = scaled(object_config.layer_height.value); m_infill_extrusion_width = scaled(region_config.infill_extrusion_width.percent ? default_infill_extrusion_width * 0.01 * region_config.infill_extrusion_width : region_config.infill_extrusion_width); - m_supporting_radius = scaled(m_infill_extrusion_width * 0.001 / region_config.fill_density); + m_supporting_radius = coord_t(m_infill_extrusion_width) * 100 / coord_t(region_config.fill_density.value); - const double lightning_infill_overhang_angle = M_PI / 4; // 45 degrees - const double lightning_infill_prune_angle = M_PI / 4; // 45 degrees + const double lightning_infill_overhang_angle = M_PI / 4; // 45 degrees + const double lightning_infill_prune_angle = M_PI / 4; // 45 degrees const double lightning_infill_straightening_angle = M_PI / 4; // 45 degrees - m_wall_supporting_radius = layer_thickness * std::tan(lightning_infill_overhang_angle); - m_prune_length = layer_thickness * std::tan(lightning_infill_prune_angle); - m_straightening_max_distance = layer_thickness * std::tan(lightning_infill_straightening_angle); + m_wall_supporting_radius = coord_t(layer_thickness * std::tan(lightning_infill_overhang_angle)); + m_prune_length = coord_t(layer_thickness * std::tan(lightning_infill_prune_angle)); + m_straightening_max_distance = coord_t(layer_thickness * std::tan(lightning_infill_straightening_angle)); generateInitialInternalOverhangs(print_object); generateTrees(print_object); @@ -54,19 +54,20 @@ Generator::Generator(const PrintObject &print_object) void Generator::generateInitialInternalOverhangs(const PrintObject &print_object) { m_overhang_per_layer.resize(print_object.layers().size()); - const float infill_wall_offset = - m_infill_extrusion_width; + // FIXME: It can be adjusted to improve bonding between infill and perimeters. + const float infill_wall_offset = 0;// m_infill_extrusion_width; Polygons infill_area_above; //Iterate from top to bottom, to subtract the overhang areas above from the overhang areas on the layer below, to get only overhang in the top layer where it is overhanging. - for (int layer_nr = print_object.layers().size() - 1; layer_nr >= 0; layer_nr--) { + for (int layer_nr = int(print_object.layers().size()) - 1; layer_nr >= 0; layer_nr--) { Polygons infill_area_here; for (const LayerRegion* layerm : print_object.get_layer(layer_nr)->regions()) for (const Surface& surface : layerm->fill_surfaces.surfaces) if (surface.surface_type == stInternal) - append(infill_area_here, offset(surface.expolygon, infill_wall_offset)); + append(infill_area_here, infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset)); //Remove the part of the infill area that is already supported by the walls. - Polygons overhang = diff(offset(infill_area_here, -m_wall_supporting_radius), infill_area_above); + Polygons overhang = diff(offset(infill_area_here, -float(m_wall_supporting_radius)), infill_area_above); m_overhang_per_layer[layer_nr] = overhang; infill_area_above = std::move(infill_area_here); @@ -82,16 +83,17 @@ const Layer& Generator::getTreesForLayer(const size_t& layer_id) const void Generator::generateTrees(const PrintObject &print_object) { m_lightning_layers.resize(print_object.layers().size()); - const coord_t infill_wall_offset = - m_infill_extrusion_width; + // FIXME: It can be adjusted to improve bonding between infill and perimeters. + const coord_t infill_wall_offset = 0;// m_infill_extrusion_width; std::vector infill_outlines(print_object.layers().size(), Polygons()); // For-each layer from top to bottom: - for (int layer_id = print_object.layers().size() - 1; layer_id >= 0; layer_id--) + for (int layer_id = int(print_object.layers().size()) - 1; layer_id >= 0; layer_id--) for (const LayerRegion *layerm : print_object.get_layer(layer_id)->regions()) for (const Surface &surface : layerm->fill_surfaces.surfaces) if (surface.surface_type == stInternal) - append(infill_outlines[layer_id], offset(surface.expolygon, infill_wall_offset)); + append(infill_outlines[layer_id], infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset)); // For various operations its beneficial to quickly locate nearby features on the polygon: const size_t top_layer_id = print_object.layers().size() - 1; @@ -99,16 +101,16 @@ void Generator::generateTrees(const PrintObject &print_object) outlines_locator.create(infill_outlines[top_layer_id], locator_cell_size); // For-each layer from top to bottom: - for (int layer_id = top_layer_id; layer_id >= 0; layer_id--) - { - Layer& current_lightning_layer = m_lightning_layers[layer_id]; - Polygons& current_outlines = infill_outlines[layer_id]; + for (int layer_id = int(top_layer_id); layer_id >= 0; layer_id--) { + Layer ¤t_lightning_layer = m_lightning_layers[layer_id]; + const Polygons ¤t_outlines = infill_outlines[layer_id]; + const BoundingBox ¤t_outlines_bbox = get_extents(current_outlines); // register all trees propagated from the previous layer as to-be-reconnected std::vector to_be_reconnected_tree_roots = current_lightning_layer.tree_roots; - current_lightning_layer.generateNewTrees(m_overhang_per_layer[layer_id], current_outlines, outlines_locator, m_supporting_radius, m_wall_supporting_radius); - current_lightning_layer.reconnectRoots(to_be_reconnected_tree_roots, current_outlines, outlines_locator, m_supporting_radius, m_wall_supporting_radius); + current_lightning_layer.generateNewTrees(m_overhang_per_layer[layer_id], current_outlines, current_outlines_bbox, outlines_locator, m_supporting_radius, m_wall_supporting_radius); + current_lightning_layer.reconnectRoots(to_be_reconnected_tree_roots, current_outlines, current_outlines_bbox, outlines_locator, m_supporting_radius, m_wall_supporting_radius); // Initialize trees for next lower layer from the current one. if (layer_id == 0) diff --git a/src/libslic3r/Fill/Lightning/Generator.hpp b/src/libslic3r/Fill/Lightning/Generator.hpp index c44ecfe7a2..b538c4dbe2 100644 --- a/src/libslic3r/Fill/Lightning/Generator.hpp +++ b/src/libslic3r/Fill/Lightning/Generator.hpp @@ -45,7 +45,7 @@ public: * already be calculated at this point. * \param mesh The mesh to generate infill for. */ - Generator(const PrintObject &print_object); + explicit Generator(const PrintObject &print_object); /*! * Get a tree of paths generated for a certain layer of the mesh. diff --git a/src/libslic3r/Fill/Lightning/Layer.cpp b/src/libslic3r/Fill/Lightning/Layer.cpp index 1b3936e340..1e1127a792 100644 --- a/src/libslic3r/Fill/Lightning/Layer.cpp +++ b/src/libslic3r/Fill/Lightning/Layer.cpp @@ -3,12 +3,11 @@ #include "Layer.hpp" //The class we're implementing. -#include // advance - #include "DistanceField.hpp" #include "TreeNode.hpp" #include "../../Geometry.hpp" +#include "Utils.hpp" namespace Slic3r::FillLightning { @@ -23,10 +22,15 @@ Point GroundingLocation::p() const return tree_node ? tree_node->getLocation() : *boundary_location; } -void Layer::fillLocator(SparseNodeGrid &tree_node_locator) +inline static Point to_grid_point(const Point &point, const BoundingBox &bbox) { - std::function add_node_to_locator_func = [&tree_node_locator](NodeSPtr node) { - tree_node_locator.insert(std::make_pair(Point(node->getLocation().x() / locator_cell_size, node->getLocation().y() / locator_cell_size), node)); + return (point - bbox.min) / locator_cell_size; +} + +void Layer::fillLocator(SparseNodeGrid &tree_node_locator, const BoundingBox& current_outlines_bbox) +{ + std::function add_node_to_locator_func = [&tree_node_locator, ¤t_outlines_bbox](const NodeSPtr &node) { + tree_node_locator.insert(std::make_pair(to_grid_point(node->getLocation(), current_outlines_bbox), node)); }; for (auto& tree : tree_roots) tree->visitNodes(add_node_to_locator_func); @@ -36,38 +40,46 @@ void Layer::generateNewTrees ( const Polygons& current_overhang, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outlines_locator, const coord_t supporting_radius, const coord_t wall_supporting_radius ) { - DistanceField distance_field(supporting_radius, current_outlines, current_overhang); + DistanceField distance_field(supporting_radius, current_outlines, current_outlines_bbox, current_overhang); SparseNodeGrid tree_node_locator; - fillLocator(tree_node_locator); + fillLocator(tree_node_locator, current_outlines_bbox); // Until no more points need to be added to support all: // Determine next point from tree/outline areas via distance-field Point unsupported_location; while (distance_field.tryGetNextPoint(&unsupported_location)) { GroundingLocation grounding_loc = getBestGroundingLocation( - unsupported_location, current_outlines, outlines_locator, supporting_radius, wall_supporting_radius, tree_node_locator); + unsupported_location, current_outlines, current_outlines_bbox, outlines_locator, supporting_radius, wall_supporting_radius, tree_node_locator); NodeSPtr new_parent; NodeSPtr new_child; this->attach(unsupported_location, grounding_loc, new_child, new_parent); - tree_node_locator.insert(std::make_pair(Point(new_child->getLocation().x() / locator_cell_size, new_child->getLocation().y() / locator_cell_size), new_child)); + tree_node_locator.insert(std::make_pair(to_grid_point(new_child->getLocation(), current_outlines_bbox), new_child)); if (new_parent) - tree_node_locator.insert(std::make_pair(Point(new_parent->getLocation().x() / locator_cell_size, new_parent->getLocation().y() / locator_cell_size), new_parent)); + tree_node_locator.insert(std::make_pair(to_grid_point(new_parent->getLocation(), current_outlines_bbox), new_parent)); // update distance field distance_field.update(grounding_loc.p(), unsupported_location); } + +#ifdef LIGHTNING_TREE_NODE_DEBUG_OUTPUT + { + static int iRun = 0; + export_to_svg(debug_out_path("FillLightning-TreeNodes-%d.svg", iRun++), current_outlines, this->tree_roots); + } +#endif /* LIGHTNING_TREE_NODE_DEBUG_OUTPUT */ } -static bool polygonCollidesWithLineSegment(const Point from, const Point to, const EdgeGrid::Grid &loc_to_line) +static bool polygonCollidesWithLineSegment(const Point &from, const Point &to, const EdgeGrid::Grid &loc_to_line) { struct Visitor { - explicit Visitor(const EdgeGrid::Grid &grid) : grid(grid) {} + explicit Visitor(const EdgeGrid::Grid &grid, const Line &line) : grid(grid), line(line) {} bool operator()(coord_t iy, coord_t ix) { // Called with a row and colum of the grid cell, which is intersected by a line. @@ -87,7 +99,7 @@ static bool polygonCollidesWithLineSegment(const Point from, const Point to, con const EdgeGrid::Grid& grid; Line line; bool intersect = false; - } visitor(loc_to_line); + } visitor(loc_to_line, {from, to}); loc_to_line.visit_cells_intersecting_line(from, to, visitor); return visitor.intersect; @@ -97,6 +109,7 @@ GroundingLocation Layer::getBestGroundingLocation ( const Point& unsupported_location, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outline_locator, const coord_t supporting_radius, const coord_t wall_supporting_radius, @@ -128,8 +141,8 @@ GroundingLocation Layer::getBestGroundingLocation if (current_dist >= wall_supporting_radius) { // Only reconnect tree roots to other trees if they are not already close to the outlines. const coord_t search_radius = std::min(current_dist, within_dist); BoundingBox region(unsupported_location - Point(search_radius, search_radius), unsupported_location + Point(search_radius + locator_cell_size, search_radius + locator_cell_size)); - region.min /= locator_cell_size; - region.max /= locator_cell_size; + region.min = to_grid_point(region.min, current_outlines_bbox); + region.max = to_grid_point(region.max, current_outlines_bbox); Point grid_addr; for (grid_addr.y() = region.min.y(); grid_addr.y() < region.max.y(); ++ grid_addr.y()) for (grid_addr.x() = region.min.x(); grid_addr.x() < region.max.x(); ++ grid_addr.x()) { @@ -176,6 +189,7 @@ void Layer::reconnectRoots ( std::vector& to_be_reconnected_tree_roots, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outline_locator, const coord_t supporting_radius, const coord_t wall_supporting_radius @@ -184,10 +198,10 @@ void Layer::reconnectRoots constexpr coord_t tree_connecting_ignore_offset = 100; SparseNodeGrid tree_node_locator; - fillLocator(tree_node_locator); + fillLocator(tree_node_locator, current_outlines_bbox); const coord_t within_max_dist = outline_locator.resolution() * 2; - for (auto root_ptr : to_be_reconnected_tree_roots) + for (const auto &root_ptr : to_be_reconnected_tree_roots) { auto old_root_it = std::find(tree_roots.begin(), tree_roots.end(), root_ptr); @@ -203,7 +217,7 @@ void Layer::reconnectRoots root_ptr->addChild(new_root); new_root->reroot(); - tree_node_locator.insert(std::make_pair(Point(new_root->getLocation().x() / locator_cell_size, new_root->getLocation().y() / locator_cell_size), new_root)); + tree_node_locator.insert(std::make_pair(to_grid_point(new_root->getLocation(), current_outlines_bbox), new_root)); *old_root_it = std::move(new_root); // replace old root with new root continue; @@ -217,6 +231,7 @@ void Layer::reconnectRoots ( root_ptr->getLocation(), current_outlines, + current_outlines_bbox, outline_locator, supporting_radius, tree_connecting_ignore_width, @@ -233,7 +248,7 @@ void Layer::reconnectRoots attach_ptr->reroot(); new_root->addChild(attach_ptr); - tree_node_locator.insert(std::make_pair(new_root->getLocation(), new_root)); + tree_node_locator.insert(std::make_pair(to_grid_point(new_root->getLocation(), current_outlines_bbox), new_root)); *old_root_it = std::move(new_root); // replace old root with new root } @@ -256,15 +271,25 @@ void Layer::reconnectRoots } } -/* - * Implementation assumes moving inside, but moving outside should just as well be possible. +/*! + * Moves the point \p from onto the nearest polygon or leaves the point as-is, when the comb boundary is not within the root of \p max_dist2 distance. + * Given a \p distance more than zero, the point will end up inside, and conversely outside. + * When the point is already in/outside by more than \p distance, \p from is unaltered, but the polygon is returned. + * When the point is in/outside by less than \p distance, \p from is moved to the correct place. + * Implementation assumes moving inside, but moving outside should just as well be possible. + * + * \param polygons The polygons onto which to move the point + * \param from[in,out] The point to move. + * \param distance The distance by which to move the point. + * \param max_dist2 The squared maximal allowed distance from the point to the nearest polygon. + * \return The index to the polygon onto which we have moved the point. */ static unsigned int moveInside(const Polygons& polygons, Point& from, int distance, int64_t maxDist2) { - Point ret = from; - int64_t bestDist2 = std::numeric_limits::max(); - unsigned int bestPoly = static_cast(-1); - bool is_already_on_correct_side_of_boundary = false; // whether [from] is already on the right side of the boundary + Point ret = from; + int64_t bestDist2 = std::numeric_limits::max(); + auto bestPoly = static_cast(-1); + bool is_already_on_correct_side_of_boundary = false; // whether [from] is already on the right side of the boundary for (unsigned int poly_idx = 0; poly_idx < polygons.size(); poly_idx++) { const Polygon &poly = polygons[poly_idx]; @@ -333,7 +358,7 @@ static unsigned int moveInside(const Polygons& polygons, Point& from, int distan else { // x is projected to a point properly on the line segment (not onto a vertex). The case which looks like | . projected_p_beyond_prev_segment = false; - Point x = a + ab * dot_prod / ab_length2; + Point x = (a.cast() + ab.cast() * dot_prod / ab_length2).cast(); int64_t dist2 = (p - x).cast().squaredNorm(); if (dist2 < bestDist2) diff --git a/src/libslic3r/Fill/Lightning/Layer.hpp b/src/libslic3r/Fill/Lightning/Layer.hpp index 853c634f27..cc79c15b51 100644 --- a/src/libslic3r/Fill/Lightning/Layer.hpp +++ b/src/libslic3r/Fill/Lightning/Layer.hpp @@ -41,9 +41,10 @@ public: ( const Polygons& current_overhang, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outline_locator, - const coord_t supporting_radius, - const coord_t wall_supporting_radius + coord_t supporting_radius, + coord_t wall_supporting_radius ); /*! Determine & connect to connection point in tree/outline. @@ -53,9 +54,10 @@ public: ( const Point& unsupported_location, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outline_locator, - const coord_t supporting_radius, - const coord_t wall_supporting_radius, + coord_t supporting_radius, + coord_t wall_supporting_radius, const SparseNodeGrid& tree_node_locator, const NodeSPtr& exclude_tree = nullptr ); @@ -71,16 +73,17 @@ public: ( std::vector& to_be_reconnected_tree_roots, const Polygons& current_outlines, + const BoundingBox& current_outlines_bbox, const EdgeGrid::Grid& outline_locator, - const coord_t supporting_radius, - const coord_t wall_supporting_radius + coord_t supporting_radius, + coord_t wall_supporting_radius ); - Polylines convertToLines(const Polygons& limit_to_outline, const coord_t line_width) const; + Polylines convertToLines(const Polygons& limit_to_outline, coord_t line_width) const; coord_t getWeightedDistance(const Point& boundary_loc, const Point& unsupported_location); - void fillLocator(SparseNodeGrid& tree_node_locator); + void fillLocator(SparseNodeGrid& tree_node_locator, const BoundingBox& current_outlines_bbox); }; } // namespace Slic3r::FillLightning diff --git a/src/libslic3r/Fill/Lightning/TreeNode.cpp b/src/libslic3r/Fill/Lightning/TreeNode.cpp index 8ab11bd6d4..b36a66dbb7 100644 --- a/src/libslic3r/Fill/Lightning/TreeNode.cpp +++ b/src/libslic3r/Fill/Lightning/TreeNode.cpp @@ -4,7 +4,6 @@ #include "TreeNode.hpp" #include "../../Geometry.hpp" -#include "../../ClipperUtils.hpp" namespace Slic3r::FillLightning { @@ -107,7 +106,7 @@ NodeSPtr Node::deepCopy() const return local_root; } -void Node::reroot(NodeSPtr new_parent /*= nullptr*/) +void Node::reroot(const NodeSPtr &new_parent) { if (! m_is_root) { auto old_parent = m_parent.lock(); @@ -142,7 +141,7 @@ NodeSPtr Node::closestNode(const Point& loc) return result; } -bool inside(const Polygons &polygons, const Point p) +bool inside(const Polygons &polygons, const Point &p) { int poly_count_inside = 0; for (const Polygon &poly : polygons) { @@ -181,7 +180,7 @@ bool lineSegmentPolygonsIntersection(const Point& a, const Point& b, const EdgeG } visitor { outline_locator, a.cast(), b.cast() }; outline_locator.visit_cells_intersecting_line(a, b, visitor); - return visitor.d2min < within_max_dist * within_max_dist; + return visitor.d2min < double(within_max_dist) * double(within_max_dist); } bool Node::realign(const Polygons& outlines, const EdgeGrid::Grid& outline_locator, std::vector& rerooted_parts) @@ -226,14 +225,14 @@ bool Node::realign(const Polygons& outlines, const EdgeGrid::Grid& outline_locat void Node::straighten(const coord_t magnitude, const coord_t max_remove_colinear_dist) { - straighten(magnitude, m_p, 0, max_remove_colinear_dist * max_remove_colinear_dist); + straighten(magnitude, m_p, 0, int64_t(max_remove_colinear_dist) * int64_t(max_remove_colinear_dist)); } Node::RectilinearJunction Node::straighten( const coord_t magnitude, const Point& junction_above, const coord_t accumulated_dist, - const coord_t max_remove_colinear_dist2) + const int64_t max_remove_colinear_dist2) { constexpr coord_t junction_magnitude_factor_numerator = 3; constexpr coord_t junction_magnitude_factor_denominator = 4; @@ -245,13 +244,13 @@ Node::RectilinearJunction Node::straighten( auto child_dist = coord_t((m_p - child_p->m_p).cast().norm()); RectilinearJunction junction_below = child_p->straighten(magnitude, junction_above, accumulated_dist + child_dist, max_remove_colinear_dist2); coord_t total_dist_to_junction_below = junction_below.total_recti_dist; - Point a = junction_above; - Point b = junction_below.junction_loc; + const Point& a = junction_above; + Point b = junction_below.junction_loc; if (a != b) // should always be true! { Point ab = b - a; - Point destination = a + ab * accumulated_dist / std::max(coord_t(1), total_dist_to_junction_below); - if ((destination - m_p).cast().squaredNorm() <= magnitude * magnitude) + Point destination = (a.cast() + ab.cast() * int64_t(accumulated_dist) / std::max(int64_t(1), int64_t(total_dist_to_junction_below))).cast(); + if ((destination - m_p).cast().squaredNorm() <= int64_t(magnitude) * int64_t(magnitude)) m_p = destination; else m_p += ((destination - m_p).cast().normalized() * magnitude).cast(); @@ -262,7 +261,7 @@ Node::RectilinearJunction Node::straighten( child_p = m_children.front(); //recursive call to straighten might have removed the child const NodeSPtr& parent_node = m_parent.lock(); if (parent_node && - (child_p->m_p - parent_node->m_p).cast().squaredNorm() < max_remove_colinear_dist2 && + (child_p->m_p - parent_node->m_p).cast().squaredNorm() < max_remove_colinear_dist2 && Line::distance_to_squared(m_p, parent_node->m_p, child_p->m_p) < close_enough * close_enough) { child_p->m_parent = m_parent; for (auto& sibling : parent_node->m_children) @@ -347,7 +346,7 @@ coord_t Node::prune(const coord_t& pruning_distance) void Node::convertToPolylines(Polygons& output, const coord_t line_width) const { Polygons result; - output.emplace_back(); + result.emplace_back(); convertToPolylines(0, result); removeJunctionOverlap(result, line_width); append(output, std::move(result)); @@ -386,7 +385,7 @@ void Node::removeJunctionOverlap(Polygons& result_lines, const coord_t line_widt coord_t to_be_reduced = reduction; Point a = polyline.back(); - for (int point_idx = polyline.size() - 2; point_idx >= 0; point_idx--) { + for (int point_idx = int(polyline.size()) - 2; point_idx >= 0; point_idx--) { const Point b = polyline[point_idx]; const Point ab = b - a; const auto ab_len = coord_t(ab.cast().norm()); @@ -408,4 +407,29 @@ void Node::removeJunctionOverlap(Polygons& result_lines, const coord_t line_widt } } +#ifdef LIGHTNING_TREE_NODE_DEBUG_OUTPUT +void export_to_svg(const NodeSPtr &root_node, SVG &svg) +{ + for (const NodeSPtr &children : root_node->m_children) { + svg.draw(Line(root_node->getLocation(), children->getLocation()), "red"); + export_to_svg(children, svg); + } +} + +void export_to_svg(const std::string &path, const Polygons &contour, const std::vector &root_nodes) { + BoundingBox bbox = get_extents(contour); + + bbox.offset(SCALED_EPSILON); + SVG svg(path, bbox); + svg.draw_outline(contour, "blue"); + + for (const NodeSPtr &root_node: root_nodes) { + for (const NodeSPtr &children: root_node->m_children) { + svg.draw(Line(root_node->getLocation(), children->getLocation()), "red"); + export_to_svg(children, svg); + } + } +} +#endif /* LIGHTNING_TREE_NODE_DEBUG_OUTPUT */ + } // namespace Slic3r::FillLightning diff --git a/src/libslic3r/Fill/Lightning/TreeNode.hpp b/src/libslic3r/Fill/Lightning/TreeNode.hpp index bc2e76dc2f..55ef35e0a8 100644 --- a/src/libslic3r/Fill/Lightning/TreeNode.hpp +++ b/src/libslic3r/Fill/Lightning/TreeNode.hpp @@ -11,6 +11,9 @@ #include "../../EdgeGrid.hpp" #include "../../Polygon.hpp" +#include "SVG.hpp" + +//#define LIGHTNING_TREE_NODE_DEBUG_OUTPUT namespace Slic3r::FillLightning { @@ -99,9 +102,9 @@ public: std::vector& next_trees, const Polygons& next_outlines, const EdgeGrid::Grid& outline_locator, - const coord_t prune_distance, - const coord_t smooth_magnitude, - const coord_t max_remove_colinear_dist + coord_t prune_distance, + coord_t smooth_magnitude, + coord_t max_remove_colinear_dist ) const; /*! @@ -156,7 +159,7 @@ public: * This is then recursively bubbled up until it reaches the (former) root, which then will become a leaf. * \param new_parent The (new) parent-node of the root, useful for recursing or immediately attaching the node to another tree. */ - void reroot(NodeSPtr new_parent = nullptr); + void reroot(const NodeSPtr &new_parent = nullptr); /*! * Retrieves the closest node to the specified location. @@ -211,7 +214,7 @@ protected: * \param magnitude The maximum allowed distance to move the node. * \param max_remove_colinear_dist Maximum distance of the (compound) line-segment from which a co-linear point may be removed. */ - void straighten(const coord_t magnitude, const coord_t max_remove_colinear_dist); + void straighten(coord_t magnitude, coord_t max_remove_colinear_dist); /*! Recursive part of \ref straighten(.) * \param junction_above The last seen junction with multiple children above @@ -219,7 +222,7 @@ protected: * \param max_remove_colinear_dist2 Maximum distance _squared_ of the (compound) line-segment from which a co-linear point may be removed. * \return the total distance along the tree from the last junction above to the first next junction below and the location of the next junction below */ - RectilinearJunction straighten(const coord_t magnitude, const Point& junction_above, const coord_t accumulated_dist, const coord_t max_remove_colinear_dist2); + RectilinearJunction straighten(coord_t magnitude, const Point& junction_above, coord_t accumulated_dist, int64_t max_remove_colinear_dist2); /*! Prune the tree from the extremeties (leaf-nodes) until the pruning distance is reached. * \return The distance that has been pruned. If less than \p distance, then the whole tree was puned away. @@ -236,7 +239,7 @@ public: * * \param output all branches in this tree connected into polylines */ - void convertToPolylines(Polygons& output, const coord_t line_width) const; + void convertToPolylines(Polygons& output, coord_t line_width) const; /*! If this was ever a direct child of the root, it'll have a previous grounding location. * @@ -257,7 +260,7 @@ protected: */ void convertToPolylines(size_t long_line_idx, Polygons& output) const; - void removeJunctionOverlap(Polygons& polylines, const coord_t line_width) const; + void removeJunctionOverlap(Polygons& polylines, coord_t line_width) const; bool m_is_root; Point m_p; @@ -265,10 +268,20 @@ protected: std::vector m_children; std::optional m_last_grounding_location; // &root_nodes); +#endif /* LIGHTNING_TREE_NODE_DEBUG_OUTPUT */ }; -bool inside(const Polygons &polygons, const Point p); -bool lineSegmentPolygonsIntersection(const Point& a, const Point& b, const EdgeGrid::Grid& outline_locator, Point& result, const coord_t within_max_dist); +bool inside(const Polygons &polygons, const Point &p); +bool lineSegmentPolygonsIntersection(const Point& a, const Point& b, const EdgeGrid::Grid& outline_locator, Point& result, coord_t within_max_dist); + +#ifdef LIGHTNING_TREE_NODE_DEBUG_OUTPUT +void export_to_svg(const NodeSPtr &root_node, SVG &svg); +void export_to_svg(const std::string &path, const Polygons &contour, const std::vector &root_nodes); +#endif /* LIGHTNING_TREE_NODE_DEBUG_OUTPUT */ } // namespace Slic3r::FillLightning diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 0071c7f6e1..a308ac0b62 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -20,6 +20,10 @@ namespace FillAdaptive { struct Octree; }; +namespace FillLightning { + class Generator; +}; + class LayerRegion { public: @@ -151,8 +155,8 @@ public: } void make_perimeters(); // Phony version of make_fills() without parameters for Perl integration only. - void make_fills() { this->make_fills(nullptr, nullptr); } - void make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree); + void make_fills() { this->make_fills(nullptr, nullptr, nullptr); } + void make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator); void make_ironing(); void export_region_slices_to_svg(const char *path) const; diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index e5dc334f59..6b430c2fef 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -177,6 +177,11 @@ inline bool operator<(const Point &l, const Point &r) return l.x() < r.x() || (l.x() == r.x() && l.y() < r.y()); } +inline Point operator* (const Point& l, const double &r) +{ + return {coord_t(l.x() * r), coord_t(l.y() * r)}; +} + inline bool is_approx(const Point &p1, const Point &p2, coord_t epsilon = coord_t(SCALED_EPSILON)) { Point d = (p2 - p1).cwiseAbs(); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index c5e312a2bf..d99e24ca70 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -35,7 +35,13 @@ namespace FillAdaptive { struct Octree; struct OctreeDeleter; using OctreePtr = std::unique_ptr; -}; +}; // namespace FillAdaptive + +namespace FillLightning { + class Generator; + struct GeneratorDeleter; + using GeneratorPtr = std::unique_ptr; +}; // namespace FillLightning // Print step IDs for keeping track of the print state. // The Print steps are applied in this order. @@ -387,6 +393,7 @@ private: void combine_infill(); void _generate_support_material(); std::pair prepare_adaptive_infill_data(); + FillLightning::GeneratorPtr prepare_lightning_infill_data(); // XYZ in scaled coordinates Vec3crd m_size; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 5a674da846..b21ed56318 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -108,9 +108,7 @@ static const t_config_enum_values s_keys_map_InfillPattern { { "octagramspiral", ipOctagramSpiral }, { "adaptivecubic", ipAdaptiveCubic }, { "supportcubic", ipSupportCubic }, -#if HAS_LIGHTNING_INFILL { "lightning", ipLightning } -#endif // HAS_LIGHTNING_INFILL }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(InfillPattern) @@ -1155,9 +1153,7 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("octagramspiral"); def->enum_values.push_back("adaptivecubic"); def->enum_values.push_back("supportcubic"); -#if HAS_LIGHTNING_INFILL def->enum_values.push_back("lightning"); -#endif // HAS_LIGHTNING_INFILL def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Aligned Rectilinear")); def->enum_labels.push_back(L("Grid")); @@ -1174,9 +1170,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back(L("Octagram Spiral")); def->enum_labels.push_back(L("Adaptive Cubic")); def->enum_labels.push_back(L("Support Cubic")); -#if HAS_LIGHTNING_INFILL def->enum_labels.push_back(L("Lightning")); -#endif // HAS_LIGHTNING_INFILL def->set_default_value(new ConfigOptionEnum(ipStars)); def = this->add("first_layer_acceleration", coFloat); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b97168e84e..950816fa91 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -57,14 +57,10 @@ enum class FuzzySkinType { All, }; -#define HAS_LIGHTNING_INFILL 0 - enum InfillPattern : int { ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, - ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase, -#if HAS_LIGHTNING_INFILL - ipLightning, -#endif // HAS_LIGHTNING_INFILL + ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase, + ipLightning, ipCount, }; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 31d948db9d..9c6178f8b5 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -14,6 +14,7 @@ #include "TriangleMeshSlicer.hpp" #include "Utils.hpp" #include "Fill/FillAdaptive.hpp" +#include "Fill/FillLightning.hpp" #include "Format/STL.hpp" #include @@ -353,14 +354,15 @@ void PrintObject::infill() if (this->set_started(posInfill)) { auto [adaptive_fill_octree, support_fill_octree] = this->prepare_adaptive_infill_data(); + auto lightning_generator = this->prepare_lightning_infill_data(); BOOST_LOG_TRIVIAL(debug) << "Filling layers in parallel - start"; tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree](const tbb::blocked_range& range) { + [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree, &lightning_generator](const tbb::blocked_range& range) { for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { m_print->throw_if_canceled(); - m_layers[layer_idx]->make_fills(adaptive_fill_octree.get(), support_fill_octree.get()); + m_layers[layer_idx]->make_fills(adaptive_fill_octree.get(), support_fill_octree.get(), lightning_generator.get()); } } ); @@ -453,6 +455,18 @@ std::pair PrintObject::prepare support_line_spacing ? build_octree(mesh, overhangs.front(), support_line_spacing, true) : OctreePtr()); } +FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() +{ + bool has_lightning_infill = false; + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) + if (const PrintRegionConfig &config = this->printing_region(region_id).config(); config.fill_density > 0 && config.fill_pattern == ipLightning) { + has_lightning_infill = true; + break; + } + + return has_lightning_infill ? FillLightning::build_generator(std::as_const(*this)) : FillLightning::GeneratorPtr(); +} + void PrintObject::clear_layers() { for (Layer *l : m_layers) From 5de93c87843a8f5354077fb2a0424f3dab75a55b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 28 Feb 2022 10:53:39 +0100 Subject: [PATCH 116/149] Fixed incorrect handling of 3rd party 3MFs in SLA mode (#6100 and others) --- src/libslic3r/SLAPrint.cpp | 9 ++++++--- src/slic3r/GUI/GLCanvas3D.cpp | 8 +++++++- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 12 +++++++----- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 13 ++++++------- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 2 +- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 72cb96dd04..81ce0d6cb0 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1174,7 +1174,8 @@ sla::SupportPoints SLAPrintObject::transformed_support_points() const { assert(m_model_object != nullptr); auto spts = m_model_object->sla_support_points; - auto tr = trafo().cast(); + const Transform3d& vol_trafo = m_model_object->volumes.front()->get_transformation().get_matrix(); + const Transform3f& tr = (trafo() * vol_trafo).cast(); for (sla::SupportPoint& suppt : spts) { suppt.pos = tr * suppt.pos; } @@ -1186,8 +1187,10 @@ sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const { assert(m_model_object != nullptr); auto pts = m_model_object->sla_drain_holes; - auto tr = trafo().cast(); - auto sc = m_model_object->instances.front()->get_scaling_factor().cast(); + const Transform3d& vol_trafo = m_model_object->volumes.front()->get_transformation().get_matrix(); + const Geometry::Transformation trans(trafo() * vol_trafo); + const Transform3f& tr = trans.get_matrix().cast(); + const Vec3f sc = trans.get_scaling_factor().cast(); for (sla::DrainHole &hl : pts) { hl.pos = tr * hl.pos; hl.normal = tr * hl.normal - tr.translation(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ea08f98711..91add7c567 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2232,7 +2232,13 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (state.step[istep].state == PrintStateBase::DONE) { TriangleMesh mesh = print_object->get_mesh(slaposDrillHoles); assert(! mesh.empty()); - mesh.transform(sla_print->sla_trafo(*m_model->objects[volume.object_idx()]).inverse()); + + // sla_trafo does not contain volume trafo. To get a mesh to create + // a new volume from, we have to apply vol trafo inverse separately. + const ModelObject& mo = *m_model->objects[volume.object_idx()]; + Transform3d trafo = sla_print->sla_trafo(mo) + * mo.volumes.front()->get_transformation().get_matrix(); + mesh.transform(trafo.inverse()); #if ENABLE_SMOOTH_NORMALS #if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(mesh, true); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index ebf8aa21b5..e979297df7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -122,9 +122,11 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) #endif // ENABLE_LEGACY_OPENGL_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + Geometry::Transformation trafo = vol->get_instance_transformation() * vol->get_volume_transformation(); + #if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); - const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); + const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * trafo.get_matrix(); const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); @@ -132,8 +134,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) shader->set_uniform("projection_matrix", projection_matrix); #else - const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); - const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); + const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse(); + const Transform3d& instance_matrix = trafo.get_matrix(); glsafe(::glPushMatrix()); glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); @@ -222,7 +224,7 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const auto sel_info = m_c->selection_info(); int active_inst = m_c->selection_info()->get_active_instance(); const ModelInstance* mi = sel_info->model_object()->instances[active_inst]; - const Transform3d& trafo = mi->get_transformation().get_matrix(); + const Transform3d& trafo = mi->get_transformation().get_matrix() * sel_info->model_object()->volumes.front()->get_matrix(); Vec3d transformed_point = trafo * point; transformed_point(2) += sel_info->get_sla_shift(); @@ -241,7 +243,7 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairget_camera(); const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = volume->get_instance_transformation(); + Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_transformation(); trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); double clp_dist = m_c->object_clipper()->get_position(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 3173cb10dd..e8c2055f63 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -151,18 +151,17 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) #endif // ENABLE_LEGACY_OPENGL_REMOVAL const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix()); + const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); #if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); - const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); const Transform3d& projection_matrix = camera.get_projection_matrix(); shader->set_uniform("projection_matrix", projection_matrix); #else - const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); - + const Transform3d& instance_matrix = transformation.get_matrix(); const float z_shift = m_c->selection_info()->get_sla_shift(); glsafe(::glPushMatrix()); glsafe(::glTranslated(0.0, 0.0, z_shift)); @@ -344,7 +343,7 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const auto sel_info = m_c->selection_info(); int active_inst = m_c->selection_info()->get_active_instance(); const ModelInstance* mi = sel_info->model_object()->instances[active_inst]; - const Transform3d& trafo = mi->get_transformation().get_matrix(); + const Transform3d& trafo = mi->get_transformation().get_matrix() * sel_info->model_object()->volumes.front()->get_matrix(); Vec3d transformed_point = trafo * point; transformed_point(2) += sel_info->get_sla_shift(); @@ -363,7 +362,7 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairget_camera(); const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - Geometry::Transformation trafo = volume->get_instance_transformation(); + Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_transformation(); trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift())); double clp_dist = m_c->object_clipper()->get_position(); @@ -1238,7 +1237,7 @@ void GLGizmoSlaSupports::get_data_from_backend() if (po->model_object()->id() == mo->id()) { m_normal_cache.clear(); const std::vector& points = po->get_support_points(); - auto mat = po->trafo().inverse().cast(); + auto mat = (po->trafo() * po->model_object()->volumes.front()->get_transformation().get_matrix()).inverse().cast(); for (unsigned int i=0; iget_mesh_to_slice(); if (! backend_mesh.empty()) { m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh)); - Transform3d trafo_inv = canvas->sla_print()->sla_trafo(*mo).inverse(); + Transform3d trafo_inv = (canvas->sla_print()->sla_trafo(*mo) * print_object->model_object()->volumes.front()->get_transformation().get_matrix()).inverse(); m_hollowed_mesh_transformed->transform(trafo_inv); m_drainholes = print_object->model_object()->sla_drain_holes; m_old_hollowing_timestamp = timestamp; From ff2b8da8dc731854b9bceca15c71ee72054b4333 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 17 Mar 2022 11:39:58 +0100 Subject: [PATCH 117/149] Fixed crash when pressing 'Reset rotation' button while editing SLA support points (mentioned in #7359) --- src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index 42bb0e58c6..f1156f9377 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -251,7 +251,7 @@ void HollowedMesh::on_update() const GLCanvas3D* canvas = get_pool()->get_canvas(); const PrintObjects& print_objects = canvas->sla_print()->objects(); - const SLAPrintObject* print_object = m_print_object_idx != -1 + const SLAPrintObject* print_object = (m_print_object_idx >= 0 && m_print_object_idx < int(print_objects.size())) ? print_objects[m_print_object_idx] : nullptr; @@ -474,7 +474,7 @@ void SupportsClipper::on_update() const GLCanvas3D* canvas = get_pool()->get_canvas(); const PrintObjects& print_objects = canvas->sla_print()->objects(); - const SLAPrintObject* print_object = m_print_object_idx != -1 + const SLAPrintObject* print_object = (m_print_object_idx >= 0 && m_print_object_idx < int(print_objects.size())) ? print_objects[m_print_object_idx] : nullptr; From dfd6ca899a37fabd2ed8f6ed526fd8e60575e01a Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 17 Mar 2022 13:41:08 +0100 Subject: [PATCH 118/149] Sync with PrusaSlicer-settings --- resources/profiles/Ultimaker.idx | 1 + resources/profiles/Ultimaker.ini | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Ultimaker.idx b/resources/profiles/Ultimaker.idx index a593d2fb4b..8e119931c1 100644 --- a/resources/profiles/Ultimaker.idx +++ b/resources/profiles/Ultimaker.idx @@ -1,2 +1,3 @@ min_slic3r_version = 2.4.0-beta0 +1.0.1 Updated start g-code. 1.0.0 Initial version diff --git a/resources/profiles/Ultimaker.ini b/resources/profiles/Ultimaker.ini index 363e0dec8a..1aeeab0a15 100644 --- a/resources/profiles/Ultimaker.ini +++ b/resources/profiles/Ultimaker.ini @@ -9,7 +9,7 @@ name = Ultimaker # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.0 +config_version = 1.0.1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Ultimaker/ @@ -396,5 +396,5 @@ printer_notes = Dont remove the following keywords! These keywords are used in t nozzle_diameter = 0.4 default_print_profile = 0.20mm NORMAL @ULTIMAKER2 default_filament_profile = Generic PLA @ULTIMAKER2 -start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Heat up bed and nozzle\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\nG92 E0 ; zero the extruded length\nG1 F150 E22 ; purge nozzle with filament\nG92 E0 ; zero the extruded length again\nG1 F75 E7 ; additional priming\nG92 E0 ; zero the extruded length again\n\n; # # # # # # END Header +start_gcode = start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nM140 S[first_layer_bed_temperature] ; start bed heating\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Wait for bed and nozzle temperatures\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\n; Purge and prime\nM83 ; set extruder to relative mode\nG92 E0 ; reset extrusion distance\nG0 X0 Y1 F10000\nG1 F150 E20 Y10 ; compress the bowden tube\nG1 E-8 F1200\nG0 X30 Y1 F5000 \nG0 F1200 Z{first_layer_height/2} ; Cut the connection to priming blob\nG0 X100 F10000 ; disconnect with the prime blob\nG0 X50 ; Avoid the metal clip holding the Ultimaker glass plate\nG0 Z0.2 F720\nG1 E8 F1200\nG1 X80 E3 F1000 ; intro line 1\nG1 X110 E4 F1000 ; intro line 2\nG1 X140 F600 ; drag filament to decompress bowden tube\nG1 X100 F3200 ; wipe backwards a bit\nG1 X150 F3200 ; back to where there is no plastic: avoid dragging\nG92 E0 ; reset extruder reference\nM82 ; set extruder to absolute mode\n\n; # # # # # # END Header end_gcode = ; # # # # # # START Footer\nG91 ; relative coordinates\n;G1 E-1 F1200 ; retract the filament\nG1 Z+15 X-10 Y-10 E-7 F6000 ; move Z a bit\n; G1 X-10 Y-10 F6000 ; move XY a bit\nG1 E-5.5 F300 ; retract the filament\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nM104 S0 ; extruder heater off\nM140 S0 ; heated bed heater off (if you have it)\nM84 ; disable motors\n; # # # # # # END Footer\n From 99861f1b6ec3793025d528f0badb63e837f8c808 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 17 Mar 2022 14:20:35 +0100 Subject: [PATCH 119/149] SPE-1207 - Extensions in Open/Save/Export dialogs - alternative implementation for file_wildcards() --- src/libslic3r/Technologies.hpp | 2 ++ src/slic3r/GUI/GUI_App.cpp | 40 ++++++++++++++++++++++++++++++++++ src/slic3r/GUI/GUI_App.hpp | 4 ++++ src/slic3r/GUI/Plater.cpp | 8 ++++++- 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 635fc49943..2ce7079fe1 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -84,6 +84,8 @@ #define ENABLE_NEW_CAMERA_MOVEMENTS (1 && ENABLE_2_5_0_ALPHA1) // Enable modified rectangle selection #define ENABLE_NEW_RECTANGLE_SELECTION (1 && ENABLE_2_5_0_ALPHA1) +// Enable alternative version of file_wildcards() +#define ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR (1 && ENABLE_2_5_0_ALPHA1) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 87913fb812..ee91994252 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -499,6 +499,44 @@ static const FileWildcards file_wildcards_by_type[FT_SIZE] = { /* FT_SL1 */ { "Masked SLA files"sv, { ".sl1"sv, ".sl1s"sv, ".pwmx"sv } }, }; +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +wxString file_wildcards(FileType file_type) +{ + const FileWildcards& data = file_wildcards_by_type[file_type]; + std::string title; + std::string mask; + + // Generate cumulative first item + for (const std::string_view& ext : data.file_extensions) { + if (title.empty()) { + title = "*"; + title += ext; + mask = title; + } + else { + title += ", *"; + title += ext; + mask += ";*"; + mask += ext; + } + mask += ";*"; + mask += boost::to_upper_copy(std::string(ext)); + } + + wxString ret = GUI::format_wxstr("%s (%s)|%s", data.title, title, mask); + + // Adds an item for each of the extensions + if (data.file_extensions.size() > 1) { + for (const std::string_view& ext : data.file_extensions) { + title = "*"; + title += ext; + ret += GUI::format_wxstr("|%s (%s)|%s", data.title, title, title); + } + } + + return ret; +} +#else // This function produces a Win32 file dialog file template mask to be consumed by wxWidgets on all platforms. // The function accepts a custom extension parameter. If the parameter is provided, the custom extension // will be added as a fist to the list. This is important for a "file save" dialog on OSX, which strips @@ -551,8 +589,10 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension) mask += ";*"; mask += boost::to_upper_copy(std::string(ext)); } + return GUI::format_wxstr("%s (%s)|%s", data.title, title, mask); } +#endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 8b4177a8d7..f93728d2e3 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -71,7 +71,11 @@ enum FileType FT_SIZE, }; +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR +extern wxString file_wildcards(FileType file_type); +#else extern wxString file_wildcards(FileType file_type, const std::string &custom_extension = std::string{}); +#endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR enum ConfigMenuIDs { ConfigMenuWizard, diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fc8ba23c51..daee3b0533 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5919,11 +5919,17 @@ void Plater::export_gcode(bool prefer_removable) fs::path output_path; { - std::string ext = default_output_file.extension().string(); +#if !ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR + std::string ext = default_output_file.extension().string(); +#endif // !ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _L("Save G-code file as:") : _L("Save SL1 / SL1S file as:"), start_dir, from_path(default_output_file.filename()), +#if ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR + GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_SL1), +#else GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_SL1, ext), +#endif // ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); if (dlg.ShowModal() == wxID_OK) { From 8d5dd759ada887ca733f2cb689eccd6df1a6c88c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 17 Mar 2022 14:31:14 +0100 Subject: [PATCH 120/149] SPE-1208 - Fix for 3mf from another SW is loaded as a project and not as geometry --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index daee3b0533..df593f1300 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5566,7 +5566,7 @@ bool Plater::load_files(const wxArrayString& filenames) if (!model().objects.empty()) { if ((boost::algorithm::iends_with(filename, ".3mf") && !is_project_3mf(it->string())) || (boost::algorithm::iends_with(filename, ".amf") && !boost::algorithm::iends_with(filename, ".zip.amf"))) - load_type = LoadType::OpenProject; + load_type = LoadType::LoadGeometry; else { if (wxGetApp().app_config->get("show_drop_project_dialog") == "1") { ProjectDropDialog dlg(filename); From fb22612d0d422c6dfe88610a40fa207b7ad3ab1c Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 17 Mar 2022 15:12:03 +0100 Subject: [PATCH 121/149] Tech ENABLE_SPIRAL_VASE_LAYERS set as default --- src/libslic3r/GCode/GCodeProcessor.cpp | 14 -------------- src/libslic3r/GCode/GCodeProcessor.hpp | 4 ---- src/libslic3r/Technologies.hpp | 2 -- src/slic3r/GUI/GCodeViewer.cpp | 2 -- 4 files changed, 22 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 3bf7c4ffd3..0c9d495446 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -737,9 +737,7 @@ void GCodeProcessorResult::reset() { filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); custom_gcode_per_print_z = std::vector(); -#if ENABLE_SPIRAL_VASE_LAYERS spiral_vase_layers = std::vector>>(); -#endif // ENABLE_SPIRAL_VASE_LAYERS time = 0; } #else @@ -755,9 +753,7 @@ void GCodeProcessorResult::reset() { filament_diameters = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DIAMETER); filament_densities = std::vector(MIN_EXTRUDERS_COUNT, DEFAULT_FILAMENT_DENSITY); custom_gcode_per_print_z = std::vector(); -#if ENABLE_SPIRAL_VASE_LAYERS spiral_vase_layers = std::vector>>(); -#endif // ENABLE_SPIRAL_VASE_LAYERS } #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -905,11 +901,9 @@ void GCodeProcessor::apply_config(const PrintConfig& config) m_result.max_print_height = config.max_print_height; -#if ENABLE_SPIRAL_VASE_LAYERS const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); if (spiral_vase != nullptr) m_spiral_vase_active = spiral_vase->value; -#endif // ENABLE_SPIRAL_VASE_LAYERS #if ENABLE_Z_OFFSET_CORRECTION const ConfigOptionFloat* z_offset = config.option("z_offset"); @@ -1160,11 +1154,9 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) if (max_print_height != nullptr) m_result.max_print_height = max_print_height->value; -#if ENABLE_SPIRAL_VASE_LAYERS const ConfigOptionBool* spiral_vase = config.option("spiral_vase"); if (spiral_vase != nullptr) m_spiral_vase_active = spiral_vase->value; -#endif // ENABLE_SPIRAL_VASE_LAYERS #if ENABLE_Z_OFFSET_CORRECTION const ConfigOptionFloat* z_offset = config.option("z_offset"); @@ -1238,9 +1230,7 @@ void GCodeProcessor::reset() m_options_z_corrector.reset(); -#if ENABLE_SPIRAL_VASE_LAYERS m_spiral_vase_active = false; -#endif // ENABLE_SPIRAL_VASE_LAYERS #if ENABLE_GCODE_VIEWER_DATA_CHECKING m_mm3_per_mm_compare.reset(); @@ -1950,7 +1940,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers // layer change tag if (comment == reserved_tag(ETags::Layer_Change)) { ++m_layer_id; -#if ENABLE_SPIRAL_VASE_LAYERS if (m_spiral_vase_active) { if (m_result.moves.empty()) m_result.spiral_vase_layers.push_back({ m_first_layer_height, { 0, 0 } }); @@ -1962,7 +1951,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers m_result.spiral_vase_layers.push_back({ static_cast(m_end_position[Z]), { move_id, move_id } }); } } -#endif // ENABLE_SPIRAL_VASE_LAYERS return; } @@ -2772,10 +2760,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) m_seams_detector.set_first_vertex(m_result.moves.back().position - m_extruder_offsets[m_extruder_id]); } -#if ENABLE_SPIRAL_VASE_LAYERS if (m_spiral_vase_active && !m_result.spiral_vase_layers.empty() && !m_result.moves.empty()) m_result.spiral_vase_layers.back().second.second = m_result.moves.size() - 1; -#endif // ENABLE_SPIRAL_VASE_LAYERS // store move store_move_vertex(type); diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 25375f61b6..e04caa6e22 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -131,9 +131,7 @@ namespace Slic3r { std::vector filament_densities; PrintEstimatedStatistics print_statistics; std::vector custom_gcode_per_print_z; -#if ENABLE_SPIRAL_VASE_LAYERS std::vector>> spiral_vase_layers; -#endif // ENABLE_SPIRAL_VASE_LAYERS #if ENABLE_GCODE_VIEWER_STATISTICS int64_t time{ 0 }; @@ -559,9 +557,7 @@ namespace Slic3r { SeamsDetector m_seams_detector; OptionsZCorrector m_options_z_corrector; size_t m_last_default_color_id; -#if ENABLE_SPIRAL_VASE_LAYERS bool m_spiral_vase_active; -#endif // ENABLE_SPIRAL_VASE_LAYERS #if ENABLE_GCODE_VIEWER_STATISTICS std::chrono::time_point m_start_time; #endif // ENABLE_GCODE_VIEWER_STATISTICS diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 2ce7079fe1..de54e65091 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -41,8 +41,6 @@ //================ #define ENABLE_2_4_1_RC 1 -// Enable detection of layers for spiral vase prints -#define ENABLE_SPIRAL_VASE_LAYERS (1 && ENABLE_2_4_1_RC) // Enable correction of toolpaths when z offset is set #define ENABLE_Z_OFFSET_CORRECTION (1 && ENABLE_2_4_1_RC) diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index d33004f494..5372d4565b 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -2313,7 +2313,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) sort_remove_duplicates(m_extruder_ids); m_extruder_ids.shrink_to_fit(); -#if ENABLE_SPIRAL_VASE_LAYERS // replace layers for spiral vase mode if (!gcode_result.spiral_vase_layers.empty()) { m_layers.reset(); @@ -2321,7 +2320,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) m_layers.append(layer.first, { layer.second.first, layer.second.second }); } } -#endif // ENABLE_SPIRAL_VASE_LAYERS // set layers z range if (!m_layers.empty()) From 493050a279038ef5d70273b352131e6eadd90a3d Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 17 Mar 2022 15:29:18 +0100 Subject: [PATCH 122/149] Removed redundant line of code --- src/slic3r/GUI/GUI_Preview.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 2cac5e3566..1488ffb2e5 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -1040,7 +1040,6 @@ void Preview::load_print_as_sla() if (IsShown()) { m_canvas->load_sla_preview(); m_left_sizer->Hide(m_bottom_toolbar_panel); - m_left_sizer->Hide(m_bottom_toolbar_panel); m_left_sizer->Layout(); Refresh(); From 45e4d905043b2321fed005e40e37b7527dd644a3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 17 Mar 2022 15:44:03 +0100 Subject: [PATCH 123/149] GCodeViewer - Hide bottom toolbar when loading a new gcode file --- src/slic3r/GUI/GUI_Preview.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 1488ffb2e5..3eec8f823e 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -966,6 +966,11 @@ void Preview::load_print_as_fff(bool keep_z_range) Refresh(); zs = m_canvas->get_volumes_print_zs(true); } + else { + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Layout(); + Refresh(); + } if (!zs.empty() && !m_keep_current_preview_type) { unsigned int number_extruders = wxGetApp().is_editor() ? From b56874e9fe322ffc8a5029644bf889b3ca47a43f Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Thu, 17 Mar 2022 23:07:01 +0100 Subject: [PATCH 124/149] Sync with PrusaSlicer-settings 1.0.2 --- resources/profiles/Ultimaker.idx | 1 + resources/profiles/Ultimaker.ini | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/profiles/Ultimaker.idx b/resources/profiles/Ultimaker.idx index 8e119931c1..605b87e071 100644 --- a/resources/profiles/Ultimaker.idx +++ b/resources/profiles/Ultimaker.idx @@ -1,3 +1,4 @@ min_slic3r_version = 2.4.0-beta0 +1.0.2 Fixed start g-code. 1.0.1 Updated start g-code. 1.0.0 Initial version diff --git a/resources/profiles/Ultimaker.ini b/resources/profiles/Ultimaker.ini index 1aeeab0a15..f3e30db400 100644 --- a/resources/profiles/Ultimaker.ini +++ b/resources/profiles/Ultimaker.ini @@ -9,7 +9,7 @@ name = Ultimaker # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.1 +config_version = 1.0.2 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Ultimaker/ @@ -396,5 +396,5 @@ printer_notes = Dont remove the following keywords! These keywords are used in t nozzle_diameter = 0.4 default_print_profile = 0.20mm NORMAL @ULTIMAKER2 default_filament_profile = Generic PLA @ULTIMAKER2 -start_gcode = start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nM140 S[first_layer_bed_temperature] ; start bed heating\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Wait for bed and nozzle temperatures\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\n; Purge and prime\nM83 ; set extruder to relative mode\nG92 E0 ; reset extrusion distance\nG0 X0 Y1 F10000\nG1 F150 E20 Y10 ; compress the bowden tube\nG1 E-8 F1200\nG0 X30 Y1 F5000 \nG0 F1200 Z{first_layer_height/2} ; Cut the connection to priming blob\nG0 X100 F10000 ; disconnect with the prime blob\nG0 X50 ; Avoid the metal clip holding the Ultimaker glass plate\nG0 Z0.2 F720\nG1 E8 F1200\nG1 X80 E3 F1000 ; intro line 1\nG1 X110 E4 F1000 ; intro line 2\nG1 X140 F600 ; drag filament to decompress bowden tube\nG1 X100 F3200 ; wipe backwards a bit\nG1 X150 F3200 ; back to where there is no plastic: avoid dragging\nG92 E0 ; reset extruder reference\nM82 ; set extruder to absolute mode\n\n; # # # # # # END Header +start_gcode = ; Printer_Settings_ID: [printer_settings_id]\n\n; # # # # # # START Header\nG21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM107 ; start with the fan off\n\nM140 S[first_layer_bed_temperature] ; start bed heating\n\nG28 X0 Y0 Z0 ; move X/Y/Z to endstops\nG1 X1 Y6 F15000 ; move X/Y to start position\nG1 Z35 F9000 ; move Z to start position\n\n; Wait for bed and nozzle temperatures\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temperature - 5\nM140 S[first_layer_bed_temperature] ; continue bed heating\nM109 S[first_layer_temperature] ; wait for nozzle temperature\n\n; Purge and prime\nM83 ; set extruder to relative mode\nG92 E0 ; reset extrusion distance\nG0 X0 Y1 F10000\nG1 F150 E20 ; compress the bowden tube\nG1 E-8 F1200\nG0 X30 Y1 F5000 \nG0 F1200 Z{first_layer_height/2} ; Cut the connection to priming blob\nG0 X100 F10000 ; disconnect with the prime blob\nG0 X50 ; Avoid the metal clip holding the Ultimaker glass plate\nG0 Z0.2 F720\nG1 E8 F1200\nG1 X80 E3 F1000 ; intro line 1\nG1 X110 E4 F1000 ; intro line 2\nG1 X140 F600 ; drag filament to decompress bowden tube\nG1 X100 F3200 ; wipe backwards a bit\nG1 X150 F3200 ; back to where there is no plastic: avoid dragging\nG92 E0 ; reset extruder reference\nM82 ; set extruder to absolute mode\n\n; # # # # # # END Header end_gcode = ; # # # # # # START Footer\nG91 ; relative coordinates\n;G1 E-1 F1200 ; retract the filament\nG1 Z+15 X-10 Y-10 E-7 F6000 ; move Z a bit\n; G1 X-10 Y-10 F6000 ; move XY a bit\nG1 E-5.5 F300 ; retract the filament\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nM104 S0 ; extruder heater off\nM140 S0 ; heated bed heater off (if you have it)\nM84 ; disable motors\n; # # # # # # END Footer\n From a7d466dc7cb4da8cd3c5b6869b560fa8efc54fa8 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 18 Mar 2022 08:32:35 +0100 Subject: [PATCH 125/149] Tech ENABLE_Z_OFFSET_CORRECTION set as default --- src/libslic3r/GCode/GCodeProcessor.cpp | 14 -------------- src/libslic3r/GCode/GCodeProcessor.hpp | 2 -- src/libslic3r/Technologies.hpp | 9 --------- 3 files changed, 25 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 0c9d495446..43a5f1eb0a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -905,11 +905,9 @@ void GCodeProcessor::apply_config(const PrintConfig& config) if (spiral_vase != nullptr) m_spiral_vase_active = spiral_vase->value; -#if ENABLE_Z_OFFSET_CORRECTION const ConfigOptionFloat* z_offset = config.option("z_offset"); if (z_offset != nullptr) m_z_offset = z_offset->value; -#endif // ENABLE_Z_OFFSET_CORRECTION } void GCodeProcessor::apply_config(const DynamicPrintConfig& config) @@ -1158,11 +1156,9 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config) if (spiral_vase != nullptr) m_spiral_vase_active = spiral_vase->value; -#if ENABLE_Z_OFFSET_CORRECTION const ConfigOptionFloat* z_offset = config.option("z_offset"); if (z_offset != nullptr) m_z_offset = z_offset->value; -#endif // ENABLE_Z_OFFSET_CORRECTION } void GCodeProcessor::enable_stealth_time_estimator(bool enabled) @@ -1195,9 +1191,7 @@ void GCodeProcessor::reset() m_forced_height = 0.0f; m_mm3_per_mm = 0.0f; m_fan_speed = 0.0f; -#if ENABLE_Z_OFFSET_CORRECTION m_z_offset = 0.0f; -#endif // ENABLE_Z_OFFSET_CORRECTION m_extrusion_role = erNone; m_extruder_id = 0; @@ -2743,11 +2737,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) // the threshold value = 0.0625f == 0.25 * 0.25 is arbitrary, we may find some smarter condition later if ((new_pos - *first_vertex).squaredNorm() < 0.0625f) { -#if ENABLE_Z_OFFSET_CORRECTION set_end_position(0.5f * (new_pos + *first_vertex) + m_z_offset * Vec3f::UnitZ()); -#else - set_end_position(0.5f * (new_pos + *first_vertex)); -#endif // ENABLE_Z_OFFSET_CORRECTION store_move_vertex(EMoveType::Seam); set_end_position(curr_pos); } @@ -3279,11 +3269,7 @@ void GCodeProcessor::store_move_vertex(EMoveType type) m_extrusion_role, m_extruder_id, m_cp_color.current, -#if ENABLE_Z_OFFSET_CORRECTION Vec3f(m_end_position[X], m_end_position[Y], m_processing_start_custom_gcode ? m_first_layer_height : m_end_position[Z] - m_z_offset) + m_extruder_offsets[m_extruder_id], -#else - Vec3f(m_end_position[X], m_end_position[Y], m_processing_start_custom_gcode ? m_first_layer_height : m_end_position[Z]) + m_extruder_offsets[m_extruder_id], -#endif // ENABLE_Z_OFFSET_CORRECTION static_cast(m_end_position[E] - m_start_position[E]), m_feedrate, m_width, diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index e04caa6e22..5ca8f0b026 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -540,9 +540,7 @@ namespace Slic3r { float m_forced_height; // mm float m_mm3_per_mm; float m_fan_speed; // percentage -#if ENABLE_Z_OFFSET_CORRECTION float m_z_offset; // mm -#endif // ENABLE_Z_OFFSET_CORRECTION ExtrusionRole m_extrusion_role; unsigned char m_extruder_id; ExtruderColors m_extruder_colors; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index de54e65091..8e6a3cb86c 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -36,15 +36,6 @@ #define ENABLE_SMOOTH_NORMALS 0 -//================ -// 2.4.1.rc techs -//================ -#define ENABLE_2_4_1_RC 1 - -// Enable correction of toolpaths when z offset is set -#define ENABLE_Z_OFFSET_CORRECTION (1 && ENABLE_2_4_1_RC) - - //==================== // 2.5.0.alpha1 techs //==================== From f3d92bdeff0cb6f5c1685e9910a26418cef1e45e Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 18 Mar 2022 10:25:00 +0100 Subject: [PATCH 126/149] Fixup of 5de93c8 (incorrectly solved merge conflict) --- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index e8c2055f63..4007f0cb0b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -154,7 +154,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix()); const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); #if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * vol->get_instance_transformation().get_matrix(); + const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * transformation.get_matrix(); const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); const Transform3d& projection_matrix = camera.get_projection_matrix(); From b094ea3c9aca7d91a505d3811c430f1861fe052b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 18 Mar 2022 12:52:14 +0100 Subject: [PATCH 127/149] Added github issue template form --- .github/ISSUE_TEMPLATE/bug_report_form.yml | 65 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 9 +++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++ 3 files changed, 94 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report_form.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report_form.yml b/.github/ISSUE_TEMPLATE/bug_report_form.yml new file mode 100644 index 0000000000..7cbaddc49f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_form.yml @@ -0,0 +1,65 @@ +name: Bug Report +description: File a bug report +body: + - type: markdown + attributes: + value: | + Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment. + - type: textarea + id: what-happened + attributes: + label: Description of the bug + description: What happened? Please, enclose a screenshot whenever possible (even when you think the description is clear). What did you expect to happen? In case of 3D rendering issues, please attach the content of menu Help -> System Info dialog. + placeholder: | + What is the problem? + What did you expect? + You paste or drop screenshots here + validations: + required: true + - type: textarea + id: to_reproduce + attributes: + label: Project file & How to reproduce + description: "*Please* upload a ZIP archive containing the project file used when the problem arise. Please export it just before the problem occurs. Even if you did nothing and/or there is no object, export it! (it contains your current configuration)." + placeholder: | + `File`->`Export project as...` then zip it & drop it here + Also, if needed include the steps to reproduce the bug: + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + - type: checkboxes + attributes: + label: Checklist of files included above + options: + - label: Project file + - label: Screenshot + validations: + required: true + - type: input + id: version + attributes: + label: Version of PrusaSlicer + description: What version of PrusaSlicer are you running? You can see the full version in `Help` -> `About PrusaSlicer`. + placeholder: e.g. 2.4.1-alpha2-win64 / 2.3.3-linux / 2.4.1-alpha0+61-win64-gcd2459455 ... + validations: + required: true + - type: input + id: os + attributes: + label: Operating system + description: with the version if possible + placeholder: e.g. Windows 7/8/10/11 ... , Ubuntu 22.04/Debian ... , macOS 10.15/11.1 ... + validations: + required: true + - type: input + id: printer + attributes: + label: Printer model + description: Please, fill this in even when it seems irrelevant. + placeholder: voron 2.4 with afterburner + validations: + required: true + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..d373b69eea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +contact_links: + - name: PrusaSlicer Manual and Support + url: https://help.prusa3d.com/en/article/customer-support_2287/ + about: If you are not sure that what you are reporting is really a bug, please, consult the manual first. + - name: PrusaPrinters Forum + url: https://forum.prusaprinters.org/forum/prusaslicer/ + about: Please get in touch on our PrusaPrinters Community Forum! (Not an official support channel.) + +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..aed1846872 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe how it would work** +Be as descriptive as your skill level allows you. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or paint drawing about the feature request here. From 8c8e908325adb2c7f97bb4eaf5e6c9567530fa09 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 18 Mar 2022 13:34:53 +0100 Subject: [PATCH 128/149] Tech ENABLE_PROCESS_G2_G3_LINES - Processing of gcode G2 and G3 lines --- src/libslic3r/GCode/GCodeProcessor.cpp | 286 +++++++++++++++++++++++-- src/libslic3r/GCode/GCodeProcessor.hpp | 9 + src/libslic3r/Technologies.hpp | 2 + src/slic3r/GUI/GUI_Preview.cpp | 31 +++ 4 files changed, 311 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 3bf7c4ffd3..9e98e4da4c 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -36,6 +36,10 @@ static const float DEFAULT_FILAMENT_DIAMETER = 1.75f; static const float DEFAULT_FILAMENT_DENSITY = 1.245f; static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero(); +#if ENABLE_PROCESS_G2_G3_LINES +static const std::string INTERNAL_G2G3_TAG = "!#!#! from G2/G3 expansion !#!#!"; +#endif // ENABLE_PROCESS_G2_G3_LINES + namespace Slic3r { const std::vector GCodeProcessor::Reserved_Tags = { @@ -1596,6 +1600,10 @@ void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line, bool switch (cmd[1]) { case '0': { process_G0(line); break; } // Move case '1': { process_G1(line); break; } // Move +#if ENABLE_PROCESS_G2_G3_LINES + case '2': { process_G2_G3(line, true); break; } // CW Arc Move + case '3': { process_G2_G3(line, false); break; } // CCW Arc Move +#endif // ENABLE_PROCESS_G2_G3_LINES default: break; } break; @@ -2453,9 +2461,10 @@ void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) { - float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); - float filament_radius = 0.5f * filament_diameter; - float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); + const float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); + const float filament_radius = 0.5f * filament_diameter; + const float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); +#if !ENABLE_PROCESS_G2_G3_LINES auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG1) { bool is_relative = (m_global_positioning_type == EPositioningType::Relative); if (axis == E) @@ -2471,6 +2480,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) else return m_start_position[axis]; }; +#endif // !ENABLE_PROCESS_G2_G3_LINES auto move_type = [this](const AxisCoords& delta_pos) { EMoveType type = EMoveType::Noop; @@ -2498,7 +2508,11 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) // updates axes positions from line for (unsigned char a = X; a <= E; ++a) { +#if ENABLE_PROCESS_G2_G3_LINES + m_end_position[a] = extract_absolute_position_on_axis((Axis)a, line, double(area_filament_cross_section)); +#else m_end_position[a] = absolute_position((Axis)a, line); +#endif // ENABLE_PROCESS_G2_G3_LINES } // updates feedrate from line, if present @@ -2517,11 +2531,11 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) if (max_abs_delta == 0.0f) return; - EMoveType type = move_type(delta_pos); + const EMoveType type = move_type(delta_pos); if (type == EMoveType::Extrude) { - float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); - float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; - float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; + const float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); + const float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; + const float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; // save extruded volume to the cache m_used_filaments.increase_caches(volume_extruded_filament); @@ -2532,12 +2546,23 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role); #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING +#if ENABLE_PROCESS_G2_G3_LINES + if (m_forced_height > 0.0f) + m_height = m_forced_height; + else if (m_layer_id == 0) + m_height = (m_end_position[Z] <= double(m_first_layer_height)) ? m_end_position[Z] : m_first_layer_height; + else if (line.comment() != INTERNAL_G2G3_TAG){ + if (m_end_position[Z] > m_extruded_last_z + EPSILON && delta_pos[Z] == 0.0) + m_height = m_end_position[Z] - m_extruded_last_z; + } +#else if (m_forced_height > 0.0f) m_height = m_forced_height; else { if (m_end_position[Z] > m_extruded_last_z + EPSILON) m_height = m_end_position[Z] - m_extruded_last_z; } +#endif // ENABLE_PROCESS_G2_G3_LINES if (m_height == 0.0f) m_height = DEFAULT_TOOLPATH_HEIGHT; @@ -2545,7 +2570,10 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) if (m_end_position[Z] == 0.0f) m_end_position[Z] = m_height; - m_extruded_last_z = m_end_position[Z]; +#if ENABLE_PROCESS_G2_G3_LINES + if (line.comment() != INTERNAL_G2G3_TAG) +#endif // ENABLE_PROCESS_G2_G3_LINES + m_extruded_last_z = m_end_position[Z]; m_options_z_corrector.update(m_height); #if ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -2585,9 +2613,9 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) return delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f && delta_pos[Z] == 0.0f && delta_pos[E] != 0.0f; }; - float distance = move_length(delta_pos); + const float distance = move_length(delta_pos); assert(distance != 0.0f); - float inv_distance = 1.0f / distance; + const float inv_distance = 1.0f / distance; for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { TimeMachine& machine = m_time_processor.machines[i]; @@ -2618,7 +2646,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]); if (curr.abs_axis_feedrate[a] != 0.0f) { - float axis_max_feedrate = get_axis_max_feedrate(static_cast(i), static_cast(a)); + const float axis_max_feedrate = get_axis_max_feedrate(static_cast(i), static_cast(a)); if (axis_max_feedrate != 0.0f) min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]); } @@ -2641,7 +2669,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) get_acceleration(static_cast(i))); for (unsigned char a = X; a <= E; ++a) { - float axis_max_acceleration = get_axis_max_acceleration(static_cast(i), static_cast(a)); + const float axis_max_acceleration = get_axis_max_acceleration(static_cast(i), static_cast(a)); if (acceleration * std::abs(delta_pos[a]) * inv_distance > axis_max_acceleration) acceleration = axis_max_acceleration; } @@ -2652,7 +2680,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) curr.safe_feedrate = block.feedrate_profile.cruise; for (unsigned char a = X; a <= E; ++a) { - float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); + const float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); if (curr.abs_axis_feedrate[a] > axis_max_jerk) curr.safe_feedrate = std::min(curr.safe_feedrate, axis_max_jerk); } @@ -2686,7 +2714,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) } // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. - float jerk = + const float jerk = (v_exit > v_entry) ? ((v_entry > 0.0f || v_exit < 0.0f) ? // coasting @@ -2700,7 +2728,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) // axis reversal std::max(-v_exit, v_entry)); - float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); + const float axis_max_jerk = get_axis_max_jerk(static_cast(i), static_cast(a)); if (jerk > axis_max_jerk) { v_factor *= axis_max_jerk / jerk; limited = true; @@ -2712,14 +2740,14 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) // Now the transition velocity is known, which maximizes the shared exit / entry velocity while // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. - float vmax_junction_threshold = vmax_junction * 0.99f; + const float vmax_junction_threshold = vmax_junction * 0.99f; // Not coasting. The machine will stop and start the movements anyway, better to start the segment from start. if (prev.safe_feedrate > vmax_junction_threshold && curr.safe_feedrate > vmax_junction_threshold) vmax_junction = curr.safe_feedrate; } - float v_allowable = max_allowable_speed(-acceleration, curr.safe_feedrate, block.distance); + const float v_allowable = max_allowable_speed(-acceleration, curr.safe_feedrate, block.distance); block.feedrate_profile.entry = std::min(vmax_junction, v_allowable); block.max_entry_speed = vmax_junction; @@ -2781,6 +2809,211 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) store_move_vertex(type); } +#if ENABLE_PROCESS_G2_G3_LINES +void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool clockwise) +{ + if (!line.has('X') || !line.has('Y') || !line.has('I') || !line.has('J')) + return; + + // relative center + Vec3f rel_center = Vec3f::Zero(); + if (!line.has_value('I', rel_center.x()) || !line.has_value('J', rel_center.y())) + return; + + // scale center, if needed + if (m_units == EUnits::Inches) + rel_center *= INCHES_TO_MM; + + struct Arc + { + Vec3d start{ Vec3d::Zero() }; + Vec3d end{ Vec3d::Zero() }; + Vec3d center{ Vec3d::Zero() }; + + double angle{ 0.0 }; + double delta_x() const { return end.x() - start.x(); } + double delta_y() const { return end.y() - start.y(); } + double delta_z() const { return end.z() - start.z(); } + + double length() const { return angle * start_radius(); } + double travel_length() const { return std::sqrt(sqr(length() + sqr(delta_z()))); } + double start_radius() const { return (start - center).norm(); } + double end_radius() const { return (end - center).norm(); } + + Vec3d relative_start() const { return start - center; } + Vec3d relative_end() const { return end - center; } + + bool closed() const { return end.isApprox(start); } + }; + + Arc arc; + + // arc start endpoint + arc.start = Vec3d(m_start_position[X], m_start_position[Y], m_start_position[Z]); + + // arc center + arc.center = arc.start + rel_center.cast(); + + const float filament_diameter = (static_cast(m_extruder_id) < m_result.filament_diameters.size()) ? m_result.filament_diameters[m_extruder_id] : m_result.filament_diameters.back(); + const float filament_radius = 0.5f * filament_diameter; + const float area_filament_cross_section = static_cast(M_PI) * sqr(filament_radius); + + AxisCoords end_position = m_start_position; + for (unsigned char a = X; a <= E; ++a) { + end_position[a] = extract_absolute_position_on_axis((Axis)a, line, double(area_filament_cross_section)); + } + + // arc end endpoint + arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]); + + // radii + if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) { + // what to do ??? + } + + // updates feedrate from line + std::optional feedrate; + if (line.has_f()) + feedrate = m_feed_multiply.current * line.f() * MMMIN_TO_MMSEC; + + // updates extrusion from line + std::optional extrusion; + if (line.has_e()) + extrusion = end_position[E] - m_start_position[E]; + + // relative arc endpoints + const Vec3d rel_arc_start = arc.relative_start(); + const Vec3d rel_arc_end = arc.relative_end(); + + // arc angle + if (arc.closed()) + arc.angle = 2.0 * PI; + else { + arc.angle = std::atan2(rel_arc_start.x() * rel_arc_end.y() - rel_arc_start.y() * rel_arc_end.x(), + rel_arc_start.x() * rel_arc_end.x() + rel_arc_start.y() * rel_arc_end.y()); + if (arc.angle < 0.0) + arc.angle += 2.0 * PI; + if (clockwise) + arc.angle -= 2.0 * PI; + } + + const double travel_length = arc.travel_length(); + if (travel_length < 0.001) + return; + + auto adjust_target = [this, area_filament_cross_section](const AxisCoords& target, const AxisCoords& prev_position) { + AxisCoords ret = target; + if (m_global_positioning_type == EPositioningType::Relative) { + for (unsigned char a = X; a <= E; ++a) { + ret[a] -= prev_position[a]; + } + } + else if (m_e_local_positioning_type == EPositioningType::Relative) + ret[E] -= prev_position[E]; + + if (m_use_volumetric_e) + ret[E] *= area_filament_cross_section; + + const double lengthsScaleFactor = (m_units == EUnits::Inches) ? double(INCHES_TO_MM) : 1.0; + for (unsigned char a = X; a <= E; ++a) { + ret[a] /= lengthsScaleFactor; + } + return ret; + }; + + auto fake_g1_line = [this](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { + std::string ret = (boost::format("G1 X%1% Y%2%") % target[X] % target[Y]).str(); + if (has_z) + ret += (boost::format(" Z%1%") % target[Z]).str(); + if (feedrate.has_value()) + ret += (boost::format(" F%1%") % feedrate.value()).str(); + if (extrusion.has_value()) + ret += (boost::format(" E%1%") % target[E]).str(); + + ret += (boost::format(" ;%1%\n") % INTERNAL_G2G3_TAG).str(); + + return ret; + }; + + // calculate arc segments + // reference: + // Prusa-Firmware\Firmware\motion_control.cpp - mc_arc() + + // segments count + static const double MM_PER_ARC_SEGMENT = 1.0; + const size_t segments = std::max(std::floor(travel_length / MM_PER_ARC_SEGMENT), 1); + + const double theta_per_segment = arc.angle / double(segments); + const double z_per_segment = arc.delta_z() / double(segments); + const double extruder_per_segment = (extrusion.has_value()) ? extrusion.value() / double(segments) : 0.0; + + double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation + double sin_T = theta_per_segment; + + AxisCoords prev_target = m_start_position; + AxisCoords arc_target; + double sin_Ti; + double cos_Ti; + double r_axisi; + size_t count = 0; + + // Initialize the linear axis + arc_target[Z] = m_start_position[Z]; + + // Initialize the extruder axis + arc_target[E] = m_start_position[E]; + + static const size_t N_ARC_CORRECTION = 25; + + Vec3d curr_rel_arc_start = arc.relative_start(); + Vec3d curr_rel_arc_end = arc.relative_end(); + + std::string gcode; + + for (size_t i = 1; i < segments; ++i) { // Increment (segments-1) + if (count < N_ARC_CORRECTION) { + // Apply vector rotation matrix + r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T; + curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T; + curr_rel_arc_start.y() = r_axisi; + count++; + } + else { + // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments. + // Compute exact location by applying transformation matrix from initial radius vector(=-offset). + cos_Ti = ::cos(double(i) * theta_per_segment); + sin_Ti = ::sin(double(i) * theta_per_segment); + curr_rel_arc_start.x() = -double(rel_center.x()) * cos_Ti + double(rel_center.y()) * sin_Ti; + curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti; + count = 0; + } + + // Update arc_target location + arc_target[X] = arc.center.x() + curr_rel_arc_start.x(); + arc_target[Y] = arc.center.y() + curr_rel_arc_start.y(); + arc_target[Z] += z_per_segment; + arc_target[E] += extruder_per_segment; + + gcode += fake_g1_line(adjust_target(arc_target, prev_target), z_per_segment != 0.0, feedrate, extrusion); + prev_target = arc_target; + + // feedrate is constant, we do not need to repeat it + feedrate.reset(); + } + + // Ensure last segment arrives at target location. + gcode += fake_g1_line(adjust_target(end_position, prev_target), arc.delta_z() != 0.0, feedrate, extrusion); + + // process fake gcode lines + GCodeReader parser; + parser.parse_buffer(gcode, [this](GCodeReader&, const GCodeReader::GCodeLine& line) { + // force all lines to share the same id + --m_line_id; + process_gcode_line(line, false); + }); +} +#endif // ENABLE_PROCESS_G2_G3_LINES + void GCodeProcessor::process_G10(const GCodeReader::GCodeLine& line) { // stores retract move @@ -3502,5 +3735,24 @@ void GCodeProcessor::update_estimated_times_stats() m_result.print_statistics.used_filaments_per_role = m_used_filaments.filaments_per_role; } +#if ENABLE_PROCESS_G2_G3_LINES +double GCodeProcessor::extract_absolute_position_on_axis(Axis axis, const GCodeReader::GCodeLine& line, double area_filament_cross_section) +{ + if (line.has(Slic3r::Axis(axis))) { + bool is_relative = (m_global_positioning_type == EPositioningType::Relative); + if (axis == E) + is_relative |= (m_e_local_positioning_type == EPositioningType::Relative); + + const double lengthsScaleFactor = (m_units == EUnits::Inches) ? double(INCHES_TO_MM) : 1.0; + double ret = line.value(Slic3r::Axis(axis)) * lengthsScaleFactor; + if (axis == E && m_use_volumetric_e) + ret /= area_filament_cross_section; + return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret; + } + else + return m_start_position[axis]; +} +#endif // ENABLE_PROCESS_G2_G3_LINES + } /* namespace Slic3r */ diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 25375f61b6..59a91dc244 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -652,6 +652,11 @@ namespace Slic3r { void process_G0(const GCodeReader::GCodeLine& line); void process_G1(const GCodeReader::GCodeLine& line); +#if ENABLE_PROCESS_G2_G3_LINES + // Arc Move + void process_G2_G3(const GCodeReader::GCodeLine& line, bool clockwise); +#endif // ENABLE_PROCESS_G2_G3_LINES + // Retract void process_G10(const GCodeReader::GCodeLine& line); @@ -777,6 +782,10 @@ namespace Slic3r { void simulate_st_synchronize(float additional_time = 0.0f); void update_estimated_times_stats(); + +#if ENABLE_PROCESS_G2_G3_LINES + double extract_absolute_position_on_axis(Axis axis, const GCodeReader::GCodeLine& line, double area_filament_cross_section); +#endif // ENABLE_PROCESS_G2_G3_LINES }; } /* namespace Slic3r */ diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 635fc49943..f7df9e6963 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -84,6 +84,8 @@ #define ENABLE_NEW_CAMERA_MOVEMENTS (1 && ENABLE_2_5_0_ALPHA1) // Enable modified rectangle selection #define ENABLE_NEW_RECTANGLE_SELECTION (1 && ENABLE_2_5_0_ALPHA1) +// Enable processing of gcode G2 and G3 lines +#define ENABLE_PROCESS_G2_G3_LINES (1 && ENABLE_2_5_0_ALPHA1) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 2cac5e3566..8c1bb7707e 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -859,6 +859,36 @@ void Preview::update_moves_slider() if (view.endpoints.last < view.endpoints.first) return; +#if ENABLE_PROCESS_G2_G3_LINES + assert(view.endpoints.first <= view.current.first && view.current.first <= view.endpoints.last); + assert(view.endpoints.first <= view.current.last && view.current.last <= view.endpoints.last); + + std::vector values; + values.reserve(view.endpoints.last - view.endpoints.first + 1); + std::vector alternate_values; + alternate_values.reserve(view.endpoints.last - view.endpoints.first + 1); + unsigned int last_gcode_id = view.gcode_ids[view.endpoints.first]; + for (unsigned int i = view.endpoints.first; i <= view.endpoints.last; ++i) { + if (i > view.endpoints.first) { + // skip consecutive moves with same gcode id (resulting from processing G2 and G3 lines) + if (last_gcode_id == view.gcode_ids[i]) { + values.back() = static_cast(i + 1); + alternate_values.back() = static_cast(view.gcode_ids[i]); + continue; + } + else + last_gcode_id = view.gcode_ids[i]; + } + + values.emplace_back(static_cast(i + 1)); + alternate_values.emplace_back(static_cast(view.gcode_ids[i])); + } + + m_moves_slider->SetSliderValues(values); + m_moves_slider->SetSliderAlternateValues(alternate_values); + m_moves_slider->SetMaxValue(int(values.size()) - 1); + m_moves_slider->SetSelectionSpan(values.front() - 1, values.back() - 1); +#else std::vector values(view.endpoints.last - view.endpoints.first + 1); std::vector alternate_values(view.endpoints.last - view.endpoints.first + 1); unsigned int count = 0; @@ -873,6 +903,7 @@ void Preview::update_moves_slider() m_moves_slider->SetSliderAlternateValues(alternate_values); m_moves_slider->SetMaxValue(view.endpoints.last - view.endpoints.first); m_moves_slider->SetSelectionSpan(view.current.first - view.endpoints.first, view.current.last - view.endpoints.first); +#endif // ENABLE_PROCESS_G2_G3_LINES } void Preview::enable_moves_slider(bool enable) From 8ce9241c48605d192f36f3fa22d4b1e98e1ce662 Mon Sep 17 00:00:00 2001 From: Jebtrix Date: Sat, 29 Jan 2022 11:44:25 -0500 Subject: [PATCH 129/149] Set CMAKE_GENERATOR environment variable to ensure MSVC version used --- build_win.bat | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build_win.bat b/build_win.bat index de5030ee50..3dbdb0ad6e 100644 --- a/build_win.bat +++ b/build_win.bat @@ -164,6 +164,9 @@ IF NOT EXIST "%MSVC_DIR%" ( @ECHO ERROR: Compatible Visual Studio installation not found. 1>&2 GOTO :HELP ) +REM Cmake always defaults to latest supported MSVC generator. Let's make sure it uses what we select. +FOR /F "tokens=* USEBACKQ" %%I IN (`^""%VSWHERE%" %MSVC_FILTER% -nologo -property catalog_productLineVersion^"`) DO SET PS_PRODUCT_VERSION=%%I + REM Give the user a chance to cancel if we found something odd. IF "%PS_ASK_TO_CONTINUE%" EQU "" GOTO :BUILD_ENV @ECHO. @@ -183,6 +186,7 @@ SET PS_CURRENT_STEP=environment @ECHO ** Deps path: %PS_DESTDIR% @ECHO ** Using Microsoft Visual Studio installation found at: @ECHO ** %MSVC_DIR% +SET CMAKE_GENERATOR=Visual Studio %PS_VERSION% %PS_PRODUCT_VERSION% CALL "%MSVC_DIR%\Common7\Tools\vsdevcmd.bat" -arch=%PS_ARCH% -host_arch=%PS_ARCH_HOST% -app_platform=Desktop IF %ERRORLEVEL% NEQ 0 GOTO :END REM Need to reset the echo state after vsdevcmd.bat clobbers it. From 82fe599cae8c7501862b2daf0735aa262a7f6090 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 18 Mar 2022 14:12:29 +0100 Subject: [PATCH 130/149] Fixed warnings and build on MAC OS --- src/libslic3r/GCode/GCodeProcessor.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index aaab86bd62..340515d5ff 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -2897,12 +2897,12 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc return ret; }; - auto fake_g1_line = [this](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { + auto fake_g1_line = [](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { std::string ret = (boost::format("G1 X%1% Y%2%") % target[X] % target[Y]).str(); if (has_z) ret += (boost::format(" Z%1%") % target[Z]).str(); if (feedrate.has_value()) - ret += (boost::format(" F%1%") % feedrate.value()).str(); + ret += (boost::format(" F%1%") % *feedrate).str(); if (extrusion.has_value()) ret += (boost::format(" E%1%") % target[E]).str(); @@ -2921,7 +2921,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc const double theta_per_segment = arc.angle / double(segments); const double z_per_segment = arc.delta_z() / double(segments); - const double extruder_per_segment = (extrusion.has_value()) ? extrusion.value() / double(segments) : 0.0; + const double extruder_per_segment = (extrusion.has_value()) ? *extrusion / double(segments) : 0.0; double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation double sin_T = theta_per_segment; @@ -2942,7 +2942,6 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc static const size_t N_ARC_CORRECTION = 25; Vec3d curr_rel_arc_start = arc.relative_start(); - Vec3d curr_rel_arc_end = arc.relative_end(); std::string gcode; From 8a340a0cf72e6e6367da48be64a52b5ce836909f Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:39:30 +0100 Subject: [PATCH 131/149] Sync with PrusaSlicer-settings --- resources/profiles/Anycubic.idx | 1 + resources/profiles/Anycubic.ini | 101 +------------------------------- 2 files changed, 4 insertions(+), 98 deletions(-) diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index 47bdd8c271..232d534256 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.4.1-rc1 +0.1.1 Fixed before layer change g-code for Mega Zero. 0.1.0 Added Anycubic 4Max Pro 2.0 min_slic3r_version = 2.3.2-alpha0 0.0.12 Updated Anycubic i3 MEGA(S) profiles. diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index fd73c063e8..5640560411 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,7 +5,7 @@ name = Anycubic # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.1.0 +config_version = 0.1.1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -73,13 +73,6 @@ technology = FFF family = PREDATOR default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR -[printer_model:PHOTON MONO X] -name = Photon Mono X -variants = default -technology = SLA -family = PHOTON MONO -default_materials = Generic Blue Resin @MONO 0.05 - # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -742,7 +735,7 @@ filament_density = 1.27 [printer:*common_mega0*] printer_technology = FFF bed_shape = 0x0,220x0,220x220,0x220 -before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm +before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm\nG92 E0 between_objects_gcode = deretract_speed = 0 extruder_colour = #FFFF00 @@ -2238,92 +2231,4 @@ use_relative_e_distances = 0 use_volumetric_e = 0 variable_layer_height = 1 wipe = 0 -z_offset = 0 - -########## SLA printer presets ########## - -[sla_print:*common print ANYCUBIC SLA*] -compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ -layer_height = 0.05 -output_filename_format = [input_filename_base].pwmx -pad_edge_radius = 0.5 -pad_enable = 0 -pad_max_merge_distance = 50 -pad_wall_height = 0 -pad_wall_thickness = 1 -pad_wall_slope = 45 -faded_layers = 8 -slice_closing_radius = 0.005 -support_base_diameter = 3 -support_base_height = 1 -support_critical_angle = 45 -support_density_at_45 = 250 -support_density_at_horizontal = 500 -support_head_front_diameter = 0.4 -support_head_penetration = 0.4 -support_head_width = 3 -support_max_bridge_length = 10 -support_minimal_z = 0 -support_object_elevation = 5 -support_pillar_diameter = 1 -support_pillar_connection_mode = zigzag -support_pillar_widening_factor = 0 -supports_enable = 1 -support_small_pillar_diameter_percent = 60% - -[sla_print:0.05 Normal @ANYCUBIC] -inherits = *common print ANYCUBIC SLA* -layer_height = 0.05 - -########### Materials - -[sla_material:*common ANYCUBIC SLA*] -compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ -compatible_prints_condition = layer_height == 0.05 -exposure_time = 7 -initial_exposure_time = 40 -initial_layer_height = 0.05 -material_correction = 1,1,1 -material_notes = LIFT_DISTANCE=8.0\nLIFT_SPEED=2.5\nRETRACT_SPEED=3.0\nBOTTOM_LIFT_SPEED=2.0\nBOTTOM_LIFT_DISTANCE=9.0\nDELAY_BEFORE_EXPOSURE=0.5 - -[sla_material:*common 0.05 ANYCUBIC SLA*] -inherits = *common ANYCUBIC SLA* - -[sla_material:Generic Blue Resin @MONO 0.05] -inherits = *common 0.05 ANYCUBIC SLA* -exposure_time = 2.5 -initial_exposure_time = 40 -material_type = Tough -material_vendor = Generic -material_colour = #6080EC -compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ - -########## Printers - -[printer:Anycubic Photon Mono X] -printer_technology = SLA -printer_model = PHOTON MONO X -printer_variant = default -default_sla_material_profile = Generic Blue Resin @MONO 0.05 -default_sla_print_profile = 0.05 Normal @ANYCUBIC -thumbnails = 224x168 -sla_archive_format = pwmx -bed_shape = 1.48x1.02,193.48x1.02,193.48x121.02,1.48x121.02 -display_height = 120 -display_orientation = landscape -display_mirror_x = 1 -display_mirror_y = 0 -display_pixels_x = 3840 -display_pixels_y = 2400 -display_width = 192 -max_print_height = 245 -elefant_foot_compensation = 0.2 -elefant_foot_min_width = 0.2 -min_exposure_time = 1 -max_exposure_time = 120 -min_initial_exposure_time = 1 -max_initial_exposure_time = 300 -printer_correction = 1,1,1 -gamma_correction = 1 -area_fill = 45 -printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.'\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTONMONOX\n +z_offset = 0 \ No newline at end of file From b263ab9a8ea19fb8c965cb4568fdf775212c463d Mon Sep 17 00:00:00 2001 From: rtyr <36745189+rtyr@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:42:15 +0100 Subject: [PATCH 132/149] Readded Photon MONO X --- resources/profiles/Anycubic.ini | 4563 ++++++++++++++++--------------- 1 file changed, 2329 insertions(+), 2234 deletions(-) diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 5640560411..e8fd89bf4a 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -1,2234 +1,2329 @@ -# Print profiles for the Anycubic printers. - -[vendor] -# Vendor name will be shown by the Config Wizard. -name = Anycubic -# Configuration version of this file. Config file will only be installed, if the config_version differs. -# This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.1.1 -# Where to get the updates from? -config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ -# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% - -# The printer models will be shown by the Configuration Wizard in this order, -# also the first model installed & the first nozzle installed will be activated after install. -# Printer model name will be shown by the installation wizard. - -[printer_model:AKLP] -name = Anycubic Kossel Linear Plus -variants = 0.4 -technology = FFF -family = KOSSEL -bed_model = AKLP_Bed.stl -bed_texture = AK.svg -default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL - -[printer_model:AK] -name = Anycubic Kossel Pulley (Linear) -variants = 0.4 -technology = FFF -family = KOSSEL -bed_model = AK_Bed.stl -bed_texture = AK.svg -default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL - -[printer_model:MEGA0] -name = Anycubic Mega Zero -variants = 0.4 -technology = FFF -family = MEGA -bed_model = mega0_bed.stl -bed_texture = mega0.svg -default_materials = Generic PLA @MEGA0; Generic PETG @MEGA0; Anycubic PLA @MEGA0; Prusament PLA @MEGA0; Prusament PETG @MEGA0 - -[printer_model:I3MEGA] -name = Anycubic i3 Mega -variants = 0.4 -technology = FFF -family = MEGA -bed_model = i3megas_bed.stl -bed_texture = i3megas.svg - -[printer_model:I3MEGAS] -name = Anycubic i3 Mega S -variants = 0.4 -technology = FFF -family = MEGA -bed_model = i3megas_bed.stl -bed_texture = i3megas.svg - -[printer_model:4MAXPRO20] -name = Anycubic 4Max Pro 2.0 -variants = 0.4 -technology = FFF -family = 4Max -bed_model = 4MAXPRO20_bed.stl -bed_texture = 4MAXPRO20_texture.svg -default_materials = Generic PLA @4Max Pro 2.0; Generic TPU @4Max Pro 2.0; Generic ABS @4Max Pro 2.0 - -[printer_model:PREDATOR] -name = Anycubic Predator -variants = 0.4; 0.6; 0.8 -technology = FFF -family = PREDATOR -default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR - -# All presets starting with asterisk, for example *common*, are intermediate and they will -# not make it into the user interface. - -## Anycubic KOSSEL -## Author: https://github.com/tc0fh -## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4220 - -# Common print preset -[print:*common_akossel*] -avoid_crossing_perimeters = 0 -bottom_solid_min_thickness = 0.5 -bridge_angle = 0 -bridge_flow_ratio = 0.8 -bridge_speed = 30 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -complete_objects = 0 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 -extra_perimeters = 0 -extruder_clearance_height = 25 -extruder_clearance_radius = 45 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 20 -gap_fill_speed = 40 -gcode_comments = 0 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -interface_shells = 0 -max_print_speed = 200 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -overhangs = 0 -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode -perimeters = 2 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -perimeter_speed = 45 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -single_extruder_multi_material_priming = 0 -skirts = 2 -skirt_distance = 5 -skirt_height = 1 -small_perimeter_speed = 25 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.38 -support_material_interface_extruder = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_enforce_layers = 0 -support_material_contact_distance = 0.15 -support_material_interface_contact_loops = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 50 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -top_solid_min_thickness = 0.6 -travel_speed = 180 -wipe_tower = 1 -wipe_tower_bridging = 10 -wipe_tower_rotation_angle = 0 -wipe_tower_width = 60 -wipe_tower_x = 170 -wipe_tower_y = 140 -xy_size_compensation = 0 -bridge_acceleration = 1000 -default_acceleration = 1500 -first_layer_acceleration = 1000 -infill_acceleration = 1500 -perimeter_acceleration = 800 - -[print:*0.08mm_akossel*] -inherits = *common_akossel* -bottom_solid_layers = 10 -bridge_acceleration = 300 -bridge_flow_ratio = 0.7 -bridge_speed = 20 -external_perimeter_speed = 20 -first_layer_acceleration = 500 -gap_fill_speed = 20 -infill_acceleration = 800 -infill_speed = 40 -layer_height = 0.08 -max_print_speed = 80 -perimeter_acceleration = 300 -perimeter_speed = 30 -perimeters = 3 -small_perimeter_speed = 20 -solid_infill_speed = 40 -support_material_extrusion_width = 0.3 -support_material_spacing = 1.5 -support_material_speed = 40 -top_solid_infill_speed = 30 -top_solid_layers = 12 - -[print:*0.16mm_akossel*] -inherits = *common_akossel* -bottom_solid_layers = 5 -layer_height = 0.16 -top_solid_layers = 6 - -[print:*0.20mm_akossel*] -inherits = *common_akossel* -bottom_solid_layers = 4 -bridge_flow_ratio = 0.95 -layer_height = 0.20 -top_solid_layers = 5 - -[print:*0.24mm_akossel*] -inherits = *common_akossel* -bottom_solid_layers = 4 -bridge_flow_ratio = 0.95 -layer_height = 0.24 -perimeter_speed = 50 -external_perimeter_speed = 35 -top_solid_layers = 4 -infill_speed = 100 -solid_infill_speed = 100 -top_solid_infill_speed = 40 - -[print:*0.30mm_akossel*] -inherits = *common_akossel* -bottom_solid_layers = 3 -bridge_flow_ratio = 0.95 -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 35 -extrusion_width = 0.5 -infill_extrusion_width = 0.5 -infill_speed = 70 -layer_height = 0.30 -perimeter_extrusion_width = 0.5 -perimeter_speed = 50 -small_perimeter_speed = 30 -solid_infill_extrusion_width = 0.5 -solid_infill_speed = 70 -support_material_speed = 45 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 50 -top_solid_layers = 3 - -[print:0.08mm ULTRADETAIL @AKOSSEL] -inherits = *0.08mm_akossel* -fill_density = 15% -fill_pattern = gyroid -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.16mm QUALITY @AKOSSEL] -inherits = *0.16mm_akossel* -external_perimeter_speed = 25 -fill_density = 15% -fill_pattern = gyroid -infill_speed = 80 -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.16mm SPEED @AKOSSEL] -inherits = *0.16mm_akossel* -external_perimeter_speed = 35 -infill_speed = 120 -perimeter_speed = 60 -solid_infill_speed = 120 -top_solid_infill_speed = 50 -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.20mm QUALITY @AKOSSEL] -inherits = *0.20mm_akossel* -external_perimeter_speed = 25 -fill_density = 15% -fill_pattern = gyroid -infill_speed = 80 -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.20mm SPEED @AKOSSEL] -inherits = *0.20mm_akossel* -external_perimeter_speed = 35 -infill_speed = 120 -perimeter_speed = 60 -solid_infill_speed = 120 -top_solid_infill_speed = 50 -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.24mm DRAFT @AKOSSEL] -inherits = *0.24mm_akossel* -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -[print:0.30mm FAST @AKOSSEL] -inherits = *0.30mm_akossel* -compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 - -# Common filament preset -[filament:*common_akossel*] -cooling = 0 -compatible_printers = -extrusion_multiplier = 1 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_notes = "" -filament_settings_id = "" -filament_soluble = 0 -min_print_speed = 15 -slowdown_below_layer_time = 20 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_Anycubic.*/ and printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ - -[filament:*PLA_akossel*] -inherits = *common_akossel* -bed_temperature = 60 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_max_volumetric_speed = 10 -filament_type = PLA -filament_density = 1.24 -filament_cost = 20 -first_layer_bed_temperature = 60 -first_layer_temperature = 200 -fan_always_on = 1 -cooling = 1 -max_fan_speed = 100 -min_fan_speed = 100 -bridge_fan_speed = 100 -disable_fan_first_layers = 1 -temperature = 200 - -[filament:*PET_akossel*] -inherits = *common_akossel* -bed_temperature = 70 -cooling = 1 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_max_volumetric_speed = 8 -filament_type = PETG -filament_density = 1.27 -filament_cost = 30 -first_layer_bed_temperature =70 -first_layer_temperature = 240 -fan_always_on = 1 -max_fan_speed = 50 -min_fan_speed = 20 -bridge_fan_speed = 100 -temperature = 240 - -[filament:*ABS_akossel*] -inherits = *common_akossel* -bed_temperature = 100 -cooling = 0 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_max_volumetric_speed = 10 -filament_type = ABS -filament_density = 1.04 -filament_cost = 20 -first_layer_bed_temperature = 100 -first_layer_temperature = 245 -fan_always_on = 0 -max_fan_speed = 0 -min_fan_speed = 0 -bridge_fan_speed = 30 -top_fan_speed = 0 -temperature = 245 - -[filament:Generic PLA @AKOSSEL] -inherits = *PLA_akossel* -filament_vendor = Generic - -[filament:Generic PETG @AKOSSEL] -inherits = *PET_akossel* -filament_vendor = Generic - -[filament:Generic ABS @AKOSSEL] -inherits = *ABS_akossel* -filament_vendor = Generic - -# Common printer preset -[printer:*common_akossel*] -printer_technology = FFF -bed_shape = -before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z] -between_objects_gcode = -deretract_speed = 40 -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -silent_mode = 0 -remaining_times = 0 -machine_max_acceleration_e = 3000 -machine_max_acceleration_extruding = 1000 -machine_max_acceleration_retracting = 1000 -machine_max_acceleration_x = 1500 -machine_max_acceleration_y = 1500 -machine_max_acceleration_z = 1500 -machine_max_feedrate_e = 60 -machine_max_feedrate_x = 200 -machine_max_feedrate_y = 200 -machine_max_feedrate_z = 200 -machine_max_jerk_e = 5 -machine_max_jerk_x = 5 -machine_max_jerk_y = 5 -machine_max_jerk_z = 5 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.3 -min_layer_height = 0.08 -max_print_height = 300 -nozzle_diameter = 0.4 -printer_notes = -printer_settings_id = -retract_before_travel = 2 -retract_before_wipe = 70% -retract_layer_change = 1 -retract_length = 5 -retract_length_toolchange = 1 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 60 -single_extruder_multi_material = 0 -start_gcode = -end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG28 ; home\nM84 ; disable motors -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 -default_print_profile = 0.20mm QUALITY @AKOSSEL -default_filament_profile = Generic PLA @AKOSSEL - -[printer:Anycubic Kossel Linear Plus] -inherits = *common_akossel* -printer_model = AKLP -printer_variant = 0.4 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Anycubic\nPRINTER_MODEL_AKLP\nPRINTER_HAS_BOWDEN\n -bed_shape = 114.562x10.0229,113.253x19.9695,111.081x29.7642,108.065x39.3323,104.225x48.6011,99.5929x57.5,94.2025x65.9613,88.0951x73.9206,81.3173x81.3173,73.9206x88.0951,65.9613x94.2025,57.5x99.5929,48.6011x104.225,39.3323x108.065,29.7642x111.081,19.9695x113.253,10.0229x114.562,7.04172e-15x115,-10.0229x114.562,-19.9695x113.253,-29.7642x111.081,-39.3323x108.065,-48.6011x104.225,-57.5x99.5929,-65.9613x94.2025,-73.9206x88.0951,-81.3173x81.3173,-88.0951x73.9206,-94.2025x65.9613,-99.5929x57.5,-104.225x48.6011,-108.065x39.3323,-111.081x29.7642,-113.253x19.9695,-114.562x10.0229,-115x1.40834e-14,-114.562x-10.0229,-113.253x-19.9695,-111.081x-29.7642,-108.065x-39.3323,-104.225x-48.6011,-99.5929x-57.5,-94.2025x-65.9613,-88.0951x-73.9206,-81.3173x-81.3173,-73.9206x-88.0951,-65.9613x-94.2025,-57.5x-99.5929,-48.6011x-104.225,-39.3323x-108.065,-29.7642x-111.081,-19.9695x-113.253,-10.0229x-114.562,-2.11252e-14x-115,10.0229x-114.562,19.9695x-113.253,29.7642x-111.081,39.3323x-108.065,48.6011x-104.225,57.5x-99.5929,65.9613x-94.2025,73.9206x-88.0951,81.3173x-81.3173,88.0951x-73.9206,94.2025x-65.9613,99.5929x-57.5,104.225x-48.6011,108.065x-39.3323,111.081x-29.7642,113.253x-19.9695,114.562x-10.0229,115x-2.81669e-14 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-54.672 Y95.203 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-52.931 Y96.185 E0.300\nG1 X-50.985 Y97.231 E0.331\nG1 X-49.018 Y98.238 E0.331\nG1 X-47.032 Y99.205 E0.331\nG1 X-45.026 Y100.132 E0.331\nG1 X-43.003 Y101.019 E0.331\nG1 X-40.961 Y101.864 E0.331\nG1 X-38.904 Y102.668 E0.331\nG1 X-36.83 Y103.431 E0.331\nG1 X-34.742 Y104.152 E0.331\nG1 X-32.639 Y104.83 E0.331\nG1 X-30.523 Y105.466 E0.331\nG1 X-28.395 Y106.06 E0.331\nG1 X-26.255 Y106.61 E0.331\nG1 X-24.105 Y107.117 E0.331\nG1 X-21.945 Y107.581 E0.331\nG1 X-19.776 Y108.001 E0.331\nG1 X-17.599 Y108.377 E0.331\nG1 X-15.415 Y108.71 E0.331\nG1 X-13.224 Y108.998 E0.331\nG1 X-11.028 Y109.242 E0.331\nG1 X-8.828 Y109.442 E0.331\nG1 X-6.624 Y109.598 E0.331\nG1 X-4.418 Y109.709 E0.331\nG1 X-2.209 Y109.776 E0.332\nG1 X0 Y109.798 E0.331\nG1 X2.209 Y109.776 E0.690\nG1 X4.418 Y109.709 E0.691\nG1 X6.624 Y109.598 E0.690\nG1 X8.828 Y109.442 E0.690\nG1 X11.028 Y109.242 E0.690\nG1 X13.224 Y108.998 E0.690\nG1 X15.415 Y108.71 E0.691\nG1 X17.599 Y108.377 E0.690\nG1 X19.776 Y108.001 E0.690\nG1 X21.945 Y107.581 E0.690\nG1 X24.105 Y107.117 E0.690\nG1 X26.255 Y106.61 E0.690\nG1 X28.395 Y106.06 E0.690\nG1 X30.523 Y105.466 E0.690\nG1 X32.639 Y104.83 E0.690\nG1 X34.742 Y104.152 E0.690\nG1 X36.83 Y103.431 E0.690\nG1 X38.904 Y102.668 E0.691\nG1 X40.961 Y101.864 E0.690\nG1 X43.003 Y101.019 E0.691\nG1 X45.026 Y100.132 E0.690\nG1 X47.032 Y99.205 E0.691\nG1 X49.018 Y98.238 E0.690\nG1 X50.985 Y97.231 E0.691\nG1 X52.931 Y96.185 E0.690\nG1 X54.672 Y95.203 E0.625\nG92 E0.0\nG1 E-5 F3000 ; retract 5mm\nG1 X52.931 Y96.185 F1000 ; wipe\nG1 X50.985 Y97.231 F1000 ; wipe\nG1 X49.018 Y98.238 F1000 ; wipe\nG1 X0 Y109.798 F1000\nG1 E4.8 F1500; de-retract\nG92 E0.0 ; reset extrusion distance\nM221 S{if layer_height<0.075}100{else}95{endif} - -[printer:Anycubic Kossel Pulley (Linear)] -inherits = *common_akossel* -printer_model = AK -printer_variant = 0.4 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Anycubic\nPRINTER_MODEL_AK\nPRINTER_HAS_BOWDEN\n -bed_shape = 89.6575x7.84402,88.6327x15.6283,86.9333x23.2937,84.5723x30.7818,81.5677x38.0356,77.9423x45,73.7237x51.6219,68.944x57.8509,63.6396x63.6396,57.8509x68.944,51.6219x73.7237,45x77.9423,38.0356x81.5677,30.7818x84.5723,23.2937x86.9333,15.6283x88.6327,7.84402x89.6575,5.51091e-15x90,-7.84402x89.6575,-15.6283x88.6327,-23.2937x86.9333,-30.7818x84.5723,-38.0356x81.5677,-45x77.9423,-51.6219x73.7237,-57.8509x68.944,-63.6396x63.6396,-68.944x57.8509,-73.7237x51.6219,-77.9423x45,-81.5677x38.0356,-84.5723x30.7818,-86.9333x23.2937,-88.6327x15.6283,-89.6575x7.84402,-90x1.10218e-14,-89.6575x-7.84402,-88.6327x-15.6283,-86.9333x-23.2937,-84.5723x-30.7818,-81.5677x-38.0356,-77.9423x-45,-73.7237x-51.6219,-68.944x-57.8509,-63.6396x-63.6396,-57.8509x-68.944,-51.6219x-73.7237,-45x-77.9423,-38.0356x-81.5677,-30.7818x-84.5723,-23.2937x-86.9333,-15.6283x-88.6327,-7.84402x-89.6575,-1.65327e-14x-90,7.84402x-89.6575,15.6283x-88.6327,23.2937x-86.9333,30.7818x-84.5723,38.0356x-81.5677,45x-77.9423,51.6219x-73.7237,57.8509x-68.944,63.6396x-63.6396,68.944x-57.8509,73.7237x-51.6219,77.9423x-45,81.5677x-38.0356,84.5723x-30.7818,86.9333x-23.2937,88.6327x-15.6283,89.6575x-7.84402,90x-2.20436e-14 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-39.672 Y69.712 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-38.457 Y70.397 E0.209\nG1 X-37.043 Y71.157 E0.241\nG1 X-35.614 Y71.889 E0.241\nG1 X-34.171 Y72.591 E0.241\nG1 X-32.714 Y73.265 E0.241\nG1 X-31.244 Y73.909 E0.241\nG1 X-29.761 Y74.523 E0.241\nG1 X-28.266 Y75.108 E0.241\nG1 X-26.759 Y75.662 E0.241\nG1 X-25.242 Y76.185 E0.241\nG1 X-23.714 Y76.678 E0.241\nG1 X-22.177 Y77.14 E0.241\nG1 X-20.63 Y77.571 E0.241\nG1 X-19.076 Y77.971 E0.241\nG1 X-17.514 Y78.34 E0.241\nG1 X-15.944 Y78.677 E0.241\nG1 X-14.368 Y78.982 E0.241\nG1 X-12.786 Y79.255 E0.241\nG1 X-11.199 Y79.497 E0.241\nG1 X-9.608 Y79.706 E0.241\nG1 X-8.013 Y79.884 E0.241\nG1 X-6.414 Y80.029 E0.241\nG1 X-4.813 Y80.142 E0.241\nG1 X-3.21 Y80.223 E0.241\nG1 X-1.605 Y80.271 E0.241\nG1 X0 Y80.287 E0.241\nG1 X1.605 Y80.271 E0.502\nG1 X3.21 Y80.223 E0.502\nG1 X4.813 Y80.142 E0.502\nG1 X6.414 Y80.029 E0.502\nG1 X8.013 Y79.884 E0.502\nG1 X9.608 Y79.706 E0.502\nG1 X11.199 Y79.497 E0.501\nG1 X12.786 Y79.255 E0.502\nG1 X14.368 Y78.982 E0.502\nG1 X15.944 Y78.677 E0.502\nG1 X17.514 Y78.34 E0.502\nG1 X19.076 Y77.971 E0.502\nG1 X20.63 Y77.571 E0.501\nG1 X22.177 Y77.14 E0.502\nG1 X23.714 Y76.678 E0.502\nG1 X25.242 Y76.185 E0.502\nG1 X26.759 Y75.662 E0.501\nG1 X28.266 Y75.108 E0.502\nG1 X29.761 Y74.523 E0.502\nG1 X31.244 Y73.909 E0.502\nG1 X32.714 Y73.265 E0.502\nG1 X34.171 Y72.591 E0.502\nG1 X35.614 Y71.889 E0.501\nG1 X37.043 Y71.157 E0.502\nG1 X38.457 Y70.397 E0.502\nG1 X39.672 Y69.712 E0.436\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} - -## Anycubic MEGA ZERO -## Author: https://github.com/kad -## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4057 - -# Common print preset -[print:*common_mega0*] -avoid_crossing_perimeters = 1 -bridge_angle = 0 -bridge_flow_ratio = 0.7 -bridge_speed = 25 -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers = -complete_objects = 0 -dont_support_bridges = 1 -elefant_foot_compensation = 0 -ensure_vertical_shell_thickness = 1 -external_fill_pattern = rectilinear -external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 -extra_perimeters = 0 -extruder_clearance_height = 25 -extruder_clearance_radius = 45 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = grid -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 20 -gap_fill_speed = 30 -gcode_comments = 0 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0.45 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 25% -interface_shells = 0 -max_print_speed = 100 -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -max_volumetric_speed = 0 -min_skirt_length = 4 -notes = -overhangs = 1 -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode -perimeters = 2 -perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 -post_process = -print_settings_id = -raft_layers = 0 -resolution = 0 -seam_position = nearest -single_extruder_multi_material_priming = 1 -skirts = 2 -skirt_distance = 2 -skirt_height = 2 -small_perimeter_speed = 25 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0.45 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_extruder = 0 -support_material_extrusion_width = 0.4 -support_material_interface_extruder = 0 -support_material_angle = 0 -support_material_buildplate_only = 0 -support_material_enforce_layers = 0 -support_material_contact_distance = 0.15 -support_material_interface_contact_loops = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 100% -support_material_pattern = rectilinear -support_material_spacing = 2 -support_material_speed = 40 -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 0 -support_material_xy_spacing = 60% -thin_walls = 0 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -travel_speed = 100 -wipe_tower = 0 -wipe_tower_bridging = 10 -wipe_tower_rotation_angle = 0 -wipe_tower_width = 60 -wipe_tower_x = 170 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:*0.10mm_mega0*] -inherits = *common_mega0* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 -layer_height = 0.10 -perimeters = 3 -top_infill_extrusion_width = 0.4 -bottom_solid_layers = 6 -top_solid_layers = 7 - -[print:*0.20mm_mega0*] -inherits = *common_mega0* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 -layer_height = 0.20 -top_infill_extrusion_width = 0.4 -bottom_solid_layers = 4 -top_solid_layers = 5 - -[print:*0.30mm_mega0*] -inherits = *common_mega0* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 -layer_height = 0.24 -top_infill_extrusion_width = 0.45 -bottom_solid_layers = 3 -top_solid_layers = 4 - -[print:0.10mm DETAIL @MEGA0] -inherits = *0.10mm_mega0* -travel_speed = 120 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 - -[print:0.20mm NORMAL @MEGA0] -inherits = *0.20mm_mega0* -travel_speed = 120 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 - -[print:0.30mm DRAFT @MEGA0] -inherits = *0.30mm_mega0* -travel_speed = 120 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 - -# Common filament preset -[filament:*common_mega0*] -cooling = 0 -compatible_printers = -extrusion_multiplier = 1 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_notes = "" -filament_settings_id = "" -filament_soluble = 0 -min_print_speed = 15 -slowdown_below_layer_time = 20 -compatible_printers_condition = printer_model=="MEGA0" - -[filament:*PLA_mega0*] -inherits = *common_mega0* -bed_temperature = 40 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_max_volumetric_speed = 15 -filament_type = PLA -filament_density = 1.24 -filament_cost = 20 -first_layer_bed_temperature = 40 -first_layer_temperature = 215 -fan_always_on = 1 -cooling = 1 -max_fan_speed = 100 -min_fan_speed = 100 -bridge_fan_speed = 100 -disable_fan_first_layers = 1 -temperature = 210 - -[filament:*PET_mega0*] -inherits = *common_mega0* -bed_temperature = 70 -cooling = 1 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_max_volumetric_speed = 8 -filament_type = PETG -filament_density = 1.27 -filament_cost = 30 -first_layer_bed_temperature =70 -first_layer_temperature = 240 -fan_always_on = 1 -max_fan_speed = 50 -min_fan_speed = 20 -bridge_fan_speed = 100 -temperature = 240 - -[filament:*ABS_mega0*] -inherits = *common_mega0* -bed_temperature = 100 -cooling = 0 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_max_volumetric_speed = 11 -filament_type = ABS -filament_density = 1.04 -filament_cost = 20 -first_layer_bed_temperature = 100 -first_layer_temperature = 245 -fan_always_on = 0 -max_fan_speed = 0 -min_fan_speed = 0 -bridge_fan_speed = 30 -top_fan_speed = 0 -temperature = 245 - -[filament:Generic PLA @MEGA0] -inherits = *PLA_mega0* -filament_vendor = Generic - -[filament:Generic PETG @MEGA0] -inherits = *PET_mega0* -filament_vendor = Generic - -[filament:Generic ABS @MEGA0] -inherits = *ABS_mega0* -filament_vendor = Generic - -[filament:Anycubic PLA @MEGA0] -inherits = *PLA_mega0* -filament_vendor = Anycubic -temperature = 190 -first_layer_temperature = 195 -filament_cost = 24.99 -filament_density = 1.25 - -[filament:Prusament PLA @MEGA0] -inherits = *PLA_mega0* -filament_vendor = Prusa Polymers -temperature = 215 -bed_temperature = 40 -first_layer_temperature = 215 -filament_cost = 24.99 -filament_density = 1.24 - -[filament:Prusament PETG @MEGA0] -inherits = *PET_mega0* -filament_vendor = Prusa Polymers -temperature = 245 -bed_temperature = 70 -first_layer_temperature = 245 -filament_cost = 24.99 -filament_density = 1.27 - -# Common printer preset -[printer:*common_mega0*] -printer_technology = FFF -bed_shape = 0x0,220x0,220x220,0x220 -before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm\nG92 E0 -between_objects_gcode = -deretract_speed = 0 -extruder_colour = #FFFF00 -extruder_offset = 0x0 -gcode_flavor = marlin -silent_mode = 0 -remaining_times = 0 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 2000 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 3000 -machine_max_acceleration_y = 3000 -machine_max_acceleration_z = 500 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 12 -machine_max_jerk_e = 2.5 -machine_max_jerk_x = 20 -machine_max_jerk_y = 20 -machine_max_jerk_z = 0.4 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -layer_gcode = ; AFTER_LAYER_CHANGE [layer_num] @ [layer_z]mm -max_layer_height = 0.3 -min_layer_height = 0.1 -max_print_height = 200 -nozzle_diameter = 0.4 -printer_notes = -printer_settings_id = -retract_before_travel = 1 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 6 -retract_length_toolchange = 1 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 30 -single_extruder_multi_material = 0 -start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n -end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n -toolchange_gcode = -use_firmware_retraction = 0 -use_relative_e_distances = 1 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 1 -z_offset = 0 -printer_model = -default_print_profile = -default_filament_profile = - -[printer:Anycubic Mega Zero] -inherits = *common_mega0* -printer_model = MEGA0 -printer_variant = 0.4 -max_layer_height = 0.3 -min_layer_height = 0.1 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_MEGA0 -bed_shape = 0x0,220x0,220x220,0x220 -max_print_height = 250 -machine_max_acceleration_e = 5000 -machine_max_acceleration_extruding = 500 -machine_max_acceleration_retracting = 500 -machine_max_acceleration_x = 500 -machine_max_acceleration_y = 500 -machine_max_acceleration_z = 100 -machine_max_feedrate_e = 25 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 5 -machine_max_jerk_e = 5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.4 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -nozzle_diameter = 0.4 -retract_before_travel = 2 -retract_layer_change = 0 -retract_length = 7 -retract_speed = 30 -retract_lift = 0.2 -deretract_speed = 30 -retract_before_wipe = 70% -default_print_profile = 0.20mm NORMAL @MEGA0 -default_filament_profile = Anycubic PLA @MEGA0 -start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; set extruder temp\nM109 S[first_layer_temperature]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n -end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n - -## Anycubic i3 Mega and i3 Mega S -## Author: https://github.com/Igami -## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4619 - -[print:*common_mega*] -bottom_solid_min_thickness = 0.5 -bridge_acceleration = 1000 -bridge_flow_ratio = 0.95 -bridge_speed = 25 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ and nozzle_diameter[0]==0.4 -default_acceleration = 1000 -ensure_vertical_shell_thickness = 1 -external_perimeter_extrusion_width = 0.45 -external_perimeter_speed = 40 -extruder_clearance_height = 35 -extruder_clearance_radius = 60 -extrusion_width = 0.45 -fill_density = 15% -fill_pattern = gyroid -first_layer_acceleration = 800 -first_layer_extrusion_width = 0.42 -first_layer_height = 0.2 -first_layer_speed = 20 -gap_fill_speed = 40 -gcode_comments = 0 -gcode_label_objects = 1 -infill_acceleration = 1000 -infill_anchor = 2.5 -infill_anchor_max = 12 -infill_extrusion_width = 0.45 -max_print_speed = 100 -min_skirt_length = 4 -only_retract_when_crossing_perimeters = 0 -output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode -perimeter_acceleration = 800 -perimeter_extrusion_width = 0.45 -perimeter_speed = 50 -perimeters = 2 -seam_position = nearest -skirt_distance = 2 -skirt_height = 3 -skirts = 1 -small_perimeter_speed = 25 -solid_infill_below_area = 0 -solid_infill_extrusion_width = 0.45 -solid_infill_speed = 50 -support_material = 0 -support_material_buildplate_only = 0 -support_material_contact_distance = 0.1 -support_material_extrusion_width = 0.35 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_speed = 80% -support_material_spacing = 2 -support_material_speed = 50 -support_material_threshold = 50 -support_material_xy_spacing = 60% -thin_walls = 0 -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 40 -top_solid_min_thickness = 0.7 -travel_speed = 180 - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.15mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - -[print:*0.15mm_mega*] -inherits = *common_mega* -bottom_solid_layers = 5 -bridge_flow_ratio = 1 -infill_speed = 60 -layer_height = 0.15 -top_solid_layers = 7 - -[print:0.15mm QUALITY @MEGA] -inherits = *0.15mm_mega* - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.20mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - -[print:*0.20mm_mega*] -inherits = *common_mega* -bottom_solid_layers = 4 -infill_speed = 60 -layer_height = 0.2 -top_solid_layers = 5 - -[print:0.20mm QUALITY @MEGA] -inherits = *0.20mm_mega* - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.30mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - -[print:*0.30mm_mega*] -inherits = *common_mega* -bottom_solid_layers = 4 -external_perimeter_extrusion_width = 0.6 -external_perimeter_speed = 35 -extrusion_width = 0.5 -fill_pattern = cubic -infill_extrusion_width = 0.5 -infill_speed = 85 -layer_height = 0.3 -perimeter_extrusion_width = 0.5 -small_perimeter_speed = 30 -solid_infill_extrusion_width = 0.5 -support_material_extrusion_width = 0.38 -support_material_speed = 45 -top_solid_layers = 4 - -[print:0.30mm DRAFT @MEGA] -inherits = *0.30mm_mega* - -# XXXXXXXXXXXXXXXXXXXXXX -# XXX--- filament ---XXX -# XXXXXXXXXXXXXXXXXXXXXX - -[filament:*common_mega*] -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ -end_filament_gcode = "; Filament-specific end gcode" -fan_always_on = 1 -fan_below_layer_time = 100 -filament_vendor = Generic -min_print_speed = 15 -slowdown_below_layer_time = 20 - -[filament:*ABS_mega*] - inherits = *common_mega* - bed_temperature = 110 - bridge_fan_speed = 25 - cooling = 0 - fan_always_on = 0 - fan_below_layer_time = 20 - filament_colour = #3A80CA - filament_cost = 27.82 - filament_density = 1.04 - filament_max_volumetric_speed = 11 - filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" - filament_type = ABS - first_layer_bed_temperature = 105 - first_layer_temperature = 255 - max_fan_speed = 30 - min_fan_speed = 20 - temperature = 255 - -[filament:Generic ABS @MEGA] -inherits = *ABS_mega* - -[filament:*FLEX_mega*] -inherits = *common_mega* -bed_temperature = 50 -bridge_fan_speed = 80 -cooling = 0 -extrusion_multiplier = 1.15 -fan_always_on = 0 -filament_colour = #008000 -filament_cost = 82.00 -filament_density = 1.22 -filament_deretract_speed = 25 -filament_max_volumetric_speed = 1.2 -filament_retract_length = 0.8 -filament_type = FLEX -first_layer_bed_temperature = 55 -first_layer_temperature = 240 -max_fan_speed = 90 -min_fan_speed = 70 -temperature = 240 - -[filament:Generic FLEX @MEGA] -inherits = *FLEX_mega* - -[filament:SainSmart TPU @MEGA] -inherits = *FLEX_mega* -filament_vendor = SainSmart -bed_temperature = 50 -bridge_fan_speed = 100 -cooling = 1 -disable_fan_first_layers = 4 -filament_cost = 39.99 -filament_density = 1.21 -filament_deretract_speed = 15 -filament_max_volumetric_speed = 1.8 -filament_notes = "SainSmart TPU gains popularity among 3D Printing community for its balance of rigidity and flexibility. In addition, with a 95A Shore Hardness and improved bed adhesion, it is easier to print even with a stock elementary 3D Printer like the Creality Ender 3. SainSmart TPU will not disappoint if you are looking for flexible filament. From drone parts, phone cases, to small toys, all can be printed with ease.\n\nhttps://www.sainsmart.com/collections/tpu-filament/products/all-colors-tpu-flexible-filament-1-75mm-0-8kg-1-76lb" -filament_retract_before_travel = 5 -filament_retract_length = 4 -filament_retract_speed = 40 -filament_unloading_speed = 90 -first_layer_bed_temperature = 55 -first_layer_temperature = 235 -full_fan_speed_layer = 6 -max_fan_speed = 80 -min_fan_speed = 80 -slowdown_below_layer_time = 10 -temperature = 235 - -[filament:*PETG_mega*] -inherits = *common_mega* -bed_temperature = 90 -bridge_fan_speed = 50 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_cost = 27.82 -filament_density = 1.27 -filament_max_volumetric_speed = 8 -filament_type = PETG -first_layer_bed_temperature = 90 -first_layer_temperature = 230 -max_fan_speed = 50 -min_fan_speed = 30 -temperature = 240 - -[filament:Generic PETG @MEGA] -inherits = *PETG_mega* - -[filament:ColorFabb XT-CF20 @MEGA] -inherits = *PETG_mega* -compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ -extrusion_multiplier = 1.05 -filament_colour = #804040 -filament_cost = 66.60 -filament_density = 1.35 -filament_deretract_speed = 25 -filament_max_volumetric_speed = 2 -filament_notes = "Based on colorFabb_XT, XT-CF20 is a carbon fiber composite material. Loaded with no less than 20% specially sourced carbon fibers we have developed a very stiff and tough 3D printing filament made for functional parts. It is truly a professional printers go-to material, especially for users looking for high melt strength, high melt viscosity and good dimensional accuracy and stability.\n\nhttps://colorfabb.com/xt-cf20" -filament_retract_before_travel = 1 -filament_retract_length = 1.4 -filament_retract_speed = 40 -filament_spool_weight = 236 -filament_vendor = ColorFabb -first_layer_temperature = 260 -full_fan_speed_layer = 5 -slowdown_below_layer_time = 15 -temperature = 260 - -[filament:ERYONE PETG @MEGA] -inherits = *PETG_mega* -filament_vendor = ERYONE -filament_cost = 20.99 -filament_notes = "https://eryone.com/petg/show/10.html" - -[filament:FormFutura HDglass @MEGA] -inherits = *PETG_mega* -filament_vendor = FormFutura -filament_cost = 46.65 -filament_notes = "HDglass is a high performance PETG type of 3D printer with unsurpassed 3D printing properties and improved mechanical strength, flexibility, toughness and heat resistance.\n\nhttps://www.formfutura.com/shop/product/hdglass-2812" - -[filament:FormFutura ReForm rPET @MEGA] -inherits = *PETG_mega* -filament_vendor = FormFutura -filament_cost = 26.65 -filament_notes = "ReForm rPET is a recycled PETG type of 3D printer filament that is made from post-industrial waste streams of a nearby located plastic bottle manufacturer.\n\nhttps://www.formfutura.com/shop/product/reform-rpet-2836" -filament_spool_weight = 176 - -[filament:Janbex transparent PETG @MEGA] -inherits = *PETG_mega* -filament_vendor = Janbex -filament_cost = 31.99 -filament_spool_weight = 222 -first_layer_temperature = 215 -min_fan_speed = 100 -temperature = 210 - -[filament:DAS FILAMENT PETG @MEGA] -inherits = *PETG_mega* -filament_vendor = DAS FILAMENT -bed_temperature = 75 -first_layer_bed_temperature = 75 -first_layer_temperature = 220 -temperature = 225 - -[filament:*PLA_mega*] -inherits = *common_mega* -bed_temperature = 60 -disable_fan_first_layers = 1 -filament_colour = #FF3232 -filament_cost = 25.40 -filament_density = 1.24 -filament_max_volumetric_speed = 10 -first_layer_bed_temperature = 65 -first_layer_temperature = 215 -min_fan_speed = 100 -temperature = 210 - -[filament:Generic PLA @MEGA] -inherits = *PLA_mega* - -[filament:3Dmensionals PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = 3Dmensionals -filament_cost = 22.90 -filament_notes = "Das 3DFilaments - PLA von 3Dmensionals ist ein sehr leicht zu druckendes 3D-Drucker Filament. Dabei handelt es sich um ein etwas härteres PLA mit einer exzellenten thermischen Stabilität. Das Filament zeichnet sich vor allem durch verzugfreies 3D-Drucken aus und weist minimale bis keine Verformung nach dem Abkühlen auf. Daher ist es besonders gut für den Druck größerer Objekte geeignet. Zudem bietet 3DFilaments - PLA über die gesamte Fadenläge eine hervorragende Durchmesser- und Rundheitstoleranz.\n\nhttps://www.3dmensionals.de/3dfilaments?number=PSU3DM001V" - -[filament:3D Warhorse PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = 3D Warhorse -filament_cost = 19.99 - -[filament:AMOLEN wood PLA] -inherits = *PLA_mega* -filament_vendor = AMOLEN -compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ -extrusion_multiplier = 1.1 -filament_colour = #DFC287 -filament_cost = 33.99 -filament_density = 1.23 -filament_max_volumetric_speed = 9 -filament_notes = "https://amolen.com/collections/wood/products/amolen-pla-filament-1-75mm-wood-color-3d-printer-filament-1kg2-2lb" - -[filament:FormFutura EasyFil PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = FormFutura -filament_cost = 39.93 -filament_notes = "EasyFil PLA is an easy to print PLA type of 3D printer filament that is available in a wide variety of colors. Its improved flowing behavior make 3D printed layers flow more into each other.\n\nhttps://www.formfutura.com/shop/product/easyfil-pla-2801" - -[filament:FormFutura ReForm rPLA @MEGA] -inherits = *PLA_mega* -filament_vendor = FormFutura -filament_cost = 26.65 -filament_notes = "ReForm is a sustainable initiative within Formfutura to efficiently manage residual extrusion waste streams and re-use them into high-end upcycled filaments. The ideology behind ReForm is to a make 3D printing more sustainable – without having to make compromises on material properties – and yet keep it affordable.\n\nhttps://www.formfutura.com/shop/product/reform-rpla-2838" - -[filament:GIANTARM PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = GIANTARM -filament_cost = 24.99 - -[filament:Prusament PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = Prusa Polymers -filament_cost = 30.24 -filament_notes = "Affordable filament for everyday printing in premium quality manufactured in-house by Josef Prusa" -filament_spool_weight = 201 -temperature = 215 - -[filament:Verbatim PLA @MEGA] -inherits = *PLA_mega* -filament_vendor = Verbatim -filament_cost = 23.88 - -[printer:*common_mega*] -printer_technology = FFF -bed_shape = 0x0,210x0,210x210,0x210 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z] -default_filament_profile = Generic PLA @MEGA -default_print_profile = 0.15mm QUALITY @MEGA -deretract_speed = 50 -end_gcode = G1 E-1.0 F2100 ; retract\nG92 E0.0\nG1{if max_layer_z < max_print_height} Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} E-34.0 F720 ; move print head up & retract filament\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y105 F3000 ; park print head\nM84 ; disable motors -extruder_colour = #808080 -gcode_flavor = marlin -layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] -max_layer_height = 0.36 -max_print_height = 205 -remaining_times = 1 -retract_before_travel = 1.5 -retract_before_wipe = 60% -retract_layer_change = 1 -retract_length = 6 -retract_lift = 0.075 -retract_lift_below = 204 -retract_speed = 40 -silent_mode = 0 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Y1.0 Z0.3 F1000 ; move print head up\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG92 E0.0\n; initial load\nG1 X205.0 E19 F1000\nG1 Y1.6\nG1 X5.0 E19 F1000\nG92 E0.0\n; intro line\nG1 Y2.0 Z0.2 F1000\nG1 X65.0 E9.0 F1000\nG1 X105.0 E12.5 F1000\nG92 E0.0 -thumbnails = 16x16,220x124 -use_relative_e_distances = 1 -wipe = 1 -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 1250 -machine_max_acceleration_retracting = 1250 -machine_max_acceleration_x = 3000 -machine_max_acceleration_y = 2000 -machine_max_acceleration_z = 60 -machine_max_feedrate_e = 60 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 -machine_max_feedrate_z = 6 -machine_max_jerk_e = 5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 -machine_max_jerk_z = 0.4 - -[printer:Anycubic i3 Mega] -inherits = *common_mega* -printer_model = I3MEGA -printer_variant = 0.4 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_I3_MEGA\nPRINTER_HAS_BOWDEN - -[printer:Anycubic i3 Mega S] -inherits = *common_mega* -printer_model = I3MEGAS -printer_variant = 0.4 -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_I3_MEGA_S\nPRINTER_HAS_BOWDEN -machine_max_feedrate_e = 30 -machine_max_feedrate_z = 8 - - -## Anycubic PREDATOR -## Author: https://github.com/tillverka3d -## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4960 - -######################################### -###### begin common print presets ####### -######################################### - -# Common print preset -[print:*common predator*] -spiral_vase = 0 -top_solid_min_thickness = 0.8 -bottom_solid_min_thickness = 0.6 -extra_perimeters = 0 -ensure_vertical_shell_thickness = 1 -avoid_crossing_perimeters = 0 -thin_walls = 0 -overhangs = 1 -seam_position = nearest -external_perimeters_first = 0 -fill_density = 20% -external_fill_pattern = rectilinear -infill_every_layers = 1 -infill_only_where_needed = 0 -solid_infill_every_layers = 0 -fill_angle = 45 -solid_infill_below_area = 20 -bridge_angle = 0 -only_retract_when_crossing_perimeters = 0 -infill_first = 0 -skirts = 1 -skirt_distance = 4 -skirt_height = 1 -min_skirt_length = 8 -brim_width = 0 -support_material = 0 -support_material_auto = 1 -support_material_threshold = 50 -support_material_enforce_layers = 0 -raft_layers = 0 -support_material_contact_distance = 0.1 -support_material_pattern = rectilinear -support_material_with_sheath = 0 -support_material_spacing = 2 -support_material_angle = 0 -support_material_interface_layers = 2 -support_material_interface_spacing = 0.2 -support_material_interface_contact_loops = 0 -support_material_buildplate_only = 0 -support_material_xy_spacing = 60% -dont_support_bridges = 1 -support_material_synchronize_layers = 0 -travel_speed = 94 -first_layer_speed = 15 -perimeter_acceleration = 0 -infill_acceleration = 0 -bridge_acceleration = 0 -first_layer_acceleration = 0 -default_acceleration = 0 -max_volumetric_speed = 15 -perimeter_extruder = 1 -infill_extruder = 1 -solid_infill_extruder = 1 -support_material_extruder = 0 -support_material_interface_extruder = 0 -ooze_prevention = 0 -standby_temperature_delta = -5 -wipe_tower = 0 -wipe_tower_x = 170 -wipe_tower_y = 140 -wipe_tower_width = 60 -wipe_tower_rotation_angle = 0 -wipe_tower_bridging = 10 -interface_shells = 0 -bridge_flow_ratio = 0.8 -resolution = 0 -xy_size_compensation = 0 -elefant_foot_compensation = 0.2 -clip_multipart_objects = 1 -complete_objects = 0 -extruder_clearance_radius = 45 -extruder_clearance_height = 25 -gcode_comments = 0 -output_filename_format = {input_filename_base}.gcode -post_process = -notes = -max_volumetric_extrusion_rate_slope_negative = 0 -max_volumetric_extrusion_rate_slope_positive = 0 -print_settings_id = - -# Common print preset -[print:*common predator 0.4 nozzle*] -inherits = *common predator* -first_layer_height = 0.16 -infill_overlap = 25% -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.4 - -# Common print preset -[print:*common predator 0.6 nozzle*] -inherits = *common predator* -first_layer_height = 0.24 -infill_overlap = 27% -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.6 - -# Common print preset -[print:*common predator 0.8 nozzle*] -inherits = *common predator* -first_layer_height = 0.32 -infill_overlap = 30% -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.8 - -# Common print preset -[print:*common predator quality*] -perimeter_speed = 50 -small_perimeter_speed = 15 -external_perimeter_speed = 70% -infill_speed = 65 -solid_infill_speed = 85% -top_solid_infill_speed = 85% -support_material_speed = 30 -support_material_interface_speed = 85% -bridge_speed = 30 -gap_fill_speed = 40 -ironing_speed = 15 - -# Common print preset -[print:*common predator speed*] -perimeter_speed = 70 -small_perimeter_speed = 15 -external_perimeter_speed = 70% -infill_speed = 85 -solid_infill_speed = 85% -top_solid_infill_speed = 85% -support_material_speed = 30 -support_material_interface_speed = 85% -bridge_speed = 30 -gap_fill_speed = 40 -ironing_speed = 15 - -# Common print preset -[print:*common predator 0.4 nozzle detailed*] -inherits = *common predator 0.4 nozzle* -extrusion_width = 0.42 -first_layer_extrusion_width = 0.41 -perimeter_extrusion_width = 0.42 -external_perimeter_extrusion_width = 0.42 -infill_extrusion_width = 0.4 -solid_infill_extrusion_width = 0.4 -top_infill_extrusion_width = 0.4 -support_material_extrusion_width = 0.38 - -# Common print preset -[print:*common predator 0.4 nozzle coarse*] -inherits = *common predator 0.4 nozzle* -extrusion_width = 0.44 -first_layer_extrusion_width = 0.42 -perimeter_extrusion_width = 0.5 -external_perimeter_extrusion_width = 0.5 -infill_extrusion_width = 0.5 -solid_infill_extrusion_width = 0.5 -top_infill_extrusion_width = 0.4 -support_material_extrusion_width = 0.38 - -# Common print preset -[print:*common predator 0.6 nozzle detailed*] -inherits = *common predator 0.6 nozzle* -extrusion_width = 0.64 -first_layer_extrusion_width = 0.62 -perimeter_extrusion_width = 0.64 -external_perimeter_extrusion_width = 0.64 -infill_extrusion_width = 0.6 -solid_infill_extrusion_width = 0.6 -top_infill_extrusion_width = 0.6 -support_material_extrusion_width = 0.56 - -# Common print preset -[print:*common predator 0.6 nozzle coarse*] -inherits = *common predator 0.6 nozzle* -extrusion_width = 0.67 -first_layer_extrusion_width = 0.64 -perimeter_extrusion_width = 0.7 -external_perimeter_extrusion_width = 0.7 -infill_extrusion_width = 0.7 -solid_infill_extrusion_width = 0.7 -top_infill_extrusion_width = 0.6 -support_material_extrusion_width = 0.56 - -# Common print preset -[print:*common predator 0.8 nozzle detailed*] -inherits = *common predator 0.8 nozzle* -extrusion_width = 0.84 -first_layer_extrusion_width = 0.82 -perimeter_extrusion_width = 0.84 -external_perimeter_extrusion_width = 0.84 -infill_extrusion_width = 0.8 -solid_infill_extrusion_width = 0.8 -top_infill_extrusion_width = 0.8 -support_material_extrusion_width = 0.72 - -# Common print preset -[print:*common predator 0.8 nozzle coarse*] -inherits = *common predator 0.8 nozzle* -extrusion_width = 0.87 -first_layer_extrusion_width = 0.84 -perimeter_extrusion_width = 0.9 -external_perimeter_extrusion_width = 0.9 -infill_extrusion_width = 0.9 -solid_infill_extrusion_width = 0.9 -top_infill_extrusion_width = 0.8 -support_material_extrusion_width = 0.72 - -######################################### -####### end common print presets ######## -######################################### - -######################################### -########## begin print presets ########## -######################################### - -[print:0.08mm 0.4 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle detailed*; *common predator quality* -layer_height = 0.08 -max_print_speed = 50 -perimeters = 3 -fill_pattern = grid - -[print:0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle detailed*; *common predator quality* -layer_height = 0.16 -max_print_speed = 60 -perimeters = 3 -fill_pattern = grid - -[print:0.16mm 0.4 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle coarse*; *common predator quality* -layer_height = 0.16 -max_print_speed = 60 -perimeters = 3 -fill_pattern = grid - -[print:0.24mm 0.4 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle detailed*; *common predator quality* -layer_height = 0.24 -max_print_speed = 70 -perimeters = 3 -fill_pattern = grid - -[print:0.24mm 0.4 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle coarse*; *common predator quality* -layer_height = 0.24 -max_print_speed = 70 -perimeters = 3 -fill_pattern = grid - -[print:0.32mm 0.4 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle detailed*; *common predator quality* -layer_height = 0.32 -max_print_speed = 70 -perimeters = 3 -fill_pattern = grid - -[print:0.32mm 0.4 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.4 nozzle coarse*; *common predator quality* -layer_height = 0.32 -max_print_speed = 70 -perimeters = 3 -fill_pattern = grid - -[print:0.16mm 0.6 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator quality* -layer_height = 0.16 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.16mm 0.6 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator speed* -layer_height = 0.16 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.16mm 0.6 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator quality* -layer_height = 0.16 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.16mm 0.6 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator speed* -layer_height = 0.16 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.6 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator quality* -layer_height = 0.24 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.6 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator speed* -layer_height = 0.24 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.6 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator quality* -layer_height = 0.24 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.6 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator speed* -layer_height = 0.24 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.6 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator quality* -layer_height = 0.32 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.6 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator speed* -layer_height = 0.32 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.6 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator quality* -layer_height = 0.32 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.6 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator speed* -layer_height = 0.32 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.6 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator quality* -layer_height = 0.4 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.6 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle detailed*; *common predator speed* -layer_height = 0.4 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.6 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator quality* -layer_height = 0.4 -max_print_speed = 70 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.6 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.6 nozzle coarse*; *common predator speed* -layer_height = 0.4 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator quality* -layer_height = 0.24 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.8 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator speed* -layer_height = 0.24 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.8 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator quality* -layer_height = 0.24 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.24mm 0.8 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator speed* -layer_height = 0.24 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.8 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator quality* -layer_height = 0.32 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.8 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator speed* -layer_height = 0.32 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.8 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator quality* -layer_height = 0.32 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.32mm 0.8 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator speed* -layer_height = 0.32 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.8 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator quality* -layer_height = 0.4 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.8 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator speed* -layer_height = 0.4 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.8 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator quality* -layer_height = 0.4 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.4mm 0.8 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator speed* -layer_height = 0.4 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.48mm 0.8 nozzle DETAILED QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator quality* -layer_height = 0.48 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.48mm 0.8 nozzle DETAILED SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle detailed*; *common predator speed* -layer_height = 0.48 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -[print:0.48mm 0.8 nozzle COARSE QUALITY @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator quality* -layer_height = 0.48 -max_print_speed = 80 -perimeters = 2 -fill_pattern = gyroid - -[print:0.48mm 0.8 nozzle COARSE SPEED @PREDATOR] -inherits = *common predator 0.8 nozzle coarse*; *common predator speed* -layer_height = 0.48 -max_print_speed = 90 -perimeters = 2 -fill_pattern = gyroid - -######################################### -########### end print presets ########### -######################################### - -######################################### -######## begin filament presets ######### -######################################### - -# Common filament preset -[filament:*common predator*] -cooling = 0 -compatible_printers = -extrusion_multiplier = 1 -filament_cost = 0 -filament_density = 0 -filament_diameter = 1.75 -filament_notes = "" -filament_settings_id = "" -filament_soluble = 0 -min_print_speed = 15 -slowdown_below_layer_time = 20 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ - -[filament:*PLA predator*] -inherits = *common predator* -bed_temperature = 60 -fan_below_layer_time = 100 -filament_colour = #FF3232 -filament_max_volumetric_speed = 10 -filament_type = PLA -filament_density = 1.24 -filament_cost = 20 -first_layer_bed_temperature = 60 -first_layer_temperature = 200 -fan_always_on = 1 -cooling = 1 -max_fan_speed = 100 -min_fan_speed = 100 -bridge_fan_speed = 100 -disable_fan_first_layers = 1 -temperature = 200 - -[filament:*PET predator*] -inherits = *common predator* -bed_temperature = 70 -cooling = 1 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #FF8000 -filament_max_volumetric_speed = 8 -filament_type = PETG -filament_density = 1.27 -filament_cost = 30 -first_layer_bed_temperature =70 -first_layer_temperature = 240 -fan_always_on = 1 -max_fan_speed = 50 -min_fan_speed = 20 -bridge_fan_speed = 100 -temperature = 240 - -[filament:*ABS predator*] -inherits = *common predator* -bed_temperature = 100 -cooling = 0 -disable_fan_first_layers = 3 -fan_below_layer_time = 20 -filament_colour = #3A80CA -filament_max_volumetric_speed = 10 -filament_type = ABS -filament_density = 1.04 -filament_cost = 20 -first_layer_bed_temperature = 100 -first_layer_temperature = 245 -fan_always_on = 0 -max_fan_speed = 0 -min_fan_speed = 0 -bridge_fan_speed = 30 -top_fan_speed = 0 -temperature = 245 - -[filament:Generic PLA @PREDATOR] -inherits = *PLA predator* -filament_vendor = Generic - -[filament:Generic PETG @PREDATOR] -inherits = *PET predator* -filament_vendor = Generic - -[filament:Generic ABS @PREDATOR] -inherits = *ABS predator* -filament_vendor = Generic - -######################################### -######### end filament presets ########## -######################################### - -######################################### -######### begin printer presets ######### -######################################### - -# Anycubic predator common printer preset -[printer:*common predator*] -printer_vendor = Anycubic -printer_model = Predator -printer_technology = FFF -printer_variant = 0.4 -thumbnails = 16x16,220x124 -bed_shape = 188.779x16.516,186.621x32.9063,183.043x49.0462,178.072x64.8128,171.745x80.0862,164.112x94.75,155.229x108.693,145.165x121.808,133.997x133.997,121.808x145.165,108.693x155.229,94.75x164.112,80.0862x171.745,64.8128x178.072,49.0462x183.043,32.9063x186.621,16.516x188.779,1.16035e-14x189.5,-16.516x188.779,-32.9063x186.621,-49.0462x183.043,-64.8128x178.072,-80.0862x171.745,-94.75x164.112,-108.693x155.229,-121.808x145.165,-133.997x133.997,-145.165x121.808,-155.229x108.693,-164.112x94.75,-171.745x80.0862,-178.072x64.8128,-183.043x49.0462,-186.621x32.9063,-188.779x16.516,-189.5x2.32071e-14,-188.779x-16.516,-186.621x-32.9063,-183.043x-49.0462,-178.072x-64.8128,-171.745x-80.0862,-164.112x-94.75,-155.229x-108.693,-145.165x-121.808,-133.997x-133.997,-121.808x-145.165,-108.693x-155.229,-94.75x-164.112,-80.0862x-171.745,-64.8128x-178.072,-49.0462x-183.043,-32.9063x-186.621,-16.516x-188.779,-3.48106e-14x-189.5,16.516x-188.779,32.9063x-186.621,49.0462x-183.043,64.8128x-178.072,80.0862x-171.745,94.75x-164.112,108.693x-155.229,121.808x-145.165,133.997x-133.997,145.165x-121.808,155.229x-108.693,164.112x-94.75,171.745x-80.0862,178.072x-64.8128,183.043x-49.0462,186.621x-32.9063,188.779x-16.516,189.5x-4.64141e-14 -max_print_height = 445 -z_offset = 0 -single_extruder_multi_material = 0 -gcode_flavor = reprap -silent_mode = 0 -remaining_times = 0 -use_relative_e_distances = 0 -use_firmware_retraction = 0 -use_volumetric_e = 0 -variable_layer_height = 1 -start_gcode = ; start_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; set metric values\n\nG21\n\n; use absolute positioning\n\nG90\n\n; set extruder to absolute mode\n\nM82\n\n; start with fan off\n\nM107\n\n; set temps\n\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\n\n; home xy\n\nG28 X0 Y0\n\n; home z\n\nG28 Z0\n\n; move the head down to Z 94mm\n\nG1 Z94.0 F2394\n\n; set and wait for temps\n\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\n\n; zero the extruded length\n\nG92 E0\n\n; extrude 3mm of feed stock\n\nG1 F200 E3\n\n; zero the extruded length again\n\nG92 E0\n\n; set speed\n\nG1 F{travel_speed}\n\n; print preskirt\n\nG92 E0\nG1 E3.94000 F2520.00000\n\nG1 X125.464 Y-139.310\nG1 Z0.329 F3994.000\n\nG1 F994.000\n\nG1 X125.464 Y-139.310 E4.19679\nG1 X130.218 Y-134.876 E4.70359\nG1 X132.569 Y-132.567 E4.96053\nG1 X137.099 Y-127.877 E5.46890\nG1 X139.325 Y-125.447 E5.72585\nG1 X141.507 Y-122.981 E5.98254\nG1 X145.685 Y-118.002 E6.48934\nG1 X149.741 Y-112.810 E7.00296\nG1 X153.561 Y-107.552 E7.50975\nG1 X155.440 Y-104.819 E7.76827\nG1 X158.980 Y-99.367 E8.27506\nG1 X160.702 Y-96.558 E8.53201\nG1 X163.962 Y-90.911 E9.04038\nG1 X165.535 Y-88.015 E9.29732\nG1 X168.496 Y-82.205 E9.80570\nG1 X169.915 Y-79.231 E10.06264\nG1 X171.280 Y-76.235 E10.31934\nG1 X173.819 Y-70.251 E10.82613\nG1 X176.180 Y-64.101 E11.33975\nG1 X178.297 Y-57.955 E11.84654\nG1 X179.294 Y-54.793 E12.10507\nG1 X181.085 Y-48.544 E12.61186\nG1 X181.911 Y-45.354 E12.86880\nG1 X183.378 Y-39.001 E13.37718\nG1 X184.035 Y-35.771 E13.63412\nG1 X185.168 Y-29.350 E14.14250\nG1 X185.655 Y-26.091 E14.39944\nG1 X186.084 Y-22.826 E14.65614\nG1 X186.764 Y-16.362 E15.16293\nG1 X187.223 Y-9.790 E15.67655\nG1 X187.450 Y-3.294 E16.18334\nG1 X187.479 Y0.002 E16.44028\nG1 X187.450 Y3.294 E16.69698\nG1 X187.223 Y9.810 E17.20529\nG1 X187.021 Y13.100 E17.46229\nG1 X186.454 Y19.575 E17.96909\nG1 X186.079 Y22.870 E18.22761\nG1 X185.174 Y29.307 E18.73440\nG1 X184.031 Y35.794 E19.24802\nG1 X182.679 Y42.152 E19.75481\nG1 X181.910 Y45.357 E20.01176\nG1 X180.223 Y51.655 E20.52013\nG1 X179.287 Y54.815 E20.77708\nG1 X177.272 Y61.017 E21.28545\nG1 X176.172 Y64.123 E21.54239\nG1 X175.019 Y67.207 E21.79909\nG1 X172.584 Y73.234 E22.30588\nG1 X169.905 Y79.252 E22.81950\nG1 X167.055 Y85.094 E23.32629\nG1 X165.524 Y88.035 E23.58482\nG1 X162.373 Y93.721 E24.09161\nG1 X160.700 Y96.560 E24.34855\nG1 X157.245 Y102.090 E24.85693\nG1 X155.427 Y104.838 E25.11387\nG1 X151.687 Y110.180 E25.62225\nG1 X149.727 Y112.829 E25.87919\nG1 X147.722 Y115.441 E26.13588\nG1 X143.631 Y120.493 E26.64268\nG1 X139.310 Y125.464 E27.15629\nG1 X134.876 Y130.218 E27.66309\nG1 X132.567 Y132.569 E27.92003\nG1 X127.877 Y137.099 E28.42840\nG1 X125.447 Y139.325 E28.68535\nG1 X122.981 Y141.507 E28.94204\nG1 X118.002 Y145.685 E29.44883\nG1 X112.810 Y149.741 E29.96245\nG1 X107.552 Y153.561 E30.46924\nG1 X104.819 Y155.440 E30.72777\nG1 X99.367 Y158.980 E31.23456\nG1 X96.558 Y160.702 E31.49151\nG1 X90.911 Y163.962 E31.99988\nG1 X88.015 Y165.535 E32.25682\nG1 X82.205 Y168.496 E32.76520\nG1 X79.231 Y169.915 E33.02214\nG1 X76.235 Y171.280 E33.27884\nG1 X70.251 Y173.819 E33.78563\nG1 X64.101 Y176.180 E34.29925\nG1 X57.955 Y178.297 E34.80604\nG1 X54.793 Y179.294 E35.06457\nG1 X48.544 Y181.085 E35.57136\nG1 X45.354 Y181.911 E35.82830\nG1 X39.001 Y183.378 E36.33668\nG1 X35.771 Y184.035 E36.59362\nG1 X29.350 Y185.168 E37.10200\nG1 X26.091 Y185.655 E37.35894\nG1 X22.826 Y186.084 E37.61563\nG1 X16.362 Y186.764 E38.12242\nG1 X9.790 Y187.223 E38.63605\nG1 X3.294 Y187.450 E39.14283\nG1 X-0.002 Y187.479 E39.39978\nG1 X-3.294 Y187.450 E39.65648\nG1 X-9.810 Y187.223 E40.16479\nG1 X-13.100 Y187.021 E40.42179\nG1 X-19.575 Y186.454 E40.92858\nG1 X-22.870 Y186.079 E41.18711\nG1 X-29.307 Y185.174 E41.69390\nG1 X-35.794 Y184.031 E42.20752\nG1 X-42.152 Y182.679 E42.71431\nG1 X-45.357 Y181.910 E42.97126\nG1 X-51.655 Y180.223 E43.47963\nG1 X-54.815 Y179.287 E43.73657\nG1 X-61.017 Y177.272 E44.24495\nG1 X-64.123 Y176.172 E44.50189\nG1 X-67.207 Y175.019 E44.75859\nG1 X-73.234 Y172.584 E45.26538\nG1 X-79.252 Y169.905 E45.77900\nG1 X-85.094 Y167.055 E46.28579\nG1 X-88.035 Y165.524 E46.54432\nG1 X-93.721 Y162.373 E47.05111\nG1 X-96.560 Y160.700 E47.30805\nG1 X-102.090 Y157.245 E47.81643\nG1 X-104.838 Y155.427 E48.07337\nG1 X-110.180 Y151.687 E48.58174\nG1 X-112.829 Y149.727 E48.83869\nG1 X-115.441 Y147.722 E49.09538\nG1 X-120.493 Y143.631 E49.60218\nG1 X-125.464 Y139.310 E50.11579\nG1 X-130.218 Y134.876 E50.62259\nG1 X-132.569 Y132.567 E50.87953\nG1 X-137.099 Y127.877 E51.38790\nG1 X-139.325 Y125.447 E51.64485\nG1 X-141.507 Y122.981 E51.90154\nG1 X-145.685 Y118.002 E52.40833\nG1 X-149.741 Y112.810 E52.92195\nG1 X-153.561 Y107.552 E53.42874\nG1 X-155.440 Y104.819 E53.68727\nG1 X-158.980 Y99.367 E54.19406\nG1 X-160.702 Y96.558 E54.45101\nG1 X-163.962 Y90.911 E54.95938\nG1 X-165.535 Y88.015 E55.21632\nG1 X-168.496 Y82.205 E55.72470\nG1 X-169.915 Y79.231 E55.98164\nG1 X-171.280 Y76.235 E56.23834\nG1 X-173.819 Y70.251 E56.74513\nG1 X-176.180 Y64.101 E57.25875\nG1 X-178.297 Y57.955 E57.76554\nG1 X-179.294 Y54.793 E58.02407\nG1 X-181.085 Y48.544 E58.53086\nG1 X-181.911 Y45.354 E58.78780\nG1 X-183.378 Y39.001 E59.29618\nG1 X-184.035 Y35.771 E59.55312\nG1 X-185.168 Y29.350 E60.06149\nG1 X-185.655 Y26.091 E60.31844\nG1 X-186.084 Y22.826 E60.57513\nG1 X-186.764 Y16.362 E61.08192\nG1 X-187.223 Y9.790 E61.59554\nG1 X-187.450 Y3.294 E62.10233\nG1 X-187.479 Y-0.002 E62.35928\nG1 X-187.450 Y-3.294 E62.61598\nG1 X-187.223 Y-9.810 E63.12429\nG1 X-187.021 Y-13.100 E63.38129\nG1 X-186.454 Y-19.575 E63.88808\nG1 X-186.079 Y-22.870 E64.14661\nG1 X-185.174 Y-29.307 E64.65340\nG1 X-184.031 Y-35.794 E65.16702\nG1 X-182.679 Y-42.152 E65.67381\nG1 X-181.910 Y-45.357 E65.93076\nG1 X-180.223 Y-51.655 E66.43913\nG1 X-179.287 Y-54.815 E66.69607\nG1 X-177.272 Y-61.017 E67.20445\nG1 X-176.172 Y-64.123 E67.46139\nG1 X-175.019 Y-67.207 E67.71809\nG1 X-172.584 Y-73.234 E68.22488\nG1 X-169.905 Y-79.252 E68.73850\nG1 X-167.055 Y-85.094 E69.24529\nG1 X-165.524 Y-88.035 E69.50382\nG1 X-162.373 Y-93.721 E70.01061\nG1 X-160.700 Y-96.560 E70.26755\nG1 X-157.245 Y-102.090 E70.77593\nG1 X-155.427 Y-104.838 E71.03287\nG1 X-151.687 Y-110.180 E71.54124\nG1 X-149.727 Y-112.829 E71.79819\nG1 X-147.722 Y-115.441 E72.05488\nG1 X-143.631 Y-120.493 E72.56167\nG1 X-139.310 Y-125.464 E73.07529\nG1 X-134.876 Y-130.218 E73.58209\nG1 X-132.567 Y-132.569 E73.83903\nG1 X-127.877 Y-137.099 E74.34740\nG1 X-125.447 Y-139.325 E74.60435\nG1 X-122.981 Y-141.507 E74.86104\nG1 X-118.002 Y-145.685 E75.36783\nG1 X-112.810 Y-149.741 E75.88145\nG1 X-107.552 Y-153.561 E76.38824\nG1 X-104.819 Y-155.440 E76.64677\nG1 X-99.367 Y-158.980 E77.15356\nG1 X-96.558 Y-160.702 E77.41051\nG1 X-90.911 Y-163.962 E77.91888\nG1 X-88.015 Y-165.535 E78.17582\nG1 X-82.205 Y-168.496 E78.68420\nG1 X-79.231 Y-169.915 E78.94114\nG1 X-76.235 Y-171.280 E79.19784\nG1 X-70.251 Y-173.819 E79.70463\nG1 X-64.101 Y-176.180 E80.21825\nG1 X-57.955 Y-178.297 E80.72504\nG1 X-54.793 Y-179.294 E80.98356\nG1 X-48.544 Y-181.085 E81.49036\nG1 X-45.354 Y-181.911 E81.74730\nG1 X-39.001 Y-183.378 E82.25568\nG1 X-35.771 Y-184.035 E82.51262\nG1 X-29.350 Y-185.168 E83.02099\nG1 X-26.091 Y-185.655 E83.27794\nG1 X-22.826 Y-186.084 E83.53463\nG1 X-16.362 Y-186.764 E84.04142\nG1 X-9.790 Y-187.223 E84.55504\nG1 X-3.294 Y-187.450 E85.06183\nG1 X0.006 Y-187.479 E85.31908\nG1 X6.521 Y-187.366 E85.82715\nG1 X9.810 Y-187.223 E86.08379\nG1 X13.100 Y-187.021 E86.34079\nG1 X19.575 Y-186.454 E86.84758\nG1 X22.870 Y-186.079 E87.10611\nG1 X29.307 Y-185.174 E87.61290\nG1 X35.794 Y-184.031 E88.12652\nG1 X42.152 Y-182.679 E88.63331\nG1 X45.357 Y-181.910 E88.89025\nG1 X51.655 Y-180.223 E89.39863\nG1 X54.815 Y-179.287 E89.65557\nG1 X61.017 Y-177.272 E90.16395\nG1 X64.123 Y-176.172 E90.42089\nG1 X67.207 Y-175.019 E90.67759\nG1 X73.234 Y-172.584 E91.18438\nG1 X79.252 Y-169.905 E91.69800\nG1 X85.094 Y-167.055 E92.20479\nG1 X88.035 Y-165.524 E92.46332\nG1 X93.721 Y-162.373 E92.97011\nG1 X96.560 Y-160.700 E93.22705\nG1 X102.090 Y-157.245 E93.73543\nG1 X104.838 Y-155.427 E93.99237\nG1 X110.180 Y-151.687 E94.50074\nG1 X112.829 Y-149.727 E94.75768\nG1 X115.441 Y-147.722 E95.01438\nG1 X120.493 Y-143.631 E95.52117\nG1 X122.911 Y-141.529 E95.77098\n\n; end preskirt\n; start_gcode | end -end_gcode = ; end_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; use relative positioning\n\nG91\n\n; retract the filament a bit before lifting the nozzle to release some of the pressure\n\nG1 E-1 F300\n\n; home\n\nG28\n\n; use absolute positioning\n\nG90\n\n; cooldown\n\nM104 S0\nM140 S0\n\n; end_gcode | end\n -before_layer_gcode = -layer_gcode = -toolchange_gcode = -between_objects_gcode = -retract_length = 4 -retract_lift = 0.3 -retract_lift_above = 0 -retract_lift_below = 449 -retract_speed = 30 -deretract_speed = 0 -retract_restart_extra = 0 -retract_before_travel = 2 -retract_layer_change = 1 -wipe = 1 -retract_before_wipe = 70% -retract_length_toolchange = 10 -retract_restart_extra_toolchange = 0 -extruder_colour = #1193FF -machine_max_acceleration_e = 3000 -machine_max_acceleration_extruding = 1000 -machine_max_acceleration_retracting = 1000 -machine_max_acceleration_x = 1500 -machine_max_acceleration_y = 1500 -machine_max_acceleration_z = 1500 -machine_max_feedrate_e = 60 -machine_max_feedrate_x = 200 -machine_max_feedrate_y = 200 -machine_max_feedrate_z = 200 -machine_max_jerk_e = 5 -machine_max_jerk_x = 5 -machine_max_jerk_y = 5 -machine_max_jerk_z = 5 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -printer_settings_id = -printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PREDATOR\nPRINTER_HAS_BOWDEN\n -default_filament_profile = Generic PLA @PREDATOR - -[printer:Anycubic Predator 0.4 nozzle] -inherits = *common predator* -printer_model = PREDATOR -printer_variant = 0.4 -nozzle_diameter = 0.4 -min_layer_height = 0.08 -max_layer_height = 0.32 -default_print_profile = 0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR - -[printer:Anycubic Predator 0.6 nozzle] -inherits = *common predator* -printer_model = PREDATOR -printer_variant = 0.6 -nozzle_diameter = 0.6 -min_layer_height = 0.12 -max_layer_height = 0.4 -default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR - -[printer:Anycubic Predator 0.8 nozzle] -inherits = *common predator* -printer_model = PREDATOR -printer_variant = 0.8 -nozzle_diameter = 0.8 -min_layer_height = 0.16 -max_layer_height = 0.48 -default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR - -## Anycubic 4MAX Pro 2.0 -## based on https://hartrusion.com/en/prusaslicer-config-for-anycubic-4max-pro-2-0/ - -[print:*common_4max*] -avoid_crossing_perimeters = 0 -avoid_crossing_perimeters_max_detour = 0 -bottom_fill_pattern = monotonic -bottom_solid_layers = 4 -bridge_acceleration = 300 -bridge_angle = 0 -bridge_flow_ratio = 0.65 -bridge_speed = 30 -brim_separation = 0 -brim_type = outer_only -brim_width = 0 -clip_multipart_objects = 1 -compatible_printers_condition = printer_model=="4MAXPRO20" and nozzle_diameter[0]==0.4 -complete_objects = 0 -default_acceleration = 900 -dont_support_bridges = 1 -draft_shield = disabled -elefant_foot_compensation = 0.2 -ensure_vertical_shell_thickness = 1 -external_perimeter_extrusion_width = 0 -external_perimeter_speed = 35 -external_perimeters_first = 0 -extra_perimeters = 0 -extruder_clearance_height = 20 -extruder_clearance_radius = 20 -extrusion_width = 0.45 -fill_angle = 45 -fill_density = 20% -fill_pattern = gyroid -first_layer_acceleration = 300 -first_layer_acceleration_over_raft = 0 -first_layer_extrusion_width = 0.65 -first_layer_height = 0.3 -first_layer_speed = 20 -first_layer_speed_over_raft = 30 -fuzzy_skin = none -fuzzy_skin_point_dist = 0.8 -fuzzy_skin_thickness = 0.3 -gap_fill_enabled = 1 -gap_fill_speed = 40 -gcode_comments = 0 -gcode_label_objects = 0 -gcode_resolution = 0.0125 -infill_acceleration = 600 -infill_anchor = 400% -infill_anchor_max = 50 -infill_every_layers = 1 -infill_extruder = 1 -infill_extrusion_width = 0 -infill_first = 0 -infill_only_where_needed = 0 -infill_overlap = 23% -infill_speed = 45 -inherits = -interface_shells = 0 -ironing = 0 -ironing_flowrate = 15% -ironing_spacing = 0.1 -ironing_speed = 15 -ironing_type = top -layer_height = 0.2 -max_print_speed = 50 -max_volumetric_speed = 0 -min_skirt_length = 0 -only_retract_when_crossing_perimeters = 0 -ooze_prevention = 0 -output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode -overhangs = 1 -perimeter_acceleration = 500 -perimeter_extruder = 1 -perimeter_extrusion_width = 0 -perimeter_speed = 45 -perimeters = 3 -post_process = -print_settings_id = -raft_contact_distance = 0.1 -raft_expansion = 1.5 -raft_first_layer_density = 90% -raft_first_layer_expansion = 3 -raft_layers = 0 -resolution = 0 -seam_position = aligned -single_extruder_multi_material_priming = 1 -skirt_distance = 5 -skirt_height = 1 -skirts = 2 -slicing_mode = regular -small_perimeter_speed = 20 -solid_infill_below_area = 0 -solid_infill_every_layers = 0 -solid_infill_extruder = 1 -solid_infill_extrusion_width = 0 -solid_infill_speed = 45 -spiral_vase = 0 -standby_temperature_delta = -5 -support_material = 0 -support_material_angle = 0 -support_material_auto = 1 -support_material_bottom_contact_distance = 0 -support_material_bottom_interface_layers = -1 -support_material_buildplate_only = 1 -support_material_closing_radius = 2 -support_material_contact_distance = 0.2 -support_material_enforce_layers = 0 -support_material_extruder = 1 -support_material_extrusion_width = 0.4 -support_material_interface_contact_loops = 0 -support_material_interface_extruder = 1 -support_material_interface_layers = 2 -support_material_interface_pattern = rectilinear -support_material_interface_spacing = 0.2 -support_material_interface_speed = 30 -support_material_pattern = rectilinear-grid -support_material_spacing = 2.5 -support_material_speed = 45 -support_material_style = grid -support_material_synchronize_layers = 0 -support_material_threshold = 45 -support_material_with_sheath = 1 -support_material_xy_spacing = 60% -thick_bridges = 1 -thin_walls = 0 -top_fill_pattern = monotonic -top_infill_extrusion_width = 0.4 -top_solid_infill_speed = 30 -top_solid_layers = 5 -travel_speed = 60 -travel_speed_z = 0 -wipe_tower = 0 -wipe_tower_bridging = 10 -wipe_tower_brim_width = 2 -wipe_tower_no_sparse_layers = 0 -wipe_tower_rotation_angle = 0 -wipe_tower_width = 60 -wipe_tower_x = 180 -wipe_tower_y = 140 -xy_size_compensation = 0 - -[print:0.15mm Detail @4Max Pro 2.0] -inherits = *common_4max* -layer_height = 0.15 -bottom_solid_layers = 5 -top_solid_layers = 7 -perimeter_speed = 40 -external_perimeter_speed = 25 - -[print:0.20mm Quality @4Max Pro 2.0] -inherits = *common_4max* -external_perimeter_speed = 25 - -[print:0.30mm Draft @4Max Pro 2.0] -inherits = *common_4max* -layer_height = 0.3 -bottom_solid_layers = 3 -top_solid_layers = 3 - -[filament:*common_4max*] -bed_temperature = 60 -bridge_fan_speed = 100 -compatible_printers_condition = printer_model=="4MAXPRO20" -cooling = 1 -disable_fan_first_layers = 1 -extrusion_multiplier = 1 -fan_always_on = 1 -fan_below_layer_time = 30 -filament_density = 1.24 -filament_diameter = 1.75 -filament_max_volumetric_speed = 0 -filament_type = PLA -first_layer_bed_temperature = 60 -first_layer_temperature = 210 -full_fan_speed_layer = 5 -max_fan_speed = 100 -min_fan_speed = 80 -min_print_speed = 10 -slowdown_below_layer_time = 15 -temperature = 205 - -[filament:*PLA_4max*] -inherits = *common_4max* - -[filament:Generic PLA @4Max Pro 2.0] -inherits = *PLA_4max* -filament_vendor = Generic - -[filament:Anycubic PLA @4Max Pro 2.0] -inherits = *PLA_4max* -first_layer_temperature = 215 -temperature = 207 -filament_vendor = Anycubic - -[filament:Generic ABS @4Max Pro 2.0] -filament_vendor = Generic -compatible_printers_condition = printer_model=="4MAXPRO20" -bed_temperature = 100 -first_layer_bed_temperature = 100 -temperature = 245 -first_layer_temperature = 245 -bridge_fan_speed = 15 -cooling = 1 -disable_fan_first_layers = 3 -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 60 -filament_colour = #800000 -filament_density = 1.04 -filament_diameter = 1.75 -filament_type = ABS -full_fan_speed_layer = 0 -max_fan_speed = 0 -min_fan_speed = 0 -min_print_speed = 10 -slowdown_below_layer_time = 25 - -[filament:Generic TPU @4Max Pro 2.0] -filament_vendor = Generic -bed_temperature = 60 -bridge_fan_speed = 0 -compatible_printers_condition = printer_model=="4MAXPRO20" -cooling = 1 -disable_fan_first_layers = 3 -extrusion_multiplier = 1 -fan_always_on = 0 -fan_below_layer_time = 60 -filament_colour = #211AB5 -filament_density = 1.19 -filament_deretract_speed = 20 -filament_diameter = 1.75 -filament_retract_speed = 30 -filament_type = FLEX -filament_max_volumetric_speed = 1.65 -first_layer_bed_temperature = 60 -first_layer_temperature = 215 -full_fan_speed_layer = 0 -max_fan_speed = 0 -min_fan_speed = 0 -min_print_speed = 10 -slowdown_below_layer_time = 20 -temperature = 215 - -[filament:Polymaker PolyFlex TPU95 @4Max Pro 2.0] -filament_vendor = Polymaker -bed_temperature = 45 -bridge_fan_speed = 80 -compatible_printers_condition = printer_model=="4MAXPRO20" -cooling = 1 -disable_fan_first_layers = 5 -extrusion_multiplier = 1.04 -fan_always_on = 1 -fan_below_layer_time = 45 -filament_colour = #FD7D2F -filament_density = 1.22 -filament_deretract_speed = 25 -filament_diameter = 1.75 -filament_max_volumetric_speed = 1.65 -filament_retract_length = 4 -filament_retract_restart_extra = 0.1 -filament_retract_speed = 60 -filament_type = FLEX -first_layer_bed_temperature = 55 -first_layer_temperature = 215 -full_fan_speed_layer = 8 -max_fan_speed = 50 -min_fan_speed = 25 -min_print_speed = 10 -slowdown_below_layer_time = 10 -temperature = 217 - -[printer:Anycubic 4Max Pro 2.0] -printer_model = 4MAXPRO20 -printer_variant = 0.4 -printer_technology = FFF -bed_shape = 0x0,270x0,270x210,0x210 -color_change_gcode = M600 -default_filament_profile = Generic PLA @4Max Pro 2.0 -default_print_profile = 0.20mm Quality @4Max Pro 2.0 -deretract_speed = 25 -end_gcode = M104 S0 ; turn off extruder heating\nM140 S0 ; turn off bed heating\nM107 ; turn off fans\nG91 ; relative positioning\nG0 Z+0.5 ; move Z up a tiny bit\nG90 ; absolute positioning\nG0 X135 Y105 F{machine_max_feedrate_x[0]*60} ; move extruder to center position\nG0 Z190.5 F{machine_max_feedrate_z[0]*60} ; lower the plattform to Z min\nM84 ; steppers off\nG90 ; absolute positioning\n -extruder_offset = 0x0 -gcode_flavor = marlin -machine_limits_usage = time_estimate_only -machine_max_acceleration_e = 5000 -machine_max_acceleration_extruding = 1250 -machine_max_acceleration_retracting = 1250 -machine_max_acceleration_travel = 1500 -machine_max_acceleration_x = 900 -machine_max_acceleration_y = 900 -machine_max_acceleration_z = 100 -machine_max_feedrate_e = 120 -machine_max_feedrate_x = 200 -machine_max_feedrate_y = 200 -machine_max_feedrate_z = 16 -machine_max_jerk_e = 5 -machine_max_jerk_x = 6 -machine_max_jerk_y = 6 -machine_max_jerk_z = 0.2 -machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 -max_layer_height = 0.3 -max_print_height = 190 -min_layer_height = 0.07 -nozzle_diameter = 0.4 -pause_print_gcode = M601 -remaining_times = 0 -retract_before_travel = 2 -retract_before_wipe = 0% -retract_layer_change = 1 -retract_length = 2.5 -retract_length_toolchange = 10 -retract_lift = 0 -retract_lift_above = 0 -retract_lift_below = 0 -retract_restart_extra = 0 -retract_restart_extra_toolchange = 0 -retract_speed = 35 -silent_mode = 0 -single_extruder_multi_material = 0 -start_gcode = G21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 X0 Y0 ; home X and Y\nG28 Z0 ; home Z\nG1 Z30 F{machine_max_feedrate_z[0]*60} ; move Z a bit down to not blow on the bed edge while heating\nG1 X10 F3900 ; let some space on x to prevent the filament cooling exhaust from beeing blocked by the servo motor\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM104 S[first_layer_temperature] ; set extruder temp\nM106 S80 ; turn on fan to prevent air nozzle melt while heating up\nM109 S[first_layer_temperature] ; wait for extruder temp\nM107 ; start with the fan off\nG28 X0 ; goto X home again\nG92 E0 ; zero the extruded length\nG1 Z0.2 F360 ; move plattform upwards\n; extrude material next to the plattform (comment or remove following lines to disable)\nG1 F180 E20 ; extrude some material next to the plattform\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG92 E0 ; zero the extruded length again\nG1 X5 F3900 ; move sideways to get rid of that string\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\nG92 E0 ; zero the extruded length again\n; draw intro line (comment or remove following lines to disable)\nG1 X30 E5 F700 ; draw intro line\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG1 X40 Z2.0 ; move away from the introline\nG92 E0 ; zero the extruded length again\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\n; end of intro line code\nM117 Printing...\nG5 -use_firmware_retraction = 0 -use_relative_e_distances = 0 -use_volumetric_e = 0 -variable_layer_height = 1 -wipe = 0 -z_offset = 0 \ No newline at end of file +# Print profiles for the Anycubic printers. + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Anycubic +# Configuration version of this file. Config file will only be installed, if the config_version differs. +# This means, the server may force the PrusaSlicer configuration to be downgraded. +config_version = 0.1.1 +# Where to get the updates from? +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% + +# The printer models will be shown by the Configuration Wizard in this order, +# also the first model installed & the first nozzle installed will be activated after install. +# Printer model name will be shown by the installation wizard. + +[printer_model:AKLP] +name = Anycubic Kossel Linear Plus +variants = 0.4 +technology = FFF +family = KOSSEL +bed_model = AKLP_Bed.stl +bed_texture = AK.svg +default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL + +[printer_model:AK] +name = Anycubic Kossel Pulley (Linear) +variants = 0.4 +technology = FFF +family = KOSSEL +bed_model = AK_Bed.stl +bed_texture = AK.svg +default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL + +[printer_model:MEGA0] +name = Anycubic Mega Zero +variants = 0.4 +technology = FFF +family = MEGA +bed_model = mega0_bed.stl +bed_texture = mega0.svg +default_materials = Generic PLA @MEGA0; Generic PETG @MEGA0; Anycubic PLA @MEGA0; Prusament PLA @MEGA0; Prusament PETG @MEGA0 + +[printer_model:I3MEGA] +name = Anycubic i3 Mega +variants = 0.4 +technology = FFF +family = MEGA +bed_model = i3megas_bed.stl +bed_texture = i3megas.svg + +[printer_model:I3MEGAS] +name = Anycubic i3 Mega S +variants = 0.4 +technology = FFF +family = MEGA +bed_model = i3megas_bed.stl +bed_texture = i3megas.svg + +[printer_model:4MAXPRO20] +name = Anycubic 4Max Pro 2.0 +variants = 0.4 +technology = FFF +family = 4Max +bed_model = 4MAXPRO20_bed.stl +bed_texture = 4MAXPRO20_texture.svg +default_materials = Generic PLA @4Max Pro 2.0; Generic TPU @4Max Pro 2.0; Generic ABS @4Max Pro 2.0 + +[printer_model:PREDATOR] +name = Anycubic Predator +variants = 0.4; 0.6; 0.8 +technology = FFF +family = PREDATOR +default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR + +[printer_model:PHOTON MONO X] +name = Photon Mono X +variants = default +technology = SLA +family = PHOTON MONO +default_materials = Generic Blue Resin @MONO 0.05 + +# All presets starting with asterisk, for example *common*, are intermediate and they will +# not make it into the user interface. + +## Anycubic KOSSEL +## Author: https://github.com/tc0fh +## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4220 + +# Common print preset +[print:*common_akossel*] +avoid_crossing_perimeters = 0 +bottom_solid_min_thickness = 0.5 +bridge_angle = 0 +bridge_flow_ratio = 0.8 +bridge_speed = 30 +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers = +complete_objects = 0 +dont_support_bridges = 1 +elefant_foot_compensation = 0 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeters_first = 0 +external_perimeter_extrusion_width = 0.45 +extra_perimeters = 0 +extruder_clearance_height = 25 +extruder_clearance_radius = 45 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = grid +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 20 +gap_fill_speed = 40 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.45 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +interface_shells = 0 +max_print_speed = 200 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +overhangs = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +perimeter_speed = 45 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 0 +skirts = 2 +skirt_distance = 5 +skirt_height = 1 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.38 +support_material_interface_extruder = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_enforce_layers = 0 +support_material_contact_distance = 0.15 +support_material_interface_contact_loops = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 50 +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 0 +support_material_xy_spacing = 60% +thin_walls = 0 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 40 +top_solid_min_thickness = 0.6 +travel_speed = 180 +wipe_tower = 1 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 140 +xy_size_compensation = 0 +bridge_acceleration = 1000 +default_acceleration = 1500 +first_layer_acceleration = 1000 +infill_acceleration = 1500 +perimeter_acceleration = 800 + +[print:*0.08mm_akossel*] +inherits = *common_akossel* +bottom_solid_layers = 10 +bridge_acceleration = 300 +bridge_flow_ratio = 0.7 +bridge_speed = 20 +external_perimeter_speed = 20 +first_layer_acceleration = 500 +gap_fill_speed = 20 +infill_acceleration = 800 +infill_speed = 40 +layer_height = 0.08 +max_print_speed = 80 +perimeter_acceleration = 300 +perimeter_speed = 30 +perimeters = 3 +small_perimeter_speed = 20 +solid_infill_speed = 40 +support_material_extrusion_width = 0.3 +support_material_spacing = 1.5 +support_material_speed = 40 +top_solid_infill_speed = 30 +top_solid_layers = 12 + +[print:*0.16mm_akossel*] +inherits = *common_akossel* +bottom_solid_layers = 5 +layer_height = 0.16 +top_solid_layers = 6 + +[print:*0.20mm_akossel*] +inherits = *common_akossel* +bottom_solid_layers = 4 +bridge_flow_ratio = 0.95 +layer_height = 0.20 +top_solid_layers = 5 + +[print:*0.24mm_akossel*] +inherits = *common_akossel* +bottom_solid_layers = 4 +bridge_flow_ratio = 0.95 +layer_height = 0.24 +perimeter_speed = 50 +external_perimeter_speed = 35 +top_solid_layers = 4 +infill_speed = 100 +solid_infill_speed = 100 +top_solid_infill_speed = 40 + +[print:*0.30mm_akossel*] +inherits = *common_akossel* +bottom_solid_layers = 3 +bridge_flow_ratio = 0.95 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 35 +extrusion_width = 0.5 +infill_extrusion_width = 0.5 +infill_speed = 70 +layer_height = 0.30 +perimeter_extrusion_width = 0.5 +perimeter_speed = 50 +small_perimeter_speed = 30 +solid_infill_extrusion_width = 0.5 +solid_infill_speed = 70 +support_material_speed = 45 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 50 +top_solid_layers = 3 + +[print:0.08mm ULTRADETAIL @AKOSSEL] +inherits = *0.08mm_akossel* +fill_density = 15% +fill_pattern = gyroid +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.16mm QUALITY @AKOSSEL] +inherits = *0.16mm_akossel* +external_perimeter_speed = 25 +fill_density = 15% +fill_pattern = gyroid +infill_speed = 80 +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.16mm SPEED @AKOSSEL] +inherits = *0.16mm_akossel* +external_perimeter_speed = 35 +infill_speed = 120 +perimeter_speed = 60 +solid_infill_speed = 120 +top_solid_infill_speed = 50 +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm QUALITY @AKOSSEL] +inherits = *0.20mm_akossel* +external_perimeter_speed = 25 +fill_density = 15% +fill_pattern = gyroid +infill_speed = 80 +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm SPEED @AKOSSEL] +inherits = *0.20mm_akossel* +external_perimeter_speed = 35 +infill_speed = 120 +perimeter_speed = 60 +solid_infill_speed = 120 +top_solid_infill_speed = 50 +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.24mm DRAFT @AKOSSEL] +inherits = *0.24mm_akossel* +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +[print:0.30mm FAST @AKOSSEL] +inherits = *0.30mm_akossel* +compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4 + +# Common filament preset +[filament:*common_akossel*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_Anycubic.*/ and printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ + +[filament:*PLA_akossel*] +inherits = *common_akossel* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #FF3232 +filament_max_volumetric_speed = 10 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 200 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 200 + +[filament:*PET_akossel*] +inherits = *common_akossel* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature =70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS_akossel*] +inherits = *common_akossel* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #3A80CA +filament_max_volumetric_speed = 10 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @AKOSSEL] +inherits = *PLA_akossel* +filament_vendor = Generic + +[filament:Generic PETG @AKOSSEL] +inherits = *PET_akossel* +filament_vendor = Generic + +[filament:Generic ABS @AKOSSEL] +inherits = *ABS_akossel* +filament_vendor = Generic + +# Common printer preset +[printer:*common_akossel*] +printer_technology = FFF +bed_shape = +before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z] +between_objects_gcode = +deretract_speed = 40 +extruder_colour = #FFFF00 +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 0 +remaining_times = 0 +machine_max_acceleration_e = 3000 +machine_max_acceleration_extruding = 1000 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 1500 +machine_max_acceleration_y = 1500 +machine_max_acceleration_z = 1500 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 200 +machine_max_jerk_e = 5 +machine_max_jerk_x = 5 +machine_max_jerk_y = 5 +machine_max_jerk_z = 5 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +max_layer_height = 0.3 +min_layer_height = 0.08 +max_print_height = 300 +nozzle_diameter = 0.4 +printer_notes = +printer_settings_id = +retract_before_travel = 2 +retract_before_wipe = 70% +retract_layer_change = 1 +retract_length = 5 +retract_length_toolchange = 1 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 60 +single_extruder_multi_material = 0 +start_gcode = +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG28 ; home\nM84 ; disable motors +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 1 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 +default_print_profile = 0.20mm QUALITY @AKOSSEL +default_filament_profile = Generic PLA @AKOSSEL + +[printer:Anycubic Kossel Linear Plus] +inherits = *common_akossel* +printer_model = AKLP +printer_variant = 0.4 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Anycubic\nPRINTER_MODEL_AKLP\nPRINTER_HAS_BOWDEN\n +bed_shape = 114.562x10.0229,113.253x19.9695,111.081x29.7642,108.065x39.3323,104.225x48.6011,99.5929x57.5,94.2025x65.9613,88.0951x73.9206,81.3173x81.3173,73.9206x88.0951,65.9613x94.2025,57.5x99.5929,48.6011x104.225,39.3323x108.065,29.7642x111.081,19.9695x113.253,10.0229x114.562,7.04172e-15x115,-10.0229x114.562,-19.9695x113.253,-29.7642x111.081,-39.3323x108.065,-48.6011x104.225,-57.5x99.5929,-65.9613x94.2025,-73.9206x88.0951,-81.3173x81.3173,-88.0951x73.9206,-94.2025x65.9613,-99.5929x57.5,-104.225x48.6011,-108.065x39.3323,-111.081x29.7642,-113.253x19.9695,-114.562x10.0229,-115x1.40834e-14,-114.562x-10.0229,-113.253x-19.9695,-111.081x-29.7642,-108.065x-39.3323,-104.225x-48.6011,-99.5929x-57.5,-94.2025x-65.9613,-88.0951x-73.9206,-81.3173x-81.3173,-73.9206x-88.0951,-65.9613x-94.2025,-57.5x-99.5929,-48.6011x-104.225,-39.3323x-108.065,-29.7642x-111.081,-19.9695x-113.253,-10.0229x-114.562,-2.11252e-14x-115,10.0229x-114.562,19.9695x-113.253,29.7642x-111.081,39.3323x-108.065,48.6011x-104.225,57.5x-99.5929,65.9613x-94.2025,73.9206x-88.0951,81.3173x-81.3173,88.0951x-73.9206,94.2025x-65.9613,99.5929x-57.5,104.225x-48.6011,108.065x-39.3323,111.081x-29.7642,113.253x-19.9695,114.562x-10.0229,115x-2.81669e-14 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-54.672 Y95.203 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-52.931 Y96.185 E0.300\nG1 X-50.985 Y97.231 E0.331\nG1 X-49.018 Y98.238 E0.331\nG1 X-47.032 Y99.205 E0.331\nG1 X-45.026 Y100.132 E0.331\nG1 X-43.003 Y101.019 E0.331\nG1 X-40.961 Y101.864 E0.331\nG1 X-38.904 Y102.668 E0.331\nG1 X-36.83 Y103.431 E0.331\nG1 X-34.742 Y104.152 E0.331\nG1 X-32.639 Y104.83 E0.331\nG1 X-30.523 Y105.466 E0.331\nG1 X-28.395 Y106.06 E0.331\nG1 X-26.255 Y106.61 E0.331\nG1 X-24.105 Y107.117 E0.331\nG1 X-21.945 Y107.581 E0.331\nG1 X-19.776 Y108.001 E0.331\nG1 X-17.599 Y108.377 E0.331\nG1 X-15.415 Y108.71 E0.331\nG1 X-13.224 Y108.998 E0.331\nG1 X-11.028 Y109.242 E0.331\nG1 X-8.828 Y109.442 E0.331\nG1 X-6.624 Y109.598 E0.331\nG1 X-4.418 Y109.709 E0.331\nG1 X-2.209 Y109.776 E0.332\nG1 X0 Y109.798 E0.331\nG1 X2.209 Y109.776 E0.690\nG1 X4.418 Y109.709 E0.691\nG1 X6.624 Y109.598 E0.690\nG1 X8.828 Y109.442 E0.690\nG1 X11.028 Y109.242 E0.690\nG1 X13.224 Y108.998 E0.690\nG1 X15.415 Y108.71 E0.691\nG1 X17.599 Y108.377 E0.690\nG1 X19.776 Y108.001 E0.690\nG1 X21.945 Y107.581 E0.690\nG1 X24.105 Y107.117 E0.690\nG1 X26.255 Y106.61 E0.690\nG1 X28.395 Y106.06 E0.690\nG1 X30.523 Y105.466 E0.690\nG1 X32.639 Y104.83 E0.690\nG1 X34.742 Y104.152 E0.690\nG1 X36.83 Y103.431 E0.690\nG1 X38.904 Y102.668 E0.691\nG1 X40.961 Y101.864 E0.690\nG1 X43.003 Y101.019 E0.691\nG1 X45.026 Y100.132 E0.690\nG1 X47.032 Y99.205 E0.691\nG1 X49.018 Y98.238 E0.690\nG1 X50.985 Y97.231 E0.691\nG1 X52.931 Y96.185 E0.690\nG1 X54.672 Y95.203 E0.625\nG92 E0.0\nG1 E-5 F3000 ; retract 5mm\nG1 X52.931 Y96.185 F1000 ; wipe\nG1 X50.985 Y97.231 F1000 ; wipe\nG1 X49.018 Y98.238 F1000 ; wipe\nG1 X0 Y109.798 F1000\nG1 E4.8 F1500; de-retract\nG92 E0.0 ; reset extrusion distance\nM221 S{if layer_height<0.075}100{else}95{endif} + +[printer:Anycubic Kossel Pulley (Linear)] +inherits = *common_akossel* +printer_model = AK +printer_variant = 0.4 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_Anycubic\nPRINTER_MODEL_AK\nPRINTER_HAS_BOWDEN\n +bed_shape = 89.6575x7.84402,88.6327x15.6283,86.9333x23.2937,84.5723x30.7818,81.5677x38.0356,77.9423x45,73.7237x51.6219,68.944x57.8509,63.6396x63.6396,57.8509x68.944,51.6219x73.7237,45x77.9423,38.0356x81.5677,30.7818x84.5723,23.2937x86.9333,15.6283x88.6327,7.84402x89.6575,5.51091e-15x90,-7.84402x89.6575,-15.6283x88.6327,-23.2937x86.9333,-30.7818x84.5723,-38.0356x81.5677,-45x77.9423,-51.6219x73.7237,-57.8509x68.944,-63.6396x63.6396,-68.944x57.8509,-73.7237x51.6219,-77.9423x45,-81.5677x38.0356,-84.5723x30.7818,-86.9333x23.2937,-88.6327x15.6283,-89.6575x7.84402,-90x1.10218e-14,-89.6575x-7.84402,-88.6327x-15.6283,-86.9333x-23.2937,-84.5723x-30.7818,-81.5677x-38.0356,-77.9423x-45,-73.7237x-51.6219,-68.944x-57.8509,-63.6396x-63.6396,-57.8509x-68.944,-51.6219x-73.7237,-45x-77.9423,-38.0356x-81.5677,-30.7818x-84.5723,-23.2937x-86.9333,-15.6283x-88.6327,-7.84402x-89.6575,-1.65327e-14x-90,7.84402x-89.6575,15.6283x-88.6327,23.2937x-86.9333,30.7818x-84.5723,38.0356x-81.5677,45x-77.9423,51.6219x-73.7237,57.8509x-68.944,63.6396x-63.6396,68.944x-57.8509,73.7237x-51.6219,77.9423x-45,81.5677x-38.0356,84.5723x-30.7818,86.9333x-23.2937,88.6327x-15.6283,89.6575x-7.84402,90x-2.20436e-14 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-39.672 Y69.712 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-38.457 Y70.397 E0.209\nG1 X-37.043 Y71.157 E0.241\nG1 X-35.614 Y71.889 E0.241\nG1 X-34.171 Y72.591 E0.241\nG1 X-32.714 Y73.265 E0.241\nG1 X-31.244 Y73.909 E0.241\nG1 X-29.761 Y74.523 E0.241\nG1 X-28.266 Y75.108 E0.241\nG1 X-26.759 Y75.662 E0.241\nG1 X-25.242 Y76.185 E0.241\nG1 X-23.714 Y76.678 E0.241\nG1 X-22.177 Y77.14 E0.241\nG1 X-20.63 Y77.571 E0.241\nG1 X-19.076 Y77.971 E0.241\nG1 X-17.514 Y78.34 E0.241\nG1 X-15.944 Y78.677 E0.241\nG1 X-14.368 Y78.982 E0.241\nG1 X-12.786 Y79.255 E0.241\nG1 X-11.199 Y79.497 E0.241\nG1 X-9.608 Y79.706 E0.241\nG1 X-8.013 Y79.884 E0.241\nG1 X-6.414 Y80.029 E0.241\nG1 X-4.813 Y80.142 E0.241\nG1 X-3.21 Y80.223 E0.241\nG1 X-1.605 Y80.271 E0.241\nG1 X0 Y80.287 E0.241\nG1 X1.605 Y80.271 E0.502\nG1 X3.21 Y80.223 E0.502\nG1 X4.813 Y80.142 E0.502\nG1 X6.414 Y80.029 E0.502\nG1 X8.013 Y79.884 E0.502\nG1 X9.608 Y79.706 E0.502\nG1 X11.199 Y79.497 E0.501\nG1 X12.786 Y79.255 E0.502\nG1 X14.368 Y78.982 E0.502\nG1 X15.944 Y78.677 E0.502\nG1 X17.514 Y78.34 E0.502\nG1 X19.076 Y77.971 E0.502\nG1 X20.63 Y77.571 E0.501\nG1 X22.177 Y77.14 E0.502\nG1 X23.714 Y76.678 E0.502\nG1 X25.242 Y76.185 E0.502\nG1 X26.759 Y75.662 E0.501\nG1 X28.266 Y75.108 E0.502\nG1 X29.761 Y74.523 E0.502\nG1 X31.244 Y73.909 E0.502\nG1 X32.714 Y73.265 E0.502\nG1 X34.171 Y72.591 E0.502\nG1 X35.614 Y71.889 E0.501\nG1 X37.043 Y71.157 E0.502\nG1 X38.457 Y70.397 E0.502\nG1 X39.672 Y69.712 E0.436\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} + +## Anycubic MEGA ZERO +## Author: https://github.com/kad +## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4057 + +# Common print preset +[print:*common_mega0*] +avoid_crossing_perimeters = 1 +bridge_angle = 0 +bridge_flow_ratio = 0.7 +bridge_speed = 25 +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers = +complete_objects = 0 +dont_support_bridges = 1 +elefant_foot_compensation = 0 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeters_first = 0 +external_perimeter_extrusion_width = 0.45 +extra_perimeters = 0 +extruder_clearance_height = 25 +extruder_clearance_radius = 45 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = grid +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 20 +gap_fill_speed = 30 +gcode_comments = 0 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.45 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +interface_shells = 0 +max_print_speed = 100 +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +max_volumetric_speed = 0 +min_skirt_length = 4 +notes = +overhangs = 1 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 1 +skirts = 2 +skirt_distance = 2 +skirt_height = 2 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_extruder = 0 +support_material_extrusion_width = 0.4 +support_material_interface_extruder = 0 +support_material_angle = 0 +support_material_buildplate_only = 0 +support_material_enforce_layers = 0 +support_material_contact_distance = 0.15 +support_material_interface_contact_loops = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 100% +support_material_pattern = rectilinear +support_material_spacing = 2 +support_material_speed = 40 +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 0 +support_material_xy_spacing = 60% +thin_walls = 0 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 40 +travel_speed = 100 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:*0.10mm_mega0*] +inherits = *common_mega0* +perimeter_speed = 40 +external_perimeter_speed = 25 +infill_speed = 50 +solid_infill_speed = 40 +layer_height = 0.10 +perimeters = 3 +top_infill_extrusion_width = 0.4 +bottom_solid_layers = 6 +top_solid_layers = 7 + +[print:*0.20mm_mega0*] +inherits = *common_mega0* +perimeter_speed = 40 +external_perimeter_speed = 25 +infill_speed = 50 +solid_infill_speed = 40 +layer_height = 0.20 +top_infill_extrusion_width = 0.4 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.30mm_mega0*] +inherits = *common_mega0* +perimeter_speed = 40 +external_perimeter_speed = 25 +infill_speed = 50 +solid_infill_speed = 40 +layer_height = 0.24 +top_infill_extrusion_width = 0.45 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:0.10mm DETAIL @MEGA0] +inherits = *0.10mm_mega0* +travel_speed = 120 +infill_speed = 50 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +support_material_extrusion_width = 0.38 +compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 + +[print:0.20mm NORMAL @MEGA0] +inherits = *0.20mm_mega0* +travel_speed = 120 +infill_speed = 50 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +support_material_extrusion_width = 0.38 +compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 + +[print:0.30mm DRAFT @MEGA0] +inherits = *0.30mm_mega0* +travel_speed = 120 +infill_speed = 50 +solid_infill_speed = 40 +top_solid_infill_speed = 30 +support_material_extrusion_width = 0.38 +compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4 + +# Common filament preset +[filament:*common_mega0*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_model=="MEGA0" + +[filament:*PLA_mega0*] +inherits = *common_mega0* +bed_temperature = 40 +fan_below_layer_time = 100 +filament_colour = #FF3232 +filament_max_volumetric_speed = 15 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 40 +first_layer_temperature = 215 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 210 + +[filament:*PET_mega0*] +inherits = *common_mega0* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature =70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS_mega0*] +inherits = *common_mega0* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #3A80CA +filament_max_volumetric_speed = 11 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @MEGA0] +inherits = *PLA_mega0* +filament_vendor = Generic + +[filament:Generic PETG @MEGA0] +inherits = *PET_mega0* +filament_vendor = Generic + +[filament:Generic ABS @MEGA0] +inherits = *ABS_mega0* +filament_vendor = Generic + +[filament:Anycubic PLA @MEGA0] +inherits = *PLA_mega0* +filament_vendor = Anycubic +temperature = 190 +first_layer_temperature = 195 +filament_cost = 24.99 +filament_density = 1.25 + +[filament:Prusament PLA @MEGA0] +inherits = *PLA_mega0* +filament_vendor = Prusa Polymers +temperature = 215 +bed_temperature = 40 +first_layer_temperature = 215 +filament_cost = 24.99 +filament_density = 1.24 + +[filament:Prusament PETG @MEGA0] +inherits = *PET_mega0* +filament_vendor = Prusa Polymers +temperature = 245 +bed_temperature = 70 +first_layer_temperature = 245 +filament_cost = 24.99 +filament_density = 1.27 + +# Common printer preset +[printer:*common_mega0*] +printer_technology = FFF +bed_shape = 0x0,220x0,220x220,0x220 +before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm\nG92 E0 +between_objects_gcode = +deretract_speed = 0 +extruder_colour = #FFFF00 +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 0 +remaining_times = 0 +machine_max_acceleration_e = 10000 +machine_max_acceleration_extruding = 2000 +machine_max_acceleration_retracting = 1500 +machine_max_acceleration_x = 3000 +machine_max_acceleration_y = 3000 +machine_max_acceleration_z = 500 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 12 +machine_max_jerk_e = 2.5 +machine_max_jerk_x = 20 +machine_max_jerk_y = 20 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ; AFTER_LAYER_CHANGE [layer_num] @ [layer_z]mm +max_layer_height = 0.3 +min_layer_height = 0.1 +max_print_height = 200 +nozzle_diameter = 0.4 +printer_notes = +printer_settings_id = +retract_before_travel = 1 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 6 +retract_length_toolchange = 1 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 30 +single_extruder_multi_material = 0 +start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n +end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 1 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 +printer_model = +default_print_profile = +default_filament_profile = + +[printer:Anycubic Mega Zero] +inherits = *common_mega0* +printer_model = MEGA0 +printer_variant = 0.4 +max_layer_height = 0.3 +min_layer_height = 0.1 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_MEGA0 +bed_shape = 0x0,220x0,220x220,0x220 +max_print_height = 250 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 500 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 25 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 5 +machine_max_jerk_e = 5 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +nozzle_diameter = 0.4 +retract_before_travel = 2 +retract_layer_change = 0 +retract_length = 7 +retract_speed = 30 +retract_lift = 0.2 +deretract_speed = 30 +retract_before_wipe = 70% +default_print_profile = 0.20mm NORMAL @MEGA0 +default_filament_profile = Anycubic PLA @MEGA0 +start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; set extruder temp\nM109 S[first_layer_temperature]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n +end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n + +## Anycubic i3 Mega and i3 Mega S +## Author: https://github.com/Igami +## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4619 + +[print:*common_mega*] +bottom_solid_min_thickness = 0.5 +bridge_acceleration = 1000 +bridge_flow_ratio = 0.95 +bridge_speed = 25 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ and nozzle_diameter[0]==0.4 +default_acceleration = 1000 +ensure_vertical_shell_thickness = 1 +external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 40 +extruder_clearance_height = 35 +extruder_clearance_radius = 60 +extrusion_width = 0.45 +fill_density = 15% +fill_pattern = gyroid +first_layer_acceleration = 800 +first_layer_extrusion_width = 0.42 +first_layer_height = 0.2 +first_layer_speed = 20 +gap_fill_speed = 40 +gcode_comments = 0 +gcode_label_objects = 1 +infill_acceleration = 1000 +infill_anchor = 2.5 +infill_anchor_max = 12 +infill_extrusion_width = 0.45 +max_print_speed = 100 +min_skirt_length = 4 +only_retract_when_crossing_perimeters = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.45 +perimeter_speed = 50 +perimeters = 2 +seam_position = nearest +skirt_distance = 2 +skirt_height = 3 +skirts = 1 +small_perimeter_speed = 25 +solid_infill_below_area = 0 +solid_infill_extrusion_width = 0.45 +solid_infill_speed = 50 +support_material = 0 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.1 +support_material_extrusion_width = 0.35 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_speed = 80% +support_material_spacing = 2 +support_material_speed = 50 +support_material_threshold = 50 +support_material_xy_spacing = 60% +thin_walls = 0 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 40 +top_solid_min_thickness = 0.7 +travel_speed = 180 + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.15mm ---XXX +# XXXXXXXXXXXXXXXXXXXX + +[print:*0.15mm_mega*] +inherits = *common_mega* +bottom_solid_layers = 5 +bridge_flow_ratio = 1 +infill_speed = 60 +layer_height = 0.15 +top_solid_layers = 7 + +[print:0.15mm QUALITY @MEGA] +inherits = *0.15mm_mega* + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.20mm ---XXX +# XXXXXXXXXXXXXXXXXXXX + +[print:*0.20mm_mega*] +inherits = *common_mega* +bottom_solid_layers = 4 +infill_speed = 60 +layer_height = 0.2 +top_solid_layers = 5 + +[print:0.20mm QUALITY @MEGA] +inherits = *0.20mm_mega* + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.30mm ---XXX +# XXXXXXXXXXXXXXXXXXXX + +[print:*0.30mm_mega*] +inherits = *common_mega* +bottom_solid_layers = 4 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 35 +extrusion_width = 0.5 +fill_pattern = cubic +infill_extrusion_width = 0.5 +infill_speed = 85 +layer_height = 0.3 +perimeter_extrusion_width = 0.5 +small_perimeter_speed = 30 +solid_infill_extrusion_width = 0.5 +support_material_extrusion_width = 0.38 +support_material_speed = 45 +top_solid_layers = 4 + +[print:0.30mm DRAFT @MEGA] +inherits = *0.30mm_mega* + +# XXXXXXXXXXXXXXXXXXXXXX +# XXX--- filament ---XXX +# XXXXXXXXXXXXXXXXXXXXXX + +[filament:*common_mega*] +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ +end_filament_gcode = "; Filament-specific end gcode" +fan_always_on = 1 +fan_below_layer_time = 100 +filament_vendor = Generic +min_print_speed = 15 +slowdown_below_layer_time = 20 + +[filament:*ABS_mega*] + inherits = *common_mega* + bed_temperature = 110 + bridge_fan_speed = 25 + cooling = 0 + fan_always_on = 0 + fan_below_layer_time = 20 + filament_colour = #3A80CA + filament_cost = 27.82 + filament_density = 1.04 + filament_max_volumetric_speed = 11 + filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + filament_type = ABS + first_layer_bed_temperature = 105 + first_layer_temperature = 255 + max_fan_speed = 30 + min_fan_speed = 20 + temperature = 255 + +[filament:Generic ABS @MEGA] +inherits = *ABS_mega* + +[filament:*FLEX_mega*] +inherits = *common_mega* +bed_temperature = 50 +bridge_fan_speed = 80 +cooling = 0 +extrusion_multiplier = 1.15 +fan_always_on = 0 +filament_colour = #008000 +filament_cost = 82.00 +filament_density = 1.22 +filament_deretract_speed = 25 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0.8 +filament_type = FLEX +first_layer_bed_temperature = 55 +first_layer_temperature = 240 +max_fan_speed = 90 +min_fan_speed = 70 +temperature = 240 + +[filament:Generic FLEX @MEGA] +inherits = *FLEX_mega* + +[filament:SainSmart TPU @MEGA] +inherits = *FLEX_mega* +filament_vendor = SainSmart +bed_temperature = 50 +bridge_fan_speed = 100 +cooling = 1 +disable_fan_first_layers = 4 +filament_cost = 39.99 +filament_density = 1.21 +filament_deretract_speed = 15 +filament_max_volumetric_speed = 1.8 +filament_notes = "SainSmart TPU gains popularity among 3D Printing community for its balance of rigidity and flexibility. In addition, with a 95A Shore Hardness and improved bed adhesion, it is easier to print even with a stock elementary 3D Printer like the Creality Ender 3. SainSmart TPU will not disappoint if you are looking for flexible filament. From drone parts, phone cases, to small toys, all can be printed with ease.\n\nhttps://www.sainsmart.com/collections/tpu-filament/products/all-colors-tpu-flexible-filament-1-75mm-0-8kg-1-76lb" +filament_retract_before_travel = 5 +filament_retract_length = 4 +filament_retract_speed = 40 +filament_unloading_speed = 90 +first_layer_bed_temperature = 55 +first_layer_temperature = 235 +full_fan_speed_layer = 6 +max_fan_speed = 80 +min_fan_speed = 80 +slowdown_below_layer_time = 10 +temperature = 235 + +[filament:*PETG_mega*] +inherits = *common_mega* +bed_temperature = 90 +bridge_fan_speed = 50 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_cost = 27.82 +filament_density = 1.27 +filament_max_volumetric_speed = 8 +filament_type = PETG +first_layer_bed_temperature = 90 +first_layer_temperature = 230 +max_fan_speed = 50 +min_fan_speed = 30 +temperature = 240 + +[filament:Generic PETG @MEGA] +inherits = *PETG_mega* + +[filament:ColorFabb XT-CF20 @MEGA] +inherits = *PETG_mega* +compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ +extrusion_multiplier = 1.05 +filament_colour = #804040 +filament_cost = 66.60 +filament_density = 1.35 +filament_deretract_speed = 25 +filament_max_volumetric_speed = 2 +filament_notes = "Based on colorFabb_XT, XT-CF20 is a carbon fiber composite material. Loaded with no less than 20% specially sourced carbon fibers we have developed a very stiff and tough 3D printing filament made for functional parts. It is truly a professional printers go-to material, especially for users looking for high melt strength, high melt viscosity and good dimensional accuracy and stability.\n\nhttps://colorfabb.com/xt-cf20" +filament_retract_before_travel = 1 +filament_retract_length = 1.4 +filament_retract_speed = 40 +filament_spool_weight = 236 +filament_vendor = ColorFabb +first_layer_temperature = 260 +full_fan_speed_layer = 5 +slowdown_below_layer_time = 15 +temperature = 260 + +[filament:ERYONE PETG @MEGA] +inherits = *PETG_mega* +filament_vendor = ERYONE +filament_cost = 20.99 +filament_notes = "https://eryone.com/petg/show/10.html" + +[filament:FormFutura HDglass @MEGA] +inherits = *PETG_mega* +filament_vendor = FormFutura +filament_cost = 46.65 +filament_notes = "HDglass is a high performance PETG type of 3D printer with unsurpassed 3D printing properties and improved mechanical strength, flexibility, toughness and heat resistance.\n\nhttps://www.formfutura.com/shop/product/hdglass-2812" + +[filament:FormFutura ReForm rPET @MEGA] +inherits = *PETG_mega* +filament_vendor = FormFutura +filament_cost = 26.65 +filament_notes = "ReForm rPET is a recycled PETG type of 3D printer filament that is made from post-industrial waste streams of a nearby located plastic bottle manufacturer.\n\nhttps://www.formfutura.com/shop/product/reform-rpet-2836" +filament_spool_weight = 176 + +[filament:Janbex transparent PETG @MEGA] +inherits = *PETG_mega* +filament_vendor = Janbex +filament_cost = 31.99 +filament_spool_weight = 222 +first_layer_temperature = 215 +min_fan_speed = 100 +temperature = 210 + +[filament:DAS FILAMENT PETG @MEGA] +inherits = *PETG_mega* +filament_vendor = DAS FILAMENT +bed_temperature = 75 +first_layer_bed_temperature = 75 +first_layer_temperature = 220 +temperature = 225 + +[filament:*PLA_mega*] +inherits = *common_mega* +bed_temperature = 60 +disable_fan_first_layers = 1 +filament_colour = #FF3232 +filament_cost = 25.40 +filament_density = 1.24 +filament_max_volumetric_speed = 10 +first_layer_bed_temperature = 65 +first_layer_temperature = 215 +min_fan_speed = 100 +temperature = 210 + +[filament:Generic PLA @MEGA] +inherits = *PLA_mega* + +[filament:3Dmensionals PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = 3Dmensionals +filament_cost = 22.90 +filament_notes = "Das 3DFilaments - PLA von 3Dmensionals ist ein sehr leicht zu druckendes 3D-Drucker Filament. Dabei handelt es sich um ein etwas härteres PLA mit einer exzellenten thermischen Stabilität. Das Filament zeichnet sich vor allem durch verzugfreies 3D-Drucken aus und weist minimale bis keine Verformung nach dem Abkühlen auf. Daher ist es besonders gut für den Druck größerer Objekte geeignet. Zudem bietet 3DFilaments - PLA über die gesamte Fadenläge eine hervorragende Durchmesser- und Rundheitstoleranz.\n\nhttps://www.3dmensionals.de/3dfilaments?number=PSU3DM001V" + +[filament:3D Warhorse PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = 3D Warhorse +filament_cost = 19.99 + +[filament:AMOLEN wood PLA] +inherits = *PLA_mega* +filament_vendor = AMOLEN +compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ +extrusion_multiplier = 1.1 +filament_colour = #DFC287 +filament_cost = 33.99 +filament_density = 1.23 +filament_max_volumetric_speed = 9 +filament_notes = "https://amolen.com/collections/wood/products/amolen-pla-filament-1-75mm-wood-color-3d-printer-filament-1kg2-2lb" + +[filament:FormFutura EasyFil PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = FormFutura +filament_cost = 39.93 +filament_notes = "EasyFil PLA is an easy to print PLA type of 3D printer filament that is available in a wide variety of colors. Its improved flowing behavior make 3D printed layers flow more into each other.\n\nhttps://www.formfutura.com/shop/product/easyfil-pla-2801" + +[filament:FormFutura ReForm rPLA @MEGA] +inherits = *PLA_mega* +filament_vendor = FormFutura +filament_cost = 26.65 +filament_notes = "ReForm is a sustainable initiative within Formfutura to efficiently manage residual extrusion waste streams and re-use them into high-end upcycled filaments. The ideology behind ReForm is to a make 3D printing more sustainable – without having to make compromises on material properties – and yet keep it affordable.\n\nhttps://www.formfutura.com/shop/product/reform-rpla-2838" + +[filament:GIANTARM PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = GIANTARM +filament_cost = 24.99 + +[filament:Prusament PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = Prusa Polymers +filament_cost = 30.24 +filament_notes = "Affordable filament for everyday printing in premium quality manufactured in-house by Josef Prusa" +filament_spool_weight = 201 +temperature = 215 + +[filament:Verbatim PLA @MEGA] +inherits = *PLA_mega* +filament_vendor = Verbatim +filament_cost = 23.88 + +[printer:*common_mega*] +printer_technology = FFF +bed_shape = 0x0,210x0,210x210,0x210 +before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z] +default_filament_profile = Generic PLA @MEGA +default_print_profile = 0.15mm QUALITY @MEGA +deretract_speed = 50 +end_gcode = G1 E-1.0 F2100 ; retract\nG92 E0.0\nG1{if max_layer_z < max_print_height} Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} E-34.0 F720 ; move print head up & retract filament\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y105 F3000 ; park print head\nM84 ; disable motors +extruder_colour = #808080 +gcode_flavor = marlin +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +max_layer_height = 0.36 +max_print_height = 205 +remaining_times = 1 +retract_before_travel = 1.5 +retract_before_wipe = 60% +retract_layer_change = 1 +retract_length = 6 +retract_lift = 0.075 +retract_lift_below = 204 +retract_speed = 40 +silent_mode = 0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Y1.0 Z0.3 F1000 ; move print head up\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG92 E0.0\n; initial load\nG1 X205.0 E19 F1000\nG1 Y1.6\nG1 X5.0 E19 F1000\nG92 E0.0\n; intro line\nG1 Y2.0 Z0.2 F1000\nG1 X65.0 E9.0 F1000\nG1 X105.0 E12.5 F1000\nG92 E0.0 +thumbnails = 16x16,220x124 +use_relative_e_distances = 1 +wipe = 1 +machine_max_acceleration_e = 10000 +machine_max_acceleration_extruding = 1250 +machine_max_acceleration_retracting = 1250 +machine_max_acceleration_x = 3000 +machine_max_acceleration_y = 2000 +machine_max_acceleration_z = 60 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 6 +machine_max_jerk_e = 5 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 0.4 + +[printer:Anycubic i3 Mega] +inherits = *common_mega* +printer_model = I3MEGA +printer_variant = 0.4 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_I3_MEGA\nPRINTER_HAS_BOWDEN + +[printer:Anycubic i3 Mega S] +inherits = *common_mega* +printer_model = I3MEGAS +printer_variant = 0.4 +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_I3_MEGA_S\nPRINTER_HAS_BOWDEN +machine_max_feedrate_e = 30 +machine_max_feedrate_z = 8 + + +## Anycubic PREDATOR +## Author: https://github.com/tillverka3d +## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4960 + +######################################### +###### begin common print presets ####### +######################################### + +# Common print preset +[print:*common predator*] +spiral_vase = 0 +top_solid_min_thickness = 0.8 +bottom_solid_min_thickness = 0.6 +extra_perimeters = 0 +ensure_vertical_shell_thickness = 1 +avoid_crossing_perimeters = 0 +thin_walls = 0 +overhangs = 1 +seam_position = nearest +external_perimeters_first = 0 +fill_density = 20% +external_fill_pattern = rectilinear +infill_every_layers = 1 +infill_only_where_needed = 0 +solid_infill_every_layers = 0 +fill_angle = 45 +solid_infill_below_area = 20 +bridge_angle = 0 +only_retract_when_crossing_perimeters = 0 +infill_first = 0 +skirts = 1 +skirt_distance = 4 +skirt_height = 1 +min_skirt_length = 8 +brim_width = 0 +support_material = 0 +support_material_auto = 1 +support_material_threshold = 50 +support_material_enforce_layers = 0 +raft_layers = 0 +support_material_contact_distance = 0.1 +support_material_pattern = rectilinear +support_material_with_sheath = 0 +support_material_spacing = 2 +support_material_angle = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_contact_loops = 0 +support_material_buildplate_only = 0 +support_material_xy_spacing = 60% +dont_support_bridges = 1 +support_material_synchronize_layers = 0 +travel_speed = 94 +first_layer_speed = 15 +perimeter_acceleration = 0 +infill_acceleration = 0 +bridge_acceleration = 0 +first_layer_acceleration = 0 +default_acceleration = 0 +max_volumetric_speed = 15 +perimeter_extruder = 1 +infill_extruder = 1 +solid_infill_extruder = 1 +support_material_extruder = 0 +support_material_interface_extruder = 0 +ooze_prevention = 0 +standby_temperature_delta = -5 +wipe_tower = 0 +wipe_tower_x = 170 +wipe_tower_y = 140 +wipe_tower_width = 60 +wipe_tower_rotation_angle = 0 +wipe_tower_bridging = 10 +interface_shells = 0 +bridge_flow_ratio = 0.8 +resolution = 0 +xy_size_compensation = 0 +elefant_foot_compensation = 0.2 +clip_multipart_objects = 1 +complete_objects = 0 +extruder_clearance_radius = 45 +extruder_clearance_height = 25 +gcode_comments = 0 +output_filename_format = {input_filename_base}.gcode +post_process = +notes = +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +print_settings_id = + +# Common print preset +[print:*common predator 0.4 nozzle*] +inherits = *common predator* +first_layer_height = 0.16 +infill_overlap = 25% +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.4 + +# Common print preset +[print:*common predator 0.6 nozzle*] +inherits = *common predator* +first_layer_height = 0.24 +infill_overlap = 27% +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.6 + +# Common print preset +[print:*common predator 0.8 nozzle*] +inherits = *common predator* +first_layer_height = 0.32 +infill_overlap = 30% +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.8 + +# Common print preset +[print:*common predator quality*] +perimeter_speed = 50 +small_perimeter_speed = 15 +external_perimeter_speed = 70% +infill_speed = 65 +solid_infill_speed = 85% +top_solid_infill_speed = 85% +support_material_speed = 30 +support_material_interface_speed = 85% +bridge_speed = 30 +gap_fill_speed = 40 +ironing_speed = 15 + +# Common print preset +[print:*common predator speed*] +perimeter_speed = 70 +small_perimeter_speed = 15 +external_perimeter_speed = 70% +infill_speed = 85 +solid_infill_speed = 85% +top_solid_infill_speed = 85% +support_material_speed = 30 +support_material_interface_speed = 85% +bridge_speed = 30 +gap_fill_speed = 40 +ironing_speed = 15 + +# Common print preset +[print:*common predator 0.4 nozzle detailed*] +inherits = *common predator 0.4 nozzle* +extrusion_width = 0.42 +first_layer_extrusion_width = 0.41 +perimeter_extrusion_width = 0.42 +external_perimeter_extrusion_width = 0.42 +infill_extrusion_width = 0.4 +solid_infill_extrusion_width = 0.4 +top_infill_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 + +# Common print preset +[print:*common predator 0.4 nozzle coarse*] +inherits = *common predator 0.4 nozzle* +extrusion_width = 0.44 +first_layer_extrusion_width = 0.42 +perimeter_extrusion_width = 0.5 +external_perimeter_extrusion_width = 0.5 +infill_extrusion_width = 0.5 +solid_infill_extrusion_width = 0.5 +top_infill_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 + +# Common print preset +[print:*common predator 0.6 nozzle detailed*] +inherits = *common predator 0.6 nozzle* +extrusion_width = 0.64 +first_layer_extrusion_width = 0.62 +perimeter_extrusion_width = 0.64 +external_perimeter_extrusion_width = 0.64 +infill_extrusion_width = 0.6 +solid_infill_extrusion_width = 0.6 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.56 + +# Common print preset +[print:*common predator 0.6 nozzle coarse*] +inherits = *common predator 0.6 nozzle* +extrusion_width = 0.67 +first_layer_extrusion_width = 0.64 +perimeter_extrusion_width = 0.7 +external_perimeter_extrusion_width = 0.7 +infill_extrusion_width = 0.7 +solid_infill_extrusion_width = 0.7 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.56 + +# Common print preset +[print:*common predator 0.8 nozzle detailed*] +inherits = *common predator 0.8 nozzle* +extrusion_width = 0.84 +first_layer_extrusion_width = 0.82 +perimeter_extrusion_width = 0.84 +external_perimeter_extrusion_width = 0.84 +infill_extrusion_width = 0.8 +solid_infill_extrusion_width = 0.8 +top_infill_extrusion_width = 0.8 +support_material_extrusion_width = 0.72 + +# Common print preset +[print:*common predator 0.8 nozzle coarse*] +inherits = *common predator 0.8 nozzle* +extrusion_width = 0.87 +first_layer_extrusion_width = 0.84 +perimeter_extrusion_width = 0.9 +external_perimeter_extrusion_width = 0.9 +infill_extrusion_width = 0.9 +solid_infill_extrusion_width = 0.9 +top_infill_extrusion_width = 0.8 +support_material_extrusion_width = 0.72 + +######################################### +####### end common print presets ######## +######################################### + +######################################### +########## begin print presets ########## +######################################### + +[print:0.08mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.08 +max_print_speed = 50 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.16 +max_print_speed = 60 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.16 +max_print_speed = 60 +perimeters = 3 +fill_pattern = grid + +[print:0.24mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.24mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.32mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.32mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.16 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.16 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.16 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.16 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.4 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.4 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.24 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.24 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.32 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.32 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.4 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.4 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.48 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.48 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.48 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.48 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +######################################### +########### end print presets ########### +######################################### + +######################################### +######## begin filament presets ######### +######################################### + +# Common filament preset +[filament:*common predator*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ + +[filament:*PLA predator*] +inherits = *common predator* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #FF3232 +filament_max_volumetric_speed = 10 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 200 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 200 + +[filament:*PET predator*] +inherits = *common predator* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature =70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS predator*] +inherits = *common predator* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #3A80CA +filament_max_volumetric_speed = 10 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @PREDATOR] +inherits = *PLA predator* +filament_vendor = Generic + +[filament:Generic PETG @PREDATOR] +inherits = *PET predator* +filament_vendor = Generic + +[filament:Generic ABS @PREDATOR] +inherits = *ABS predator* +filament_vendor = Generic + +######################################### +######### end filament presets ########## +######################################### + +######################################### +######### begin printer presets ######### +######################################### + +# Anycubic predator common printer preset +[printer:*common predator*] +printer_vendor = Anycubic +printer_model = Predator +printer_technology = FFF +printer_variant = 0.4 +thumbnails = 16x16,220x124 +bed_shape = 188.779x16.516,186.621x32.9063,183.043x49.0462,178.072x64.8128,171.745x80.0862,164.112x94.75,155.229x108.693,145.165x121.808,133.997x133.997,121.808x145.165,108.693x155.229,94.75x164.112,80.0862x171.745,64.8128x178.072,49.0462x183.043,32.9063x186.621,16.516x188.779,1.16035e-14x189.5,-16.516x188.779,-32.9063x186.621,-49.0462x183.043,-64.8128x178.072,-80.0862x171.745,-94.75x164.112,-108.693x155.229,-121.808x145.165,-133.997x133.997,-145.165x121.808,-155.229x108.693,-164.112x94.75,-171.745x80.0862,-178.072x64.8128,-183.043x49.0462,-186.621x32.9063,-188.779x16.516,-189.5x2.32071e-14,-188.779x-16.516,-186.621x-32.9063,-183.043x-49.0462,-178.072x-64.8128,-171.745x-80.0862,-164.112x-94.75,-155.229x-108.693,-145.165x-121.808,-133.997x-133.997,-121.808x-145.165,-108.693x-155.229,-94.75x-164.112,-80.0862x-171.745,-64.8128x-178.072,-49.0462x-183.043,-32.9063x-186.621,-16.516x-188.779,-3.48106e-14x-189.5,16.516x-188.779,32.9063x-186.621,49.0462x-183.043,64.8128x-178.072,80.0862x-171.745,94.75x-164.112,108.693x-155.229,121.808x-145.165,133.997x-133.997,145.165x-121.808,155.229x-108.693,164.112x-94.75,171.745x-80.0862,178.072x-64.8128,183.043x-49.0462,186.621x-32.9063,188.779x-16.516,189.5x-4.64141e-14 +max_print_height = 445 +z_offset = 0 +single_extruder_multi_material = 0 +gcode_flavor = reprap +silent_mode = 0 +remaining_times = 0 +use_relative_e_distances = 0 +use_firmware_retraction = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +start_gcode = ; start_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; set metric values\n\nG21\n\n; use absolute positioning\n\nG90\n\n; set extruder to absolute mode\n\nM82\n\n; start with fan off\n\nM107\n\n; set temps\n\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\n\n; home xy\n\nG28 X0 Y0\n\n; home z\n\nG28 Z0\n\n; move the head down to Z 94mm\n\nG1 Z94.0 F2394\n\n; set and wait for temps\n\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\n\n; zero the extruded length\n\nG92 E0\n\n; extrude 3mm of feed stock\n\nG1 F200 E3\n\n; zero the extruded length again\n\nG92 E0\n\n; set speed\n\nG1 F{travel_speed}\n\n; print preskirt\n\nG92 E0\nG1 E3.94000 F2520.00000\n\nG1 X125.464 Y-139.310\nG1 Z0.329 F3994.000\n\nG1 F994.000\n\nG1 X125.464 Y-139.310 E4.19679\nG1 X130.218 Y-134.876 E4.70359\nG1 X132.569 Y-132.567 E4.96053\nG1 X137.099 Y-127.877 E5.46890\nG1 X139.325 Y-125.447 E5.72585\nG1 X141.507 Y-122.981 E5.98254\nG1 X145.685 Y-118.002 E6.48934\nG1 X149.741 Y-112.810 E7.00296\nG1 X153.561 Y-107.552 E7.50975\nG1 X155.440 Y-104.819 E7.76827\nG1 X158.980 Y-99.367 E8.27506\nG1 X160.702 Y-96.558 E8.53201\nG1 X163.962 Y-90.911 E9.04038\nG1 X165.535 Y-88.015 E9.29732\nG1 X168.496 Y-82.205 E9.80570\nG1 X169.915 Y-79.231 E10.06264\nG1 X171.280 Y-76.235 E10.31934\nG1 X173.819 Y-70.251 E10.82613\nG1 X176.180 Y-64.101 E11.33975\nG1 X178.297 Y-57.955 E11.84654\nG1 X179.294 Y-54.793 E12.10507\nG1 X181.085 Y-48.544 E12.61186\nG1 X181.911 Y-45.354 E12.86880\nG1 X183.378 Y-39.001 E13.37718\nG1 X184.035 Y-35.771 E13.63412\nG1 X185.168 Y-29.350 E14.14250\nG1 X185.655 Y-26.091 E14.39944\nG1 X186.084 Y-22.826 E14.65614\nG1 X186.764 Y-16.362 E15.16293\nG1 X187.223 Y-9.790 E15.67655\nG1 X187.450 Y-3.294 E16.18334\nG1 X187.479 Y0.002 E16.44028\nG1 X187.450 Y3.294 E16.69698\nG1 X187.223 Y9.810 E17.20529\nG1 X187.021 Y13.100 E17.46229\nG1 X186.454 Y19.575 E17.96909\nG1 X186.079 Y22.870 E18.22761\nG1 X185.174 Y29.307 E18.73440\nG1 X184.031 Y35.794 E19.24802\nG1 X182.679 Y42.152 E19.75481\nG1 X181.910 Y45.357 E20.01176\nG1 X180.223 Y51.655 E20.52013\nG1 X179.287 Y54.815 E20.77708\nG1 X177.272 Y61.017 E21.28545\nG1 X176.172 Y64.123 E21.54239\nG1 X175.019 Y67.207 E21.79909\nG1 X172.584 Y73.234 E22.30588\nG1 X169.905 Y79.252 E22.81950\nG1 X167.055 Y85.094 E23.32629\nG1 X165.524 Y88.035 E23.58482\nG1 X162.373 Y93.721 E24.09161\nG1 X160.700 Y96.560 E24.34855\nG1 X157.245 Y102.090 E24.85693\nG1 X155.427 Y104.838 E25.11387\nG1 X151.687 Y110.180 E25.62225\nG1 X149.727 Y112.829 E25.87919\nG1 X147.722 Y115.441 E26.13588\nG1 X143.631 Y120.493 E26.64268\nG1 X139.310 Y125.464 E27.15629\nG1 X134.876 Y130.218 E27.66309\nG1 X132.567 Y132.569 E27.92003\nG1 X127.877 Y137.099 E28.42840\nG1 X125.447 Y139.325 E28.68535\nG1 X122.981 Y141.507 E28.94204\nG1 X118.002 Y145.685 E29.44883\nG1 X112.810 Y149.741 E29.96245\nG1 X107.552 Y153.561 E30.46924\nG1 X104.819 Y155.440 E30.72777\nG1 X99.367 Y158.980 E31.23456\nG1 X96.558 Y160.702 E31.49151\nG1 X90.911 Y163.962 E31.99988\nG1 X88.015 Y165.535 E32.25682\nG1 X82.205 Y168.496 E32.76520\nG1 X79.231 Y169.915 E33.02214\nG1 X76.235 Y171.280 E33.27884\nG1 X70.251 Y173.819 E33.78563\nG1 X64.101 Y176.180 E34.29925\nG1 X57.955 Y178.297 E34.80604\nG1 X54.793 Y179.294 E35.06457\nG1 X48.544 Y181.085 E35.57136\nG1 X45.354 Y181.911 E35.82830\nG1 X39.001 Y183.378 E36.33668\nG1 X35.771 Y184.035 E36.59362\nG1 X29.350 Y185.168 E37.10200\nG1 X26.091 Y185.655 E37.35894\nG1 X22.826 Y186.084 E37.61563\nG1 X16.362 Y186.764 E38.12242\nG1 X9.790 Y187.223 E38.63605\nG1 X3.294 Y187.450 E39.14283\nG1 X-0.002 Y187.479 E39.39978\nG1 X-3.294 Y187.450 E39.65648\nG1 X-9.810 Y187.223 E40.16479\nG1 X-13.100 Y187.021 E40.42179\nG1 X-19.575 Y186.454 E40.92858\nG1 X-22.870 Y186.079 E41.18711\nG1 X-29.307 Y185.174 E41.69390\nG1 X-35.794 Y184.031 E42.20752\nG1 X-42.152 Y182.679 E42.71431\nG1 X-45.357 Y181.910 E42.97126\nG1 X-51.655 Y180.223 E43.47963\nG1 X-54.815 Y179.287 E43.73657\nG1 X-61.017 Y177.272 E44.24495\nG1 X-64.123 Y176.172 E44.50189\nG1 X-67.207 Y175.019 E44.75859\nG1 X-73.234 Y172.584 E45.26538\nG1 X-79.252 Y169.905 E45.77900\nG1 X-85.094 Y167.055 E46.28579\nG1 X-88.035 Y165.524 E46.54432\nG1 X-93.721 Y162.373 E47.05111\nG1 X-96.560 Y160.700 E47.30805\nG1 X-102.090 Y157.245 E47.81643\nG1 X-104.838 Y155.427 E48.07337\nG1 X-110.180 Y151.687 E48.58174\nG1 X-112.829 Y149.727 E48.83869\nG1 X-115.441 Y147.722 E49.09538\nG1 X-120.493 Y143.631 E49.60218\nG1 X-125.464 Y139.310 E50.11579\nG1 X-130.218 Y134.876 E50.62259\nG1 X-132.569 Y132.567 E50.87953\nG1 X-137.099 Y127.877 E51.38790\nG1 X-139.325 Y125.447 E51.64485\nG1 X-141.507 Y122.981 E51.90154\nG1 X-145.685 Y118.002 E52.40833\nG1 X-149.741 Y112.810 E52.92195\nG1 X-153.561 Y107.552 E53.42874\nG1 X-155.440 Y104.819 E53.68727\nG1 X-158.980 Y99.367 E54.19406\nG1 X-160.702 Y96.558 E54.45101\nG1 X-163.962 Y90.911 E54.95938\nG1 X-165.535 Y88.015 E55.21632\nG1 X-168.496 Y82.205 E55.72470\nG1 X-169.915 Y79.231 E55.98164\nG1 X-171.280 Y76.235 E56.23834\nG1 X-173.819 Y70.251 E56.74513\nG1 X-176.180 Y64.101 E57.25875\nG1 X-178.297 Y57.955 E57.76554\nG1 X-179.294 Y54.793 E58.02407\nG1 X-181.085 Y48.544 E58.53086\nG1 X-181.911 Y45.354 E58.78780\nG1 X-183.378 Y39.001 E59.29618\nG1 X-184.035 Y35.771 E59.55312\nG1 X-185.168 Y29.350 E60.06149\nG1 X-185.655 Y26.091 E60.31844\nG1 X-186.084 Y22.826 E60.57513\nG1 X-186.764 Y16.362 E61.08192\nG1 X-187.223 Y9.790 E61.59554\nG1 X-187.450 Y3.294 E62.10233\nG1 X-187.479 Y-0.002 E62.35928\nG1 X-187.450 Y-3.294 E62.61598\nG1 X-187.223 Y-9.810 E63.12429\nG1 X-187.021 Y-13.100 E63.38129\nG1 X-186.454 Y-19.575 E63.88808\nG1 X-186.079 Y-22.870 E64.14661\nG1 X-185.174 Y-29.307 E64.65340\nG1 X-184.031 Y-35.794 E65.16702\nG1 X-182.679 Y-42.152 E65.67381\nG1 X-181.910 Y-45.357 E65.93076\nG1 X-180.223 Y-51.655 E66.43913\nG1 X-179.287 Y-54.815 E66.69607\nG1 X-177.272 Y-61.017 E67.20445\nG1 X-176.172 Y-64.123 E67.46139\nG1 X-175.019 Y-67.207 E67.71809\nG1 X-172.584 Y-73.234 E68.22488\nG1 X-169.905 Y-79.252 E68.73850\nG1 X-167.055 Y-85.094 E69.24529\nG1 X-165.524 Y-88.035 E69.50382\nG1 X-162.373 Y-93.721 E70.01061\nG1 X-160.700 Y-96.560 E70.26755\nG1 X-157.245 Y-102.090 E70.77593\nG1 X-155.427 Y-104.838 E71.03287\nG1 X-151.687 Y-110.180 E71.54124\nG1 X-149.727 Y-112.829 E71.79819\nG1 X-147.722 Y-115.441 E72.05488\nG1 X-143.631 Y-120.493 E72.56167\nG1 X-139.310 Y-125.464 E73.07529\nG1 X-134.876 Y-130.218 E73.58209\nG1 X-132.567 Y-132.569 E73.83903\nG1 X-127.877 Y-137.099 E74.34740\nG1 X-125.447 Y-139.325 E74.60435\nG1 X-122.981 Y-141.507 E74.86104\nG1 X-118.002 Y-145.685 E75.36783\nG1 X-112.810 Y-149.741 E75.88145\nG1 X-107.552 Y-153.561 E76.38824\nG1 X-104.819 Y-155.440 E76.64677\nG1 X-99.367 Y-158.980 E77.15356\nG1 X-96.558 Y-160.702 E77.41051\nG1 X-90.911 Y-163.962 E77.91888\nG1 X-88.015 Y-165.535 E78.17582\nG1 X-82.205 Y-168.496 E78.68420\nG1 X-79.231 Y-169.915 E78.94114\nG1 X-76.235 Y-171.280 E79.19784\nG1 X-70.251 Y-173.819 E79.70463\nG1 X-64.101 Y-176.180 E80.21825\nG1 X-57.955 Y-178.297 E80.72504\nG1 X-54.793 Y-179.294 E80.98356\nG1 X-48.544 Y-181.085 E81.49036\nG1 X-45.354 Y-181.911 E81.74730\nG1 X-39.001 Y-183.378 E82.25568\nG1 X-35.771 Y-184.035 E82.51262\nG1 X-29.350 Y-185.168 E83.02099\nG1 X-26.091 Y-185.655 E83.27794\nG1 X-22.826 Y-186.084 E83.53463\nG1 X-16.362 Y-186.764 E84.04142\nG1 X-9.790 Y-187.223 E84.55504\nG1 X-3.294 Y-187.450 E85.06183\nG1 X0.006 Y-187.479 E85.31908\nG1 X6.521 Y-187.366 E85.82715\nG1 X9.810 Y-187.223 E86.08379\nG1 X13.100 Y-187.021 E86.34079\nG1 X19.575 Y-186.454 E86.84758\nG1 X22.870 Y-186.079 E87.10611\nG1 X29.307 Y-185.174 E87.61290\nG1 X35.794 Y-184.031 E88.12652\nG1 X42.152 Y-182.679 E88.63331\nG1 X45.357 Y-181.910 E88.89025\nG1 X51.655 Y-180.223 E89.39863\nG1 X54.815 Y-179.287 E89.65557\nG1 X61.017 Y-177.272 E90.16395\nG1 X64.123 Y-176.172 E90.42089\nG1 X67.207 Y-175.019 E90.67759\nG1 X73.234 Y-172.584 E91.18438\nG1 X79.252 Y-169.905 E91.69800\nG1 X85.094 Y-167.055 E92.20479\nG1 X88.035 Y-165.524 E92.46332\nG1 X93.721 Y-162.373 E92.97011\nG1 X96.560 Y-160.700 E93.22705\nG1 X102.090 Y-157.245 E93.73543\nG1 X104.838 Y-155.427 E93.99237\nG1 X110.180 Y-151.687 E94.50074\nG1 X112.829 Y-149.727 E94.75768\nG1 X115.441 Y-147.722 E95.01438\nG1 X120.493 Y-143.631 E95.52117\nG1 X122.911 Y-141.529 E95.77098\n\n; end preskirt\n; start_gcode | end +end_gcode = ; end_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; use relative positioning\n\nG91\n\n; retract the filament a bit before lifting the nozzle to release some of the pressure\n\nG1 E-1 F300\n\n; home\n\nG28\n\n; use absolute positioning\n\nG90\n\n; cooldown\n\nM104 S0\nM140 S0\n\n; end_gcode | end\n +before_layer_gcode = +layer_gcode = +toolchange_gcode = +between_objects_gcode = +retract_length = 4 +retract_lift = 0.3 +retract_lift_above = 0 +retract_lift_below = 449 +retract_speed = 30 +deretract_speed = 0 +retract_restart_extra = 0 +retract_before_travel = 2 +retract_layer_change = 1 +wipe = 1 +retract_before_wipe = 70% +retract_length_toolchange = 10 +retract_restart_extra_toolchange = 0 +extruder_colour = #1193FF +machine_max_acceleration_e = 3000 +machine_max_acceleration_extruding = 1000 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 1500 +machine_max_acceleration_y = 1500 +machine_max_acceleration_z = 1500 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 200 +machine_max_jerk_e = 5 +machine_max_jerk_x = 5 +machine_max_jerk_y = 5 +machine_max_jerk_z = 5 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +printer_settings_id = +printer_notes = Do not remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PREDATOR\nPRINTER_HAS_BOWDEN\n +default_filament_profile = Generic PLA @PREDATOR + +[printer:Anycubic Predator 0.4 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.4 +nozzle_diameter = 0.4 +min_layer_height = 0.08 +max_layer_height = 0.32 +default_print_profile = 0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR + +[printer:Anycubic Predator 0.6 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.6 +nozzle_diameter = 0.6 +min_layer_height = 0.12 +max_layer_height = 0.4 +default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR + +[printer:Anycubic Predator 0.8 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.8 +nozzle_diameter = 0.8 +min_layer_height = 0.16 +max_layer_height = 0.48 +default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR + +## Anycubic 4MAX Pro 2.0 +## based on https://hartrusion.com/en/prusaslicer-config-for-anycubic-4max-pro-2-0/ + +[print:*common_4max*] +avoid_crossing_perimeters = 0 +avoid_crossing_perimeters_max_detour = 0 +bottom_fill_pattern = monotonic +bottom_solid_layers = 4 +bridge_acceleration = 300 +bridge_angle = 0 +bridge_flow_ratio = 0.65 +bridge_speed = 30 +brim_separation = 0 +brim_type = outer_only +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers_condition = printer_model=="4MAXPRO20" and nozzle_diameter[0]==0.4 +complete_objects = 0 +default_acceleration = 900 +dont_support_bridges = 1 +draft_shield = disabled +elefant_foot_compensation = 0.2 +ensure_vertical_shell_thickness = 1 +external_perimeter_extrusion_width = 0 +external_perimeter_speed = 35 +external_perimeters_first = 0 +extra_perimeters = 0 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.45 +fill_angle = 45 +fill_density = 20% +fill_pattern = gyroid +first_layer_acceleration = 300 +first_layer_acceleration_over_raft = 0 +first_layer_extrusion_width = 0.65 +first_layer_height = 0.3 +first_layer_speed = 20 +first_layer_speed_over_raft = 30 +fuzzy_skin = none +fuzzy_skin_point_dist = 0.8 +fuzzy_skin_thickness = 0.3 +gap_fill_enabled = 1 +gap_fill_speed = 40 +gcode_comments = 0 +gcode_label_objects = 0 +gcode_resolution = 0.0125 +infill_acceleration = 600 +infill_anchor = 400% +infill_anchor_max = 50 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 23% +infill_speed = 45 +inherits = +interface_shells = 0 +ironing = 0 +ironing_flowrate = 15% +ironing_spacing = 0.1 +ironing_speed = 15 +ironing_type = top +layer_height = 0.2 +max_print_speed = 50 +max_volumetric_speed = 0 +min_skirt_length = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{print_time}.gcode +overhangs = 1 +perimeter_acceleration = 500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0 +perimeter_speed = 45 +perimeters = 3 +post_process = +print_settings_id = +raft_contact_distance = 0.1 +raft_expansion = 1.5 +raft_first_layer_density = 90% +raft_first_layer_expansion = 3 +raft_layers = 0 +resolution = 0 +seam_position = aligned +single_extruder_multi_material_priming = 1 +skirt_distance = 5 +skirt_height = 1 +skirts = 2 +slicing_mode = regular +small_perimeter_speed = 20 +solid_infill_below_area = 0 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0 +solid_infill_speed = 45 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 0 +support_material_auto = 1 +support_material_bottom_contact_distance = 0 +support_material_bottom_interface_layers = -1 +support_material_buildplate_only = 1 +support_material_closing_radius = 2 +support_material_contact_distance = 0.2 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0.4 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 1 +support_material_interface_layers = 2 +support_material_interface_pattern = rectilinear +support_material_interface_spacing = 0.2 +support_material_interface_speed = 30 +support_material_pattern = rectilinear-grid +support_material_spacing = 2.5 +support_material_speed = 45 +support_material_style = grid +support_material_synchronize_layers = 0 +support_material_threshold = 45 +support_material_with_sheath = 1 +support_material_xy_spacing = 60% +thick_bridges = 1 +thin_walls = 0 +top_fill_pattern = monotonic +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +top_solid_layers = 5 +travel_speed = 60 +travel_speed_z = 0 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_brim_width = 2 +wipe_tower_no_sparse_layers = 0 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[print:0.15mm Detail @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 7 +perimeter_speed = 40 +external_perimeter_speed = 25 + +[print:0.20mm Quality @4Max Pro 2.0] +inherits = *common_4max* +external_perimeter_speed = 25 + +[print:0.30mm Draft @4Max Pro 2.0] +inherits = *common_4max* +layer_height = 0.3 +bottom_solid_layers = 3 +top_solid_layers = 3 + +[filament:*common_4max*] +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 30 +filament_density = 1.24 +filament_diameter = 1.75 +filament_max_volumetric_speed = 0 +filament_type = PLA +first_layer_bed_temperature = 60 +first_layer_temperature = 210 +full_fan_speed_layer = 5 +max_fan_speed = 100 +min_fan_speed = 80 +min_print_speed = 10 +slowdown_below_layer_time = 15 +temperature = 205 + +[filament:*PLA_4max*] +inherits = *common_4max* + +[filament:Generic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +filament_vendor = Generic + +[filament:Anycubic PLA @4Max Pro 2.0] +inherits = *PLA_4max* +first_layer_temperature = 215 +temperature = 207 +filament_vendor = Anycubic + +[filament:Generic ABS @4Max Pro 2.0] +filament_vendor = Generic +compatible_printers_condition = printer_model=="4MAXPRO20" +bed_temperature = 100 +first_layer_bed_temperature = 100 +temperature = 245 +first_layer_temperature = 245 +bridge_fan_speed = 15 +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #800000 +filament_density = 1.04 +filament_diameter = 1.75 +filament_type = ABS +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 25 + +[filament:Generic TPU @4Max Pro 2.0] +filament_vendor = Generic +bed_temperature = 60 +bridge_fan_speed = 0 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 3 +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #211AB5 +filament_density = 1.19 +filament_deretract_speed = 20 +filament_diameter = 1.75 +filament_retract_speed = 30 +filament_type = FLEX +filament_max_volumetric_speed = 1.65 +first_layer_bed_temperature = 60 +first_layer_temperature = 215 +full_fan_speed_layer = 0 +max_fan_speed = 0 +min_fan_speed = 0 +min_print_speed = 10 +slowdown_below_layer_time = 20 +temperature = 215 + +[filament:Polymaker PolyFlex TPU95 @4Max Pro 2.0] +filament_vendor = Polymaker +bed_temperature = 45 +bridge_fan_speed = 80 +compatible_printers_condition = printer_model=="4MAXPRO20" +cooling = 1 +disable_fan_first_layers = 5 +extrusion_multiplier = 1.04 +fan_always_on = 1 +fan_below_layer_time = 45 +filament_colour = #FD7D2F +filament_density = 1.22 +filament_deretract_speed = 25 +filament_diameter = 1.75 +filament_max_volumetric_speed = 1.65 +filament_retract_length = 4 +filament_retract_restart_extra = 0.1 +filament_retract_speed = 60 +filament_type = FLEX +first_layer_bed_temperature = 55 +first_layer_temperature = 215 +full_fan_speed_layer = 8 +max_fan_speed = 50 +min_fan_speed = 25 +min_print_speed = 10 +slowdown_below_layer_time = 10 +temperature = 217 + +[printer:Anycubic 4Max Pro 2.0] +printer_model = 4MAXPRO20 +printer_variant = 0.4 +printer_technology = FFF +bed_shape = 0x0,270x0,270x210,0x210 +color_change_gcode = M600 +default_filament_profile = Generic PLA @4Max Pro 2.0 +default_print_profile = 0.20mm Quality @4Max Pro 2.0 +deretract_speed = 25 +end_gcode = M104 S0 ; turn off extruder heating\nM140 S0 ; turn off bed heating\nM107 ; turn off fans\nG91 ; relative positioning\nG0 Z+0.5 ; move Z up a tiny bit\nG90 ; absolute positioning\nG0 X135 Y105 F{machine_max_feedrate_x[0]*60} ; move extruder to center position\nG0 Z190.5 F{machine_max_feedrate_z[0]*60} ; lower the plattform to Z min\nM84 ; steppers off\nG90 ; absolute positioning\n +extruder_offset = 0x0 +gcode_flavor = marlin +machine_limits_usage = time_estimate_only +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 1250 +machine_max_acceleration_retracting = 1250 +machine_max_acceleration_travel = 1500 +machine_max_acceleration_x = 900 +machine_max_acceleration_y = 900 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 16 +machine_max_jerk_e = 5 +machine_max_jerk_x = 6 +machine_max_jerk_y = 6 +machine_max_jerk_z = 0.2 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +max_layer_height = 0.3 +max_print_height = 190 +min_layer_height = 0.07 +nozzle_diameter = 0.4 +pause_print_gcode = M601 +remaining_times = 0 +retract_before_travel = 2 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 2.5 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +retract_lift_below = 0 +retract_restart_extra = 0 +retract_restart_extra_toolchange = 0 +retract_speed = 35 +silent_mode = 0 +single_extruder_multi_material = 0 +start_gcode = G21 ; metric values\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 X0 Y0 ; home X and Y\nG28 Z0 ; home Z\nG1 Z30 F{machine_max_feedrate_z[0]*60} ; move Z a bit down to not blow on the bed edge while heating\nG1 X10 F3900 ; let some space on x to prevent the filament cooling exhaust from beeing blocked by the servo motor\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM104 S[first_layer_temperature] ; set extruder temp\nM106 S80 ; turn on fan to prevent air nozzle melt while heating up\nM109 S[first_layer_temperature] ; wait for extruder temp\nM107 ; start with the fan off\nG28 X0 ; goto X home again\nG92 E0 ; zero the extruded length\nG1 Z0.2 F360 ; move plattform upwards\n; extrude material next to the plattform (comment or remove following lines to disable)\nG1 F180 E20 ; extrude some material next to the plattform\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG92 E0 ; zero the extruded length again\nG1 X5 F3900 ; move sideways to get rid of that string\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\nG92 E0 ; zero the extruded length again\n; draw intro line (comment or remove following lines to disable)\nG1 X30 E5 F700 ; draw intro line\nG92 E0 ; zero the extruded length\nG1 E-[retract_length] F{retract_speed[0]*60} ; do a filament retract\nG1 X40 Z2.0 ; move away from the introline\nG92 E0 ; zero the extruded length again\nG1 E[retract_length] F{retract_speed[0]*60} ; do a filament deretract with retract parameters\n; end of intro line code\nM117 Printing...\nG5 +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 0 +z_offset = 0 + +########## SLA printer presets ########## + +[sla_print:*common print ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +layer_height = 0.05 +output_filename_format = [input_filename_base].pwmx +pad_edge_radius = 0.5 +pad_enable = 0 +pad_max_merge_distance = 50 +pad_wall_height = 0 +pad_wall_thickness = 1 +pad_wall_slope = 45 +faded_layers = 8 +slice_closing_radius = 0.005 +support_base_diameter = 3 +support_base_height = 1 +support_critical_angle = 45 +support_density_at_45 = 250 +support_density_at_horizontal = 500 +support_head_front_diameter = 0.4 +support_head_penetration = 0.4 +support_head_width = 3 +support_max_bridge_length = 10 +support_minimal_z = 0 +support_object_elevation = 5 +support_pillar_diameter = 1 +support_pillar_connection_mode = zigzag +support_pillar_widening_factor = 0 +supports_enable = 1 +support_small_pillar_diameter_percent = 60% + +[sla_print:0.05 Normal @ANYCUBIC] +inherits = *common print ANYCUBIC SLA* +layer_height = 0.05 + +########### Materials + +[sla_material:*common ANYCUBIC SLA*] +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ +compatible_prints_condition = layer_height == 0.05 +exposure_time = 7 +initial_exposure_time = 40 +initial_layer_height = 0.05 +material_correction = 1,1,1 +material_notes = LIFT_DISTANCE=8.0\nLIFT_SPEED=2.5\nRETRACT_SPEED=3.0\nBOTTOM_LIFT_SPEED=2.0\nBOTTOM_LIFT_DISTANCE=9.0\nDELAY_BEFORE_EXPOSURE=0.5 + +[sla_material:*common 0.05 ANYCUBIC SLA*] +inherits = *common ANYCUBIC SLA* + +[sla_material:Generic Blue Resin @MONO 0.05] +inherits = *common 0.05 ANYCUBIC SLA* +exposure_time = 2.5 +initial_exposure_time = 40 +material_type = Tough +material_vendor = Generic +material_colour = #6080EC +compatible_printers_condition = printer_notes=~/.*PHOTONMONOX.*/ + +########## Printers + +[printer:Anycubic Photon Mono X] +printer_technology = SLA +printer_model = PHOTON MONO X +printer_variant = default +default_sla_material_profile = Generic Blue Resin @MONO 0.05 +default_sla_print_profile = 0.05 Normal @ANYCUBIC +thumbnails = 224x168 +sla_archive_format = pwmx +bed_shape = 1.48x1.02,193.48x1.02,193.48x121.02,1.48x121.02 +display_height = 120 +display_orientation = landscape +display_mirror_x = 1 +display_mirror_y = 0 +display_pixels_x = 3840 +display_pixels_y = 2400 +display_width = 192 +max_print_height = 245 +elefant_foot_compensation = 0.2 +elefant_foot_min_width = 0.2 +min_exposure_time = 1 +max_exposure_time = 120 +min_initial_exposure_time = 1 +max_initial_exposure_time = 300 +printer_correction = 1,1,1 +gamma_correction = 1 +area_fill = 45 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.'\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PHOTONMONOX\n From 0bd3112b7a7840b7c75178ca8deb6b2b5a16d51a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 18 Mar 2022 15:45:42 +0100 Subject: [PATCH 133/149] Reworked custom gcode toolpaths generation --- src/libslic3r/GCode/GCodeProcessor.cpp | 6 +++--- src/libslic3r/GCode/GCodeProcessor.hpp | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 43a5f1eb0a..3569f6322d 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1206,7 +1206,6 @@ void GCodeProcessor::reset() m_extruded_last_z = 0.0f; m_first_layer_height = 0.0f; - m_processing_start_custom_gcode = false; m_g1_line_id = 0; m_layer_id = 0; m_cp_color.reset(); @@ -1810,7 +1809,6 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers set_extrusion_role(ExtrusionEntity::string_to_role(comment.substr(reserved_tag(ETags::Role).length()))); if (m_extrusion_role == erExternalPerimeter) m_seams_detector.activate(true); - m_processing_start_custom_gcode = (m_extrusion_role == erCustom && m_g1_line_id == 0); return; } @@ -2516,6 +2514,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) if (m_forced_height > 0.0f) m_height = m_forced_height; + else if (m_layer_id == 0) + m_height = (m_end_position[Z] <= double(m_first_layer_height)) ? m_end_position[Z] : m_first_layer_height; else { if (m_end_position[Z] > m_extruded_last_z + EPSILON) m_height = m_end_position[Z] - m_extruded_last_z; @@ -3269,7 +3269,7 @@ void GCodeProcessor::store_move_vertex(EMoveType type) m_extrusion_role, m_extruder_id, m_cp_color.current, - Vec3f(m_end_position[X], m_end_position[Y], m_processing_start_custom_gcode ? m_first_layer_height : m_end_position[Z] - m_z_offset) + m_extruder_offsets[m_extruder_id], + Vec3f(m_end_position[X], m_end_position[Y], m_end_position[Z] - m_z_offset) + m_extruder_offsets[m_extruder_id], static_cast(m_end_position[E] - m_start_position[E]), m_feedrate, m_width, diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 5ca8f0b026..9faa795784 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -547,7 +547,6 @@ namespace Slic3r { ExtruderTemps m_extruder_temps; float m_extruded_last_z; float m_first_layer_height; // mm - bool m_processing_start_custom_gcode; unsigned int m_g1_line_id; unsigned int m_layer_id; CpColor m_cp_color; From 93d703518d588720ff1333e7cd5919fab1a7df50 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 21 Mar 2022 08:53:55 +0100 Subject: [PATCH 134/149] Tech ENABLE_PROCESS_G2_G3_LINES - Improved detection of layer zs for gcode produced by other slicers --- src/libslic3r/GCode/GCodeProcessor.cpp | 21 +++++++++++++++++---- src/libslic3r/GCode/GCodeProcessor.hpp | 7 +++++++ src/slic3r/GUI/GCodeViewer.cpp | 20 +++++++++++++------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 340515d5ff..0851f38ac2 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -37,7 +37,7 @@ static const float DEFAULT_FILAMENT_DENSITY = 1.245f; static const Slic3r::Vec3f DEFAULT_EXTRUDER_OFFSET = Slic3r::Vec3f::Zero(); #if ENABLE_PROCESS_G2_G3_LINES -static const std::string INTERNAL_G2G3_TAG = "!#!#! from G2/G3 expansion !#!#!"; +static const std::string INTERNAL_G2G3_TAG = "!#!#! internal only - from G2/G3 expansion !#!#!"; #endif // ENABLE_PROCESS_G2_G3_LINES namespace Slic3r { @@ -2782,7 +2782,11 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) m_result.spiral_vase_layers.back().second.second = m_result.moves.size() - 1; // store move +#if ENABLE_PROCESS_G2_G3_LINES + store_move_vertex(type, line.comment() == INTERNAL_G2G3_TAG); +#else store_move_vertex(type); +#endif // ENABLE_PROCESS_G2_G3_LINES } #if ENABLE_PROCESS_G2_G3_LINES @@ -2897,7 +2901,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc return ret; }; - auto fake_g1_line = [](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { + auto internal_only_g1_line = [](const AxisCoords& target, bool has_z, const std::optional& feedrate, const std::optional& extrusion) { std::string ret = (boost::format("G1 X%1% Y%2%") % target[X] % target[Y]).str(); if (has_z) ret += (boost::format(" Z%1%") % target[Z]).str(); @@ -2969,7 +2973,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc arc_target[Z] += z_per_segment; arc_target[E] += extruder_per_segment; - gcode += fake_g1_line(adjust_target(arc_target, prev_target), z_per_segment != 0.0, feedrate, extrusion); + gcode += internal_only_g1_line(adjust_target(arc_target, prev_target), z_per_segment != 0.0, feedrate, extrusion); prev_target = arc_target; // feedrate is constant, we do not need to repeat it @@ -2977,7 +2981,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc } // Ensure last segment arrives at target location. - gcode += fake_g1_line(adjust_target(end_position, prev_target), arc.delta_z() != 0.0, feedrate, extrusion); + gcode += internal_only_g1_line(adjust_target(end_position, prev_target), arc.delta_z() != 0.0, feedrate, extrusion); // process fake gcode lines GCodeReader parser; @@ -3489,7 +3493,11 @@ void GCodeProcessor::process_T(const std::string_view command) } } +#if ENABLE_PROCESS_G2_G3_LINES +void GCodeProcessor::store_move_vertex(EMoveType type, bool internal_only) +#else void GCodeProcessor::store_move_vertex(EMoveType type) +#endif // ENABLE_PROCESS_G2_G3_LINES { m_last_line_id = (type == EMoveType::Color_change || type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) ? m_line_id + 1 : @@ -3509,7 +3517,12 @@ void GCodeProcessor::store_move_vertex(EMoveType type) m_mm3_per_mm, m_fan_speed, m_extruder_temps[m_extruder_id], +#if ENABLE_PROCESS_G2_G3_LINES + static_cast(m_result.moves.size()), + internal_only +#else static_cast(m_result.moves.size()) +#endif // ENABLE_PROCESS_G2_G3_LINES }); // stores stop time placeholders for later use diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 3a26348014..4b406b5556 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -113,6 +113,9 @@ namespace Slic3r { float fan_speed{ 0.0f }; // percentage float temperature{ 0.0f }; // Celsius degrees float time{ 0.0f }; // s +#if ENABLE_PROCESS_G2_G3_LINES + bool internal_only{ false }; +#endif // ENABLE_PROCESS_G2_G3_LINES float volumetric_rate() const { return feedrate * mm3_per_mm; } }; @@ -751,7 +754,11 @@ namespace Slic3r { void process_T(const GCodeReader::GCodeLine& line); void process_T(const std::string_view command); +#if ENABLE_PROCESS_G2_G3_LINES + void store_move_vertex(EMoveType type, bool internal_only = false); +#else void store_move_vertex(EMoveType type); +#endif // ENABLE_PROCESS_G2_G3_LINES void set_extrusion_role(ExtrusionRole role); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5372d4565b..a1be81ced2 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -2284,13 +2284,19 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) size_t move_id = i - seams_count; if (move.type == EMoveType::Extrude) { - // layers zs - const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); - const double z = static_cast(move.position.z()); - if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) - m_layers.append(z, { last_travel_s_id, move_id }); - else - m_layers.get_ranges().back().last = move_id; +#if ENABLE_PROCESS_G2_G3_LINES + if (move.extrusion_role != erNone && !move.internal_only) { +#endif // ENABLE_PROCESS_G2_G3_LINES + // layers zs + const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); + const double z = static_cast(move.position.z()); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + m_layers.append(z, { last_travel_s_id, move_id }); + else + m_layers.get_ranges().back().last = move_id; +#if ENABLE_PROCESS_G2_G3_LINES + } +#endif // ENABLE_PROCESS_G2_G3_LINES // extruder ids m_extruder_ids.emplace_back(move.extruder_id); // roles From 4964d6ecd56133237fc9999b677a71ae5fff2817 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 21 Mar 2022 11:31:32 +0100 Subject: [PATCH 135/149] ENABLE_GL_IMGUI_SHADERS - Fixes in ImGuiWrapper::render_draw_data() --- src/slic3r/GUI/ImGuiWrapper.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 613b168415..e659a386bd 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1528,19 +1528,15 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glLoadIdentity()); #endif // ENABLE_GL_IMGUI_SHADERS -#if ENABLE_GL_IMGUI_SHADERS // Will project scissor/clipping rectangles into framebuffer space - const ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + const ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports const ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) -#else - const ImVec2 pos = draw_data->DisplayPos; -#endif // ENABLE_GL_IMGUI_SHADERS // Render command lists for (int n = 0; n < draw_data->CmdListsCount; ++n) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; - const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; #if ENABLE_GL_IMGUI_SHADERS const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); @@ -1596,18 +1592,20 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); #else - const ImVec4 clip_rect = ImVec4(pcmd->ClipRect.x - pos.x, pcmd->ClipRect.y - pos.y, pcmd->ClipRect.z - pos.x, pcmd->ClipRect.w - pos.y); - if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f) { - // Apply scissor/clipping rectangle - glsafe(::glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y))); + // Project scissor/clipping rectangles into framebuffer space + const ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + const ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; - // Bind texture, Draw - glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); - glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); - } + // Apply scissor/clipping rectangle (Y is inverted in OpenGL) + glsafe(::glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y))); + + // Bind texture, Draw + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset)); #endif // ENABLE_GL_IMGUI_SHADERS } - idx_buffer += pcmd->ElemCount; } #if ENABLE_GL_IMGUI_SHADERS From 76d1d4949bbd0964717f8112aae992a1267c5eb4 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 21 Mar 2022 13:10:47 +0100 Subject: [PATCH 136/149] Tech ENABLE_GL_SHADERS_ATTRIBUTES - Added shaders for glsl version 140 --- resources/shaders/110/background.fs | 11 +++ .../{background_attr.vs => 110/background.vs} | 0 resources/shaders/110/flat.fs | 8 ++ .../shaders/{flat_attr.vs => 110/flat.vs} | 4 +- resources/shaders/110/flat_texture.fs | 10 +++ .../flat_texture.vs} | 6 +- resources/shaders/110/gouraud.fs | 86 +++++++++++++++++++ .../{gouraud_attr.vs => 110/gouraud.vs} | 6 +- resources/shaders/110/gouraud_light.fs | 12 +++ .../gouraud_light.vs} | 6 +- .../shaders/110/gouraud_light_instanced.fs | 12 +++ .../gouraud_light_instanced.vs} | 8 +- resources/shaders/{ => 110}/imgui.fs | 0 resources/shaders/{ => 110}/imgui.vs | 0 .../{mm_contour_attr.fs => 110/mm_contour.fs} | 0 .../{mm_contour_attr.vs => 110/mm_contour.vs} | 4 +- .../{mm_gouraud_attr.fs => 110/mm_gouraud.fs} | 0 .../{mm_gouraud_attr.vs => 110/mm_gouraud.vs} | 4 +- resources/shaders/110/printbed.fs | 34 ++++++++ .../{printbed_attr.vs => 110/printbed.vs} | 6 +- resources/shaders/110/toolpaths_cog.fs | 19 ++++ .../toolpaths_cog.vs} | 6 +- .../shaders/110/variable_layer_height.fs | 41 +++++++++ .../variable_layer_height.vs} | 8 +- resources/shaders/140/background.fs | 11 +++ resources/shaders/140/background.vs | 12 +++ resources/shaders/140/flat.fs | 8 ++ resources/shaders/140/flat.vs | 11 +++ resources/shaders/140/flat_texture.fs | 10 +++ resources/shaders/140/flat_texture.vs | 15 ++++ resources/shaders/140/gouraud.fs | 86 +++++++++++++++++++ resources/shaders/140/gouraud.vs | 77 +++++++++++++++++ resources/shaders/140/gouraud_light.fs | 12 +++ resources/shaders/140/gouraud_light.vs | 45 ++++++++++ .../shaders/140/gouraud_light_instanced.fs | 12 +++ .../shaders/140/gouraud_light_instanced.vs | 50 +++++++++++ resources/shaders/140/imgui.fs | 11 +++ resources/shaders/140/imgui.vs | 17 ++++ resources/shaders/140/mm_contour.fs | 13 +++ resources/shaders/140/mm_contour.vs | 11 +++ resources/shaders/140/mm_gouraud.fs | 63 ++++++++++++++ resources/shaders/140/mm_gouraud.vs | 28 ++++++ resources/shaders/140/printbed.fs | 34 ++++++++ resources/shaders/140/printbed.vs | 15 ++++ resources/shaders/140/toolpaths_cog.fs | 19 ++++ resources/shaders/140/toolpaths_cog.vs | 47 ++++++++++ .../shaders/140/variable_layer_height.fs | 41 +++++++++ .../shaders/140/variable_layer_height.vs | 60 +++++++++++++ src/slic3r/GUI/3DBed.cpp | 16 ---- src/slic3r/GUI/3DScene.cpp | 6 -- src/slic3r/GUI/GCodeViewer.cpp | 34 +------- src/slic3r/GUI/GLCanvas3D.cpp | 49 +---------- src/slic3r/GUI/GLModel.cpp | 4 - src/slic3r/GUI/GLSelectionRectangle.cpp | 4 - src/slic3r/GUI/GLShadersManager.cpp | 27 +++--- src/slic3r/GUI/GLTexture.cpp | 4 - src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 8 -- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 12 --- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 8 -- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 - .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 9 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 16 ---- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 26 +----- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 8 -- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 36 -------- src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp | 13 +-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 - src/slic3r/GUI/MeshUtils.cpp | 4 - src/slic3r/GUI/Selection.cpp | 12 --- 69 files changed, 994 insertions(+), 309 deletions(-) create mode 100644 resources/shaders/110/background.fs rename resources/shaders/{background_attr.vs => 110/background.vs} (100%) create mode 100644 resources/shaders/110/flat.fs rename resources/shaders/{flat_attr.vs => 110/flat.vs} (100%) create mode 100644 resources/shaders/110/flat_texture.fs rename resources/shaders/{flat_texture_attr.vs => 110/flat_texture.vs} (100%) create mode 100644 resources/shaders/110/gouraud.fs rename resources/shaders/{gouraud_attr.vs => 110/gouraud.vs} (100%) create mode 100644 resources/shaders/110/gouraud_light.fs rename resources/shaders/{gouraud_light_attr.vs => 110/gouraud_light.vs} (100%) create mode 100644 resources/shaders/110/gouraud_light_instanced.fs rename resources/shaders/{gouraud_light_instanced_attr.vs => 110/gouraud_light_instanced.vs} (100%) rename resources/shaders/{ => 110}/imgui.fs (100%) rename resources/shaders/{ => 110}/imgui.vs (100%) rename resources/shaders/{mm_contour_attr.fs => 110/mm_contour.fs} (100%) rename resources/shaders/{mm_contour_attr.vs => 110/mm_contour.vs} (100%) rename resources/shaders/{mm_gouraud_attr.fs => 110/mm_gouraud.fs} (100%) rename resources/shaders/{mm_gouraud_attr.vs => 110/mm_gouraud.vs} (100%) create mode 100644 resources/shaders/110/printbed.fs rename resources/shaders/{printbed_attr.vs => 110/printbed.vs} (100%) create mode 100644 resources/shaders/110/toolpaths_cog.fs rename resources/shaders/{toolpaths_cog_attr.vs => 110/toolpaths_cog.vs} (100%) create mode 100644 resources/shaders/110/variable_layer_height.fs rename resources/shaders/{variable_layer_height_attr.vs => 110/variable_layer_height.vs} (100%) create mode 100644 resources/shaders/140/background.fs create mode 100644 resources/shaders/140/background.vs create mode 100644 resources/shaders/140/flat.fs create mode 100644 resources/shaders/140/flat.vs create mode 100644 resources/shaders/140/flat_texture.fs create mode 100644 resources/shaders/140/flat_texture.vs create mode 100644 resources/shaders/140/gouraud.fs create mode 100644 resources/shaders/140/gouraud.vs create mode 100644 resources/shaders/140/gouraud_light.fs create mode 100644 resources/shaders/140/gouraud_light.vs create mode 100644 resources/shaders/140/gouraud_light_instanced.fs create mode 100644 resources/shaders/140/gouraud_light_instanced.vs create mode 100644 resources/shaders/140/imgui.fs create mode 100644 resources/shaders/140/imgui.vs create mode 100644 resources/shaders/140/mm_contour.fs create mode 100644 resources/shaders/140/mm_contour.vs create mode 100644 resources/shaders/140/mm_gouraud.fs create mode 100644 resources/shaders/140/mm_gouraud.vs create mode 100644 resources/shaders/140/printbed.fs create mode 100644 resources/shaders/140/printbed.vs create mode 100644 resources/shaders/140/toolpaths_cog.fs create mode 100644 resources/shaders/140/toolpaths_cog.vs create mode 100644 resources/shaders/140/variable_layer_height.fs create mode 100644 resources/shaders/140/variable_layer_height.vs diff --git a/resources/shaders/110/background.fs b/resources/shaders/110/background.fs new file mode 100644 index 0000000000..b148440898 --- /dev/null +++ b/resources/shaders/110/background.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform vec4 top_color; +uniform vec4 bottom_color; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = mix(bottom_color, top_color, tex_coord.y); +} diff --git a/resources/shaders/background_attr.vs b/resources/shaders/110/background.vs similarity index 100% rename from resources/shaders/background_attr.vs rename to resources/shaders/110/background.vs diff --git a/resources/shaders/110/flat.fs b/resources/shaders/110/flat.fs new file mode 100644 index 0000000000..ab656998df --- /dev/null +++ b/resources/shaders/110/flat.fs @@ -0,0 +1,8 @@ +#version 110 + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/flat_attr.vs b/resources/shaders/110/flat.vs similarity index 100% rename from resources/shaders/flat_attr.vs rename to resources/shaders/110/flat.vs index 370eedb72d..d9063f0c70 100644 --- a/resources/shaders/flat_attr.vs +++ b/resources/shaders/110/flat.vs @@ -1,10 +1,10 @@ #version 110 -attribute vec3 v_position; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; +attribute vec3 v_position; + void main() { gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); diff --git a/resources/shaders/110/flat_texture.fs b/resources/shaders/110/flat_texture.fs new file mode 100644 index 0000000000..ffe193b1c0 --- /dev/null +++ b/resources/shaders/110/flat_texture.fs @@ -0,0 +1,10 @@ +#version 110 + +uniform sampler2D uniform_texture; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = texture2D(uniform_texture, tex_coord); +} diff --git a/resources/shaders/flat_texture_attr.vs b/resources/shaders/110/flat_texture.vs similarity index 100% rename from resources/shaders/flat_texture_attr.vs rename to resources/shaders/110/flat_texture.vs index e59a99da35..dc4868b04d 100644 --- a/resources/shaders/flat_texture_attr.vs +++ b/resources/shaders/110/flat_texture.vs @@ -1,11 +1,11 @@ #version 110 -attribute vec3 v_position; -attribute vec2 v_tex_coord; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; +attribute vec3 v_position; +attribute vec2 v_tex_coord; + varying vec2 tex_coord; void main() diff --git a/resources/shaders/110/gouraud.fs b/resources/shaders/110/gouraud.fs new file mode 100644 index 0000000000..0742f6cc88 --- /dev/null +++ b/resources/shaders/110/gouraud.fs @@ -0,0 +1,86 @@ +#version 110 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct PrintVolumeDetection +{ + // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid + int type; + // type = 0 (rectangle): + // x = min.x, y = min.y, z = max.x, w = max.y + // type = 1 (circle): + // x = center.x, y = center.y, z = radius + vec4 xy_data; + // x = min z, y = max z + vec2 z_data; +}; + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform SlopeDetection slope; + +uniform bool offset_depth_buffer; + +#ifdef ENABLE_ENVIRONMENT_MAP + uniform sampler2D environment_tex; + uniform bool use_environment_tex; +#endif // ENABLE_ENVIRONMENT_MAP + +uniform PrintVolumeDetection print_volume; + +varying vec3 clipping_planes_dots; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color = vec3(0.7, 0.7, 1.0); + alpha = 1.0; + } + + // if the fragment is outside the print volume -> use darker color + vec3 pv_check_min = ZERO; + vec3 pv_check_max = ZERO; + if (print_volume.type == 0) { + // rectangle + pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); + pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); + } + else if (print_volume.type == 1) { + // circle + float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); + pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); + pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); + } + color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; + +#ifdef ENABLE_ENVIRONMENT_MAP + if (use_environment_tex) + gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + else +#endif + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + + // In the support painting gizmo and the seam painting gizmo are painted triangles rendered over the already + // rendered object. To resolved z-fighting between previously rendered object and painted triangles, values + // inside the depth buffer are offset by small epsilon for painted triangles inside those gizmos. + gl_FragDepth = gl_FragCoord.z - (offset_depth_buffer ? EPSILON : 0.0); +} diff --git a/resources/shaders/gouraud_attr.vs b/resources/shaders/110/gouraud.vs similarity index 100% rename from resources/shaders/gouraud_attr.vs rename to resources/shaders/110/gouraud.vs index 87e524c14a..70f71f886b 100644 --- a/resources/shaders/gouraud_attr.vs +++ b/resources/shaders/110/gouraud.vs @@ -25,9 +25,6 @@ struct SlopeDetection mat3 volume_world_normal_matrix; }; -attribute vec3 v_position; -attribute vec3 v_normal; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; uniform mat3 normal_matrix; @@ -39,6 +36,9 @@ uniform vec2 z_range; // Clipping plane - general orientation. Used by the SLA gizmo. uniform vec4 clipping_plane; +attribute vec3 v_position; +attribute vec3 v_normal; + // x = diffuse, y = specular; varying vec2 intensity; diff --git a/resources/shaders/110/gouraud_light.fs b/resources/shaders/110/gouraud_light.fs new file mode 100644 index 0000000000..970185a00e --- /dev/null +++ b/resources/shaders/110/gouraud_light.fs @@ -0,0 +1,12 @@ +#version 110 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/gouraud_light_attr.vs b/resources/shaders/110/gouraud_light.vs similarity index 100% rename from resources/shaders/gouraud_light_attr.vs rename to resources/shaders/110/gouraud_light.vs index 2e1b5fb429..a03653b8a3 100644 --- a/resources/shaders/gouraud_light_attr.vs +++ b/resources/shaders/110/gouraud_light.vs @@ -14,13 +14,13 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 -attribute vec3 v_position; -attribute vec3 v_normal; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; uniform mat3 normal_matrix; +attribute vec3 v_position; +attribute vec3 v_normal; + // x = tainted, y = specular; varying vec2 intensity; diff --git a/resources/shaders/110/gouraud_light_instanced.fs b/resources/shaders/110/gouraud_light_instanced.fs new file mode 100644 index 0000000000..970185a00e --- /dev/null +++ b/resources/shaders/110/gouraud_light_instanced.fs @@ -0,0 +1,12 @@ +#version 110 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/gouraud_light_instanced_attr.vs b/resources/shaders/110/gouraud_light_instanced.vs similarity index 100% rename from resources/shaders/gouraud_light_instanced_attr.vs rename to resources/shaders/110/gouraud_light_instanced.vs index 7069feb65e..87748ce6f0 100644 --- a/resources/shaders/gouraud_light_instanced_attr.vs +++ b/resources/shaders/110/gouraud_light_instanced.vs @@ -14,6 +14,10 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + // vertex attributes attribute vec3 v_position; attribute vec3 v_normal; @@ -21,10 +25,6 @@ attribute vec3 v_normal; attribute vec3 i_offset; attribute vec2 i_scales; -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - // x = tainted, y = specular; varying vec2 intensity; diff --git a/resources/shaders/imgui.fs b/resources/shaders/110/imgui.fs similarity index 100% rename from resources/shaders/imgui.fs rename to resources/shaders/110/imgui.fs diff --git a/resources/shaders/imgui.vs b/resources/shaders/110/imgui.vs similarity index 100% rename from resources/shaders/imgui.vs rename to resources/shaders/110/imgui.vs diff --git a/resources/shaders/mm_contour_attr.fs b/resources/shaders/110/mm_contour.fs similarity index 100% rename from resources/shaders/mm_contour_attr.fs rename to resources/shaders/110/mm_contour.fs diff --git a/resources/shaders/mm_contour_attr.vs b/resources/shaders/110/mm_contour.vs similarity index 100% rename from resources/shaders/mm_contour_attr.vs rename to resources/shaders/110/mm_contour.vs index 370eedb72d..d9063f0c70 100644 --- a/resources/shaders/mm_contour_attr.vs +++ b/resources/shaders/110/mm_contour.vs @@ -1,10 +1,10 @@ #version 110 -attribute vec3 v_position; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; +attribute vec3 v_position; + void main() { gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); diff --git a/resources/shaders/mm_gouraud_attr.fs b/resources/shaders/110/mm_gouraud.fs similarity index 100% rename from resources/shaders/mm_gouraud_attr.fs rename to resources/shaders/110/mm_gouraud.fs diff --git a/resources/shaders/mm_gouraud_attr.vs b/resources/shaders/110/mm_gouraud.vs similarity index 100% rename from resources/shaders/mm_gouraud_attr.vs rename to resources/shaders/110/mm_gouraud.vs index 76101b7670..10c25239f9 100644 --- a/resources/shaders/mm_gouraud_attr.vs +++ b/resources/shaders/110/mm_gouraud.vs @@ -2,8 +2,6 @@ const vec3 ZERO = vec3(0.0, 0.0, 0.0); -attribute vec3 v_position; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; @@ -13,6 +11,8 @@ uniform vec2 z_range; // Clipping plane - general orientation. Used by the SLA gizmo. uniform vec4 clipping_plane; +attribute vec3 v_position; + varying vec3 clipping_planes_dots; varying vec4 model_pos; diff --git a/resources/shaders/110/printbed.fs b/resources/shaders/110/printbed.fs new file mode 100644 index 0000000000..833dff08f4 --- /dev/null +++ b/resources/shaders/110/printbed.fs @@ -0,0 +1,34 @@ +#version 110 + +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_light = vec3(0.365, 0.365, 0.365); + +uniform sampler2D texture; +uniform bool transparent_background; +uniform bool svg_source; + +varying vec2 tex_coord; + +vec4 svg_color() +{ + // takes foreground from texture + vec4 fore_color = texture2D(texture, tex_coord); + + // calculates radial gradient + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); + + // blends foreground with background + return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); +} + +vec4 non_svg_color() +{ + // takes foreground from texture + vec4 color = texture2D(texture, tex_coord); + return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); +} + +void main() +{ + gl_FragColor = svg_source ? svg_color() : non_svg_color(); +} \ No newline at end of file diff --git a/resources/shaders/printbed_attr.vs b/resources/shaders/110/printbed.vs similarity index 100% rename from resources/shaders/printbed_attr.vs rename to resources/shaders/110/printbed.vs index e59a99da35..dc4868b04d 100644 --- a/resources/shaders/printbed_attr.vs +++ b/resources/shaders/110/printbed.vs @@ -1,11 +1,11 @@ #version 110 -attribute vec3 v_position; -attribute vec2 v_tex_coord; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; +attribute vec3 v_position; +attribute vec2 v_tex_coord; + varying vec2 tex_coord; void main() diff --git a/resources/shaders/110/toolpaths_cog.fs b/resources/shaders/110/toolpaths_cog.fs new file mode 100644 index 0000000000..668fe03ecf --- /dev/null +++ b/resources/shaders/110/toolpaths_cog.fs @@ -0,0 +1,19 @@ +#version 110 + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/toolpaths_cog_attr.vs b/resources/shaders/110/toolpaths_cog.vs similarity index 100% rename from resources/shaders/toolpaths_cog_attr.vs rename to resources/shaders/110/toolpaths_cog.vs index 5951238b71..38d2f79444 100644 --- a/resources/shaders/toolpaths_cog_attr.vs +++ b/resources/shaders/110/toolpaths_cog.vs @@ -14,13 +14,13 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 -attribute vec3 v_position; -attribute vec3 v_normal; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; uniform mat3 normal_matrix; +attribute vec3 v_position; +attribute vec3 v_normal; + // x = tainted, y = specular; varying vec2 intensity; varying vec3 world_position; diff --git a/resources/shaders/110/variable_layer_height.fs b/resources/shaders/110/variable_layer_height.fs new file mode 100644 index 0000000000..693c1c6a0b --- /dev/null +++ b/resources/shaders/110/variable_layer_height.fs @@ -0,0 +1,41 @@ +#version 110 + +#define M_PI 3.1415926535897932384626433832795 + +// 2D texture (1D texture split by the rows) of color along the object Z axis. +uniform sampler2D z_texture; +// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. +uniform float z_to_texture_row; +uniform float z_texture_row_to_normalized; +uniform float z_cursor; +uniform float z_cursor_band_width; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + float object_z_row = z_to_texture_row * object_z; + // Index of the row in the texture. + float z_texture_row = floor(object_z_row); + // Normalized coordinate from 0. to 1. + float z_texture_col = object_z_row - z_texture_row; + float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; + // Calculate level of detail from the object Z coordinate. + // This makes the slowly sloping surfaces to be shown with high detail (with stripes), + // and the vertical surfaces to be shown with low detail (no stripes) + float z_in_cells = object_z_row * 190.; + // Gradient of Z projected on the screen. + float dx_vtc = dFdx(z_in_cells); + float dy_vtc = dFdy(z_in_cells); + float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); + // Sample the Z texture. Texture coordinates are normalized to <0, 1>. + vec4 color = vec4(0.25, 0.25, 0.25, 1.0); + if (z_texture_row >= 0.0) + color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. + gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); +} diff --git a/resources/shaders/variable_layer_height_attr.vs b/resources/shaders/110/variable_layer_height.vs similarity index 100% rename from resources/shaders/variable_layer_height_attr.vs rename to resources/shaders/110/variable_layer_height.vs index 40609bd0d9..e6c88fa809 100644 --- a/resources/shaders/variable_layer_height_attr.vs +++ b/resources/shaders/110/variable_layer_height.vs @@ -14,16 +14,16 @@ const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); #define INTENSITY_AMBIENT 0.3 -attribute vec3 v_position; -attribute vec3 v_normal; -attribute vec2 v_tex_coord; - uniform mat4 view_model_matrix; uniform mat4 projection_matrix; uniform mat3 normal_matrix; uniform mat4 volume_world_matrix; uniform float object_max_z; +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + // x = tainted, y = specular; varying vec2 intensity; diff --git a/resources/shaders/140/background.fs b/resources/shaders/140/background.fs new file mode 100644 index 0000000000..c21f3a70cd --- /dev/null +++ b/resources/shaders/140/background.fs @@ -0,0 +1,11 @@ +#version 140 + +uniform vec4 top_color; +uniform vec4 bottom_color; + +in vec2 tex_coord; + +void main() +{ + gl_FragColor = mix(bottom_color, top_color, tex_coord.y); +} diff --git a/resources/shaders/140/background.vs b/resources/shaders/140/background.vs new file mode 100644 index 0000000000..13609b3a21 --- /dev/null +++ b/resources/shaders/140/background.vs @@ -0,0 +1,12 @@ +#version 140 + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/flat.fs b/resources/shaders/140/flat.fs new file mode 100644 index 0000000000..e74124dcae --- /dev/null +++ b/resources/shaders/140/flat.fs @@ -0,0 +1,8 @@ +#version 140 + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/140/flat.vs b/resources/shaders/140/flat.vs new file mode 100644 index 0000000000..7042671de2 --- /dev/null +++ b/resources/shaders/140/flat.vs @@ -0,0 +1,11 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/flat_texture.fs b/resources/shaders/140/flat_texture.fs new file mode 100644 index 0000000000..7db62b6822 --- /dev/null +++ b/resources/shaders/140/flat_texture.fs @@ -0,0 +1,10 @@ +#version 140 + +uniform sampler2D uniform_texture; + +in vec2 tex_coord; + +void main() +{ + gl_FragColor = texture2D(uniform_texture, tex_coord); +} diff --git a/resources/shaders/140/flat_texture.vs b/resources/shaders/140/flat_texture.vs new file mode 100644 index 0000000000..57d8ca3b7c --- /dev/null +++ b/resources/shaders/140/flat_texture.vs @@ -0,0 +1,15 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/gouraud.fs b/resources/shaders/140/gouraud.fs new file mode 100644 index 0000000000..7651380d7d --- /dev/null +++ b/resources/shaders/140/gouraud.fs @@ -0,0 +1,86 @@ +#version 140 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct PrintVolumeDetection +{ + // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid + int type; + // type = 0 (rectangle): + // x = min.x, y = min.y, z = max.x, w = max.y + // type = 1 (circle): + // x = center.x, y = center.y, z = radius + vec4 xy_data; + // x = min z, y = max z + vec2 z_data; +}; + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform SlopeDetection slope; + +uniform bool offset_depth_buffer; + +#ifdef ENABLE_ENVIRONMENT_MAP + uniform sampler2D environment_tex; + uniform bool use_environment_tex; +#endif // ENABLE_ENVIRONMENT_MAP + +uniform PrintVolumeDetection print_volume; + +in vec3 clipping_planes_dots; + +// x = diffuse, y = specular; +in vec2 intensity; + +in vec4 world_pos; +in float world_normal_z; +in vec3 eye_normal; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color = vec3(0.7, 0.7, 1.0); + alpha = 1.0; + } + + // if the fragment is outside the print volume -> use darker color + vec3 pv_check_min = ZERO; + vec3 pv_check_max = ZERO; + if (print_volume.type == 0) { + // rectangle + pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); + pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); + } + else if (print_volume.type == 1) { + // circle + float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); + pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); + pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); + } + color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; + +#ifdef ENABLE_ENVIRONMENT_MAP + if (use_environment_tex) + gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + else +#endif + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + + // In the support painting gizmo and the seam painting gizmo are painted triangles rendered over the already + // rendered object. To resolved z-fighting between previously rendered object and painted triangles, values + // inside the depth buffer are offset by small epsilon for painted triangles inside those gizmos. + gl_FragDepth = gl_FragCoord.z - (offset_depth_buffer ? EPSILON : 0.0); +} diff --git a/resources/shaders/140/gouraud.vs b/resources/shaders/140/gouraud.vs new file mode 100644 index 0000000000..aaf251c42d --- /dev/null +++ b/resources/shaders/140/gouraud.vs @@ -0,0 +1,77 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; +uniform mat4 volume_world_matrix; +uniform SlopeDetection slope; + +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; +in vec3 v_normal; + +// x = diffuse, y = specular; +out vec2 intensity; + +out vec3 clipping_planes_dots; + +out vec4 world_pos; +out float world_normal_z; +out vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/140/gouraud_light.fs b/resources/shaders/140/gouraud_light.fs new file mode 100644 index 0000000000..de616e066a --- /dev/null +++ b/resources/shaders/140/gouraud_light.fs @@ -0,0 +1,12 @@ +#version 140 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +in vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/140/gouraud_light.vs b/resources/shaders/140/gouraud_light.vs new file mode 100644 index 0000000000..b75a844058 --- /dev/null +++ b/resources/shaders/140/gouraud_light.vs @@ -0,0 +1,45 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/gouraud_light_instanced.fs b/resources/shaders/140/gouraud_light_instanced.fs new file mode 100644 index 0000000000..de616e066a --- /dev/null +++ b/resources/shaders/140/gouraud_light_instanced.fs @@ -0,0 +1,12 @@ +#version 140 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +in vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/140/gouraud_light_instanced.vs b/resources/shaders/140/gouraud_light_instanced.vs new file mode 100644 index 0000000000..b6b9ab8be7 --- /dev/null +++ b/resources/shaders/140/gouraud_light_instanced.vs @@ -0,0 +1,50 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + +// vertex attributes +in vec3 v_position; +in vec3 v_normal; +// instance attributes +in vec3 i_offset; +in vec2 i_scales; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/140/imgui.fs b/resources/shaders/140/imgui.fs new file mode 100644 index 0000000000..8e7999fdfa --- /dev/null +++ b/resources/shaders/140/imgui.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform sampler2D Texture; + +in vec2 Frag_UV; +in vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/140/imgui.vs b/resources/shaders/140/imgui.vs new file mode 100644 index 0000000000..fd743bdf2d --- /dev/null +++ b/resources/shaders/140/imgui.vs @@ -0,0 +1,17 @@ +#version 140 + +uniform mat4 ProjMtx; + +in vec2 Position; +in vec2 UV; +in vec4 Color; + +out vec2 Frag_UV; +out vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/140/mm_contour.fs b/resources/shaders/140/mm_contour.fs new file mode 100644 index 0000000000..3681d76c18 --- /dev/null +++ b/resources/shaders/140/mm_contour.fs @@ -0,0 +1,13 @@ +#version 140 + +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; + // Values inside depth buffer for fragments of the contour of a selected area are offset + // by small epsilon to solve z-fighting between painted triangles and contour lines. + gl_FragDepth = gl_FragCoord.z - EPSILON; +} diff --git a/resources/shaders/140/mm_contour.vs b/resources/shaders/140/mm_contour.vs new file mode 100644 index 0000000000..7042671de2 --- /dev/null +++ b/resources/shaders/140/mm_contour.vs @@ -0,0 +1,11 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/mm_gouraud.fs b/resources/shaders/140/mm_gouraud.fs new file mode 100644 index 0000000000..e59d844f26 --- /dev/null +++ b/resources/shaders/140/mm_gouraud.fs @@ -0,0 +1,63 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 normal_matrix; + +in vec3 clipping_planes_dots; +in vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(normal_matrix * triangle_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).xyz; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/140/mm_gouraud.vs b/resources/shaders/140/mm_gouraud.vs new file mode 100644 index 0000000000..30223f4eec --- /dev/null +++ b/resources/shaders/140/mm_gouraud.vs @@ -0,0 +1,28 @@ +#version 140 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +uniform mat4 volume_world_matrix; +// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane. +uniform vec2 z_range; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; + +out vec3 clipping_planes_dots; +out vec4 model_pos; + +void main() +{ + model_pos = vec4(v_position, 1.0); + // Point in homogenous coordinates. + vec4 world_pos = volume_world_matrix * model_pos; + + gl_Position = projection_matrix * view_model_matrix * model_pos; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/140/printbed.fs b/resources/shaders/140/printbed.fs new file mode 100644 index 0000000000..73ff8f6909 --- /dev/null +++ b/resources/shaders/140/printbed.fs @@ -0,0 +1,34 @@ +#version 140 + +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_light = vec3(0.365, 0.365, 0.365); + +uniform sampler2D texture; +uniform bool transparent_background; +uniform bool svg_source; + +in vec2 tex_coord; + +vec4 svg_color() +{ + // takes foreground from texture + vec4 fore_color = texture2D(texture, tex_coord); + + // calculates radial gradient + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); + + // blends foreground with background + return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); +} + +vec4 non_svg_color() +{ + // takes foreground from texture + vec4 color = texture2D(texture, tex_coord); + return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); +} + +void main() +{ + gl_FragColor = svg_source ? svg_color() : non_svg_color(); +} \ No newline at end of file diff --git a/resources/shaders/140/printbed.vs b/resources/shaders/140/printbed.vs new file mode 100644 index 0000000000..57d8ca3b7c --- /dev/null +++ b/resources/shaders/140/printbed.vs @@ -0,0 +1,15 @@ +#version 140 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +in vec3 v_position; +in vec2 v_tex_coord; + +out vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/140/toolpaths_cog.fs b/resources/shaders/140/toolpaths_cog.fs new file mode 100644 index 0000000000..1c745dda99 --- /dev/null +++ b/resources/shaders/140/toolpaths_cog.fs @@ -0,0 +1,19 @@ +#version 140 + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +in vec2 intensity; +in vec3 world_position; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/140/toolpaths_cog.vs b/resources/shaders/140/toolpaths_cog.vs new file mode 100644 index 0000000000..ef676a3751 --- /dev/null +++ b/resources/shaders/140/toolpaths_cog.vs @@ -0,0 +1,47 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31) +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +// normalized values for (1./1.43, 0.2/1.43, 1./1.43) +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; +out vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular applied). + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/variable_layer_height.fs b/resources/shaders/140/variable_layer_height.fs new file mode 100644 index 0000000000..5fa7e6835f --- /dev/null +++ b/resources/shaders/140/variable_layer_height.fs @@ -0,0 +1,41 @@ +#version 140 + +#define M_PI 3.1415926535897932384626433832795 + +// 2D texture (1D texture split by the rows) of color along the object Z axis. +uniform sampler2D z_texture; +// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. +uniform float z_to_texture_row; +uniform float z_texture_row_to_normalized; +uniform float z_cursor; +uniform float z_cursor_band_width; + +// x = tainted, y = specular; +in vec2 intensity; + +in float object_z; + +void main() +{ + float object_z_row = z_to_texture_row * object_z; + // Index of the row in the texture. + float z_texture_row = floor(object_z_row); + // Normalized coordinate from 0. to 1. + float z_texture_col = object_z_row - z_texture_row; + float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; + // Calculate level of detail from the object Z coordinate. + // This makes the slowly sloping surfaces to be shown with high detail (with stripes), + // and the vertical surfaces to be shown with low detail (no stripes) + float z_in_cells = object_z_row * 190.; + // Gradient of Z projected on the screen. + float dx_vtc = dFdx(z_in_cells); + float dy_vtc = dFdy(z_in_cells); + float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); + // Sample the Z texture. Texture coordinates are normalized to <0, 1>. + vec4 color = vec4(0.25, 0.25, 0.25, 1.0); + if (z_texture_row >= 0.0) + color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. + gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); +} diff --git a/resources/shaders/140/variable_layer_height.vs b/resources/shaders/140/variable_layer_height.vs new file mode 100644 index 0000000000..dd463b9c7a --- /dev/null +++ b/resources/shaders/140/variable_layer_height.vs @@ -0,0 +1,60 @@ +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929); +#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION) +#define LIGHT_TOP_SHININESS 20.0 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +in vec3 v_position; +in vec3 v_normal; +in vec2 v_tex_coord; + +// x = tainted, y = specular; +out vec2 intensity; + +out float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(normal_matrix * v_normal); + + // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex. + // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range. + float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS); + + // Perform the same lighting calculation for the 2nd light source (no specular) + NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 3cbebfff8c..66fa8fb92a 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -130,11 +130,7 @@ void Bed3D::Axes::render() if (!m_arrow.is_initialized()) m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -620,11 +616,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #if ENABLE_LEGACY_OPENGL_REMOVAL init_triangles(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("printbed_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("printbed"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -748,11 +740,7 @@ void Bed3D::render_model() } if (!m_model.get_filename().empty()) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.0f); @@ -816,11 +804,7 @@ void Bed3D::render_default(bool bottom, bool picking) init_gridlines(); init_triangles(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 50e488686e..c9fb05439e 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1085,14 +1085,8 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat_attr"); - GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat_attr"); - assert(boost::algorithm::iends_with(shader->get_name(), "_attr")); -#else GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_LEGACY_OPENGL_REMOVAL if (type == ERenderType::Transparent) { diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5372d4565b..acb1ba4d00 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -184,11 +184,7 @@ void GCodeViewer::COG::render() init(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("toolpaths_cog"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -331,11 +327,7 @@ void GCodeViewer::SequentialView::Marker::render() if (!m_visible) return; -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -703,11 +695,7 @@ void GCodeViewer::init() #if !DISABLE_GCODEVIEWER_INSTANCED_MODELS if (wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::InstancedModel; -#if ENABLE_GL_SHADERS_ATTRIBUTES - buffer.shader = "gouraud_light_instanced_attr"; -#else buffer.shader = "gouraud_light_instanced"; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES buffer.model.model.init_from(diamond(16)); buffer.model.color = option_color(type); buffer.model.instances.format = InstanceVBuffer::EFormat::InstancedModel; @@ -716,12 +704,7 @@ void GCodeViewer::init() #endif // !DISABLE_GCODEVIEWER_INSTANCED_MODELS buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::BatchedModel; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; -#if ENABLE_GL_SHADERS_ATTRIBUTES - buffer.shader = "gouraud_light_attr"; -#else buffer.shader = "gouraud_light"; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - buffer.model.data = diamond(16); buffer.model.color = option_color(type); buffer.model.instances.format = InstanceVBuffer::EFormat::BatchedModel; @@ -734,18 +717,14 @@ void GCodeViewer::init() case EMoveType::Extrude: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; -#if ENABLE_GL_SHADERS_ATTRIBUTES - buffer.shader = "gouraud_light_attr"; -#else buffer.shader = "gouraud_light"; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES break; } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; #if ENABLE_GL_SHADERS_ATTRIBUTES buffer.vertices.format = VBuffer::EFormat::Position; - buffer.shader = "flat_attr"; + buffer.shader = "flat"; #else buffer.vertices.format = VBuffer::EFormat::PositionNormal3; buffer.shader = "toolpaths_lines"; @@ -3161,11 +3140,8 @@ void GCodeViewer::render_toolpaths() const int position_id = shader->get_attrib_location("v_position"); const int normal_id = shader->get_attrib_location("v_normal"); #else - switch (buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: shader_init_as_points(*shader); break; - case TBuffer::ERenderPrimitiveType::Line: shader_init_as_lines(*shader); break; - default: break; - } + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) + shader_init_as_lines(*shader); #endif // ENABLE_GL_SHADERS_ATTRIBUTES const int uniform_color = shader->get_uniform_location("uniform_color"); @@ -3322,11 +3298,7 @@ void GCodeViewer::render_shells() if (!m_shells.visible || m_shells.volumes.empty()) return; -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 91add7c567..1649d2082a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -161,11 +161,7 @@ void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id) bool GLCanvas3D::LayersEditing::is_allowed() const { -#if ENABLE_GL_SHADERS_ATTRIBUTES - return wxGetApp().get_shader("variable_layer_height_attr") != nullptr && m_z_texture_id > 0; -#else return wxGetApp().get_shader("variable_layer_height") != nullptr && m_z_texture_id > 0; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } bool GLCanvas3D::LayersEditing::is_enabled() const @@ -328,11 +324,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) bool GLCanvas3D::LayersEditing::is_initialized() const { -#if ENABLE_GL_SHADERS_ATTRIBUTES - return wxGetApp().get_shader("variable_layer_height_attr") != nullptr; -#else return wxGetApp().get_shader("variable_layer_height") != nullptr; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const @@ -375,11 +367,8 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 return; const float cnv_inv_width = 1.0f / cnv_width; - - GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); if (shader == nullptr) return; @@ -550,11 +539,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.profile.init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -594,11 +579,7 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G if (current_shader != nullptr) current_shader->stop_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1075,11 +1056,7 @@ void GLCanvas3D::SequentialPrintClearance::render() const ColorRGBA NO_FILL_COLOR = { 1.0f, 1.0f, 1.0f, 0.75f }; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -4608,11 +4585,7 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const camera.apply_projection(volumes_box, near_z, far_z); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -5551,11 +5524,7 @@ void GLCanvas3D::_render_background() m_background.init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("background_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("background"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); shader->set_uniform("top_color", use_error_color ? ERROR_BG_LIGHT_COLOR : DEFAULT_BG_LIGHT_COLOR); @@ -5681,11 +5650,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.set_show_non_manifold_edges(!m_gizmos.is_hiding_instances() && m_gizmos.get_current_type() != GLGizmosManager::Simplify); #endif // ENABLE_SHOW_NON_MANIFOLD_EDGES -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -5910,11 +5875,7 @@ void GLCanvas3D::_render_overlays() void GLCanvas3D::_render_volumes_for_picking() const { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -6137,11 +6098,7 @@ void GLCanvas3D::_render_camera_target() } } -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -6322,11 +6279,7 @@ void GLCanvas3D::_render_sla_slices() } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index b81287ecee..4297a90910 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -935,11 +935,7 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance GLShaderProgram* shader = wxGetApp().get_current_shader(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced_attr")) -#else if (shader == nullptr || !boost::algorithm::iends_with(shader->get_name(), "_instanced")) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES return; // vertex attributes diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 19327b33a7..a8be0f84e2 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -131,11 +131,7 @@ namespace GUI { glsafe(::glEnable(GL_LINE_STIPPLE)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 9f0b03ea0e..a01c39864a 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -35,14 +35,15 @@ std::pair GLShadersManager::init() #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES + const std::string prefix = !GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 1) ? "140/" : "110/"; // imgui shader - valid &= append_shader("imgui", { "imgui.vs", "imgui.fs" }); + valid &= append_shader("imgui", { prefix + "imgui.vs", prefix + "imgui.fs" }); // basic shader, used to render all what was previously rendered using the immediate mode - valid &= append_shader("flat_attr", { "flat_attr.vs", "flat.fs" }); + valid &= append_shader("flat", { prefix + "flat.vs", prefix + "flat.fs" }); // basic shader for textures, used to render textures - valid &= append_shader("flat_texture_attr", { "flat_texture_attr.vs", "flat_texture.fs" }); + valid &= append_shader("flat_texture", { prefix + "flat_texture.vs", prefix + "flat_texture.fs" }); // used to render 3D scene background - valid &= append_shader("background_attr", { "background_attr.vs", "background.fs" }); + valid &= append_shader("background", { prefix + "background.vs", prefix + "background.fs" }); #else // basic shader, used to render all what was previously rendered using the immediate mode valid &= append_shader("flat", { "flat.vs", "flat.fs" }); @@ -55,16 +56,16 @@ std::pair GLShadersManager::init() #if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity #if ENABLE_GL_SHADERS_ATTRIBUTES - valid &= append_shader("toolpaths_cog_attr", { "toolpaths_cog_attr.vs", "toolpaths_cog.fs" }); + valid &= append_shader("toolpaths_cog", { prefix + "toolpaths_cog.vs", prefix + "toolpaths_cog.fs" }); #else valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); #endif // ENABLE_GL_SHADERS_ATTRIBUTES #endif // ENABLE_SHOW_TOOLPATHS_COG #if ENABLE_GL_SHADERS_ATTRIBUTES // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview - valid &= append_shader("gouraud_light_attr", { "gouraud_light_attr.vs", "gouraud_light.fs" }); + valid &= append_shader("gouraud_light", { prefix + "gouraud_light.vs", prefix + "gouraud_light.fs" }); // used to render printbed - valid &= append_shader("printbed_attr", { "printbed_attr.vs", "printbed.fs" }); + valid &= append_shader("printbed", { prefix + "printbed.vs", prefix + "printbed.fs" }); #else // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); @@ -74,14 +75,14 @@ std::pair GLShadersManager::init() // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { #if ENABLE_GL_SHADERS_ATTRIBUTES - valid &= append_shader("gouraud_light_instanced_attr", { "gouraud_light_instanced_attr.vs", "gouraud_light_instanced.fs" }); + valid &= append_shader("gouraud_light_instanced", { prefix + "gouraud_light_instanced.vs", prefix + "gouraud_light_instanced.fs" }); #else valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); #endif // ENABLE_GL_SHADERS_ATTRIBUTES } #if ENABLE_GL_SHADERS_ATTRIBUTES // used to render objects in 3d editor - valid &= append_shader("gouraud_attr", { "gouraud_attr.vs", "gouraud.fs" } + valid &= append_shader("gouraud", { prefix + "gouraud.vs", prefix + "gouraud.fs" } #else // used to render extrusion and travel paths as lines in gcode preview valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" }); @@ -94,9 +95,9 @@ std::pair GLShadersManager::init() ); #if ENABLE_GL_SHADERS_ATTRIBUTES // used to render variable layers heights in 3d editor - valid &= append_shader("variable_layer_height_attr", { "variable_layer_height_attr.vs", "variable_layer_height.fs" }); + valid &= append_shader("variable_layer_height", { prefix + "variable_layer_height.vs", prefix + "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo - valid &= append_shader("mm_contour_attr", { "mm_contour_attr.vs", "mm_contour_attr.fs" }); + valid &= append_shader("mm_contour", { prefix + "mm_contour.vs", prefix + "mm_contour.fs" }); #else // used to render variable layers heights in 3d editor valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); @@ -111,9 +112,9 @@ std::pair GLShadersManager::init() // triangle normals inside fragment shader have the right direction. #if ENABLE_GL_SHADERS_ATTRIBUTES if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) - valid &= append_shader("mm_gouraud_attr", { "mm_gouraud_attr.vs", "mm_gouraud_attr.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); + valid &= append_shader("mm_gouraud", { prefix + "mm_gouraud.vs", prefix + "mm_gouraud.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); else - valid &= append_shader("mm_gouraud_attr", { "mm_gouraud_attr.vs", "mm_gouraud_attr.fs" }); + valid &= append_shader("mm_gouraud", { prefix + "mm_gouraud.vs", prefix + "mm_gouraud.fs" }); #else if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}, {"FLIP_TRIANGLE_NORMALS"sv}); diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 064ca1a18b..137a0a1096 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -358,11 +358,7 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, GLModel model; model.init_from(std::move(init_data)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_texture_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat_texture"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 83aed42893..aacecb6efe 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -134,11 +134,7 @@ void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const void GLGizmoBase::render_grabbers(float size) const { -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; shader->start_using(); @@ -153,11 +149,7 @@ void GLGizmoBase::render_grabbers(float size) const void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 5c9b08a93c..9a87d5a459 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -107,11 +107,7 @@ void GLGizmoCut::on_render() glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); const Vec3d diff = plane_center - m_old_center; @@ -197,11 +193,7 @@ void GLGizmoCut::on_render() shader->stop_using(); } -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else glsafe(::glColor3f(1.0, 1.0, 0.0)); ::glBegin(GL_LINES); @@ -222,11 +214,7 @@ void GLGizmoCut::on_render() } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("flat_attr"); -#else shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 48c81bc5a1..aa291f6231 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -105,11 +105,7 @@ void GLGizmoFlatten::on_render() const Selection& selection = m_parent.get_selection(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -165,11 +161,7 @@ void GLGizmoFlatten::on_render_for_picking() const Selection& selection = m_parent.get_selection(); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index e979297df7..88b319f252 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -104,11 +104,7 @@ void GLGizmoHollow::on_render_for_picking() void GLGizmoHollow::render_points(const Selection& selection, bool picking) { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 49eb8cb95b..308100d7fe 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -170,11 +170,7 @@ void GLGizmoMmuSegmentation::data_changed() void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const { ClippingPlaneDataWrapper clp_data = this->get_clipping_plane_data(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto* shader = wxGetApp().get_shader("mm_gouraud_attr"); -#else auto *shader = wxGetApp().get_shader("mm_gouraud"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (!shader) return; shader->start_using(); @@ -598,16 +594,13 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) auto *shader = wxGetApp().get_current_shader(); if (!shader) return; + assert(shader->get_name() == "mm_gouraud"); #if ENABLE_GL_SHADERS_ATTRIBUTES - assert(shader->get_name() == "mm_gouraud_attr"); - const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * matrix; shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - assert(shader->get_name() == "mm_gouraud"); #endif // ENABLE_GL_SHADERS_ATTRIBUTES for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 18acf6e9be..a798122ec1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -154,11 +154,7 @@ void GLGizmoMove3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -199,11 +195,7 @@ void GLGizmoMove3D::on_render() else { // draw axis #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -217,11 +209,7 @@ void GLGizmoMove3D::on_render() shader->stop_using(); } -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else glsafe(::glColor4fv(AXES_COLOR[m_hover_id].data())); ::glBegin(GL_LINES); @@ -286,11 +274,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box const double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 03d60440ad..01dc595148 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -80,11 +80,7 @@ GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_pl void GLGizmoPainterBase::render_triangles(const Selection& selection) const { -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto* shader = wxGetApp().get_shader("gouraud_attr"); -#else auto* shader = wxGetApp().get_shader("gouraud"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (! shader) return; shader->start_using(); @@ -250,11 +246,7 @@ void GLGizmoPainterBase::render_cursor_circle() m_circle.init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -292,11 +284,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -927,11 +915,9 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) auto* shader = wxGetApp().get_current_shader(); if (! shader) return; -#if ENABLE_GL_SHADERS_ATTRIBUTES - assert(shader->get_name() == "gouraud_attr"); -#else + assert(shader->get_name() == "gouraud"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + ScopeGuard guard([shader]() { if (shader) shader->set_uniform("offset_depth_buffer", false);}); shader->set_uniform("offset_depth_buffer", true); for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), @@ -1288,11 +1274,7 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -1375,11 +1357,7 @@ void TriangleSelectorGUI::render_paint_contour() if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); -#else auto* contour_shader = wxGetApp().get_shader("mm_contour"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (contour_shader != nullptr) { contour_shader->start_using(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 1d817b58bc..6bec8be50e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -172,11 +172,7 @@ void GLGizmoRotate::on_render() glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); @@ -576,11 +572,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick const double size = m_dragging ? double(m_grabbers.front().get_dragging_half_size(mean_size)) : double(m_grabbers.front().get_half_size(mean_size)); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat_attr" : "gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 373a2396d8..26c9251b4a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -265,11 +265,7 @@ void GLGizmoScale3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -316,11 +312,7 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 0 || m_hover_id == 1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -333,11 +325,7 @@ void GLGizmoScale3D::on_render() } // draw grabbers -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[0].color.data())); @@ -357,11 +345,7 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 2 || m_hover_id == 3) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -374,11 +358,7 @@ void GLGizmoScale3D::on_render() } // draw grabbers -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[2].color.data())); @@ -398,11 +378,7 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 4 || m_hover_id == 5) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -415,11 +391,7 @@ void GLGizmoScale3D::on_render() } // draw grabbers -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_grabbers[4].color.data())); @@ -439,11 +411,7 @@ void GLGizmoScale3D::on_render() else if (m_hover_id >= 6) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES @@ -459,11 +427,7 @@ void GLGizmoScale3D::on_render() } // draw grabbers -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader = wxGetApp().get_shader("gouraud_light_attr"); -#else shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else // draw connection glsafe(::glColor4fv(m_drag_color.data())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 1a383187c6..bce1123e00 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -737,14 +737,11 @@ void GLGizmoSimplify::on_render() GLModel &glmodel = it->second; const Transform3d trafo_matrix = selected_volume->world_matrix(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto* gouraud_shader = wxGetApp().get_shader("gouraud_light_attr"); -#else +#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); - - auto *gouraud_shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_GL_SHADERS_ATTRIBUTES + auto* gouraud_shader = wxGetApp().get_shader("gouraud_light"); glsafe(::glPushAttrib(GL_DEPTH_TEST)); glsafe(::glEnable(GL_DEPTH_TEST)); gouraud_shader->start_using(); @@ -759,11 +756,7 @@ void GLGizmoSimplify::on_render() gouraud_shader->stop_using(); if (m_show_wireframe) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto* contour_shader = wxGetApp().get_shader("mm_contour_attr"); -#else auto *contour_shader = wxGetApp().get_shader("mm_contour"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES contour_shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES contour_shader->set_uniform("view_model_matrix", view_model_matrix); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 4007f0cb0b..7c61673b45 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -130,11 +130,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat_attr") : wxGetApp().get_shader("gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index e7e9ba2fbe..bbdcdeb346 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -87,11 +87,7 @@ void MeshClipper::render_cut() if (curr_shader != nullptr) curr_shader->stop_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader != nullptr) { shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 68a052341a..7ccc6fc256 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1275,11 +1275,7 @@ void Selection::render_center(bool gizmo_is_dragging) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -1324,11 +1320,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) return; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat_attr" : "gouraud_light_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader(boost::starts_with(sidebar_field, "layer") ? "flat" : "gouraud_light"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; @@ -2020,11 +2012,7 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con glsafe(::glLineWidth(2.0f * m_scale_factor)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_shader("flat_attr"); -#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; From c1e54675f53a100402b75a30b3061dd780d75955 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 21 Mar 2022 17:15:39 +0100 Subject: [PATCH 137/149] Prevent hard crash in rare circumstances --- src/slic3r/GUI/Jobs/BusyCursorJob.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Jobs/BusyCursorJob.hpp b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp index 530213b1d5..8504d1eb93 100644 --- a/src/slic3r/GUI/Jobs/BusyCursorJob.hpp +++ b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp @@ -4,6 +4,7 @@ #include "Job.hpp" #include +#include namespace Slic3r { namespace GUI { @@ -16,7 +17,11 @@ struct CursorSetterRAII } ~CursorSetterRAII() { - ctl.call_on_main_thread([] { wxEndBusyCursor(); }); + try { + ctl.call_on_main_thread([] { wxEndBusyCursor(); }); + } catch(...) { + BOOST_LOG_TRIVIAL(error) << "Can't revert cursor from busy to normal"; + } } }; From 9be3d926c5ff8debf25f22e2d53dd1410bfcdd79 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 22 Mar 2022 08:18:39 +0100 Subject: [PATCH 138/149] Tech ENABLE_LEGACY_OPENGL_REMOVAL - A few refactorings and fixes --- resources/shaders/140/flat_texture.fs | 2 +- resources/shaders/140/gouraud.fs | 2 +- resources/shaders/140/imgui.fs | 4 ++-- resources/shaders/140/printbed.fs | 4 ++-- .../shaders/140/variable_layer_height.fs | 4 ++-- src/slic3r/GUI/GLModel.cpp | 21 ++++++++++--------- src/slic3r/GUI/ImGuiWrapper.cpp | 19 ++++++++++------- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/resources/shaders/140/flat_texture.fs b/resources/shaders/140/flat_texture.fs index 7db62b6822..dec946721e 100644 --- a/resources/shaders/140/flat_texture.fs +++ b/resources/shaders/140/flat_texture.fs @@ -6,5 +6,5 @@ in vec2 tex_coord; void main() { - gl_FragColor = texture2D(uniform_texture, tex_coord); + gl_FragColor = texture(uniform_texture, tex_coord); } diff --git a/resources/shaders/140/gouraud.fs b/resources/shaders/140/gouraud.fs index 7651380d7d..beb3a947bb 100644 --- a/resources/shaders/140/gouraud.fs +++ b/resources/shaders/140/gouraud.fs @@ -74,7 +74,7 @@ void main() #ifdef ENABLE_ENVIRONMENT_MAP if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + gl_FragColor = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); else #endif gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); diff --git a/resources/shaders/140/imgui.fs b/resources/shaders/140/imgui.fs index 8e7999fdfa..4b2571749f 100644 --- a/resources/shaders/140/imgui.fs +++ b/resources/shaders/140/imgui.fs @@ -1,4 +1,4 @@ -#version 110 +#version 140 uniform sampler2D Texture; @@ -7,5 +7,5 @@ in vec4 Frag_Color; void main() { - gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); + gl_FragColor = Frag_Color * texture(Texture, Frag_UV.st); } \ No newline at end of file diff --git a/resources/shaders/140/printbed.fs b/resources/shaders/140/printbed.fs index 73ff8f6909..86edd0daf4 100644 --- a/resources/shaders/140/printbed.fs +++ b/resources/shaders/140/printbed.fs @@ -12,7 +12,7 @@ in vec2 tex_coord; vec4 svg_color() { // takes foreground from texture - vec4 fore_color = texture2D(texture, tex_coord); + vec4 fore_color = texture(texture, tex_coord); // calculates radial gradient vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); @@ -24,7 +24,7 @@ vec4 svg_color() vec4 non_svg_color() { // takes foreground from texture - vec4 color = texture2D(texture, tex_coord); + vec4 color = texture(texture, tex_coord); return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); } diff --git a/resources/shaders/140/variable_layer_height.fs b/resources/shaders/140/variable_layer_height.fs index 5fa7e6835f..cf1fc309cc 100644 --- a/resources/shaders/140/variable_layer_height.fs +++ b/resources/shaders/140/variable_layer_height.fs @@ -34,8 +34,8 @@ void main() // Sample the Z texture. Texture coordinates are normalized to <0, 1>. vec4 color = vec4(0.25, 0.25, 0.25, 1.0); if (z_texture_row >= 0.0) - color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), - texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + color = mix(texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); // Mix the final color. gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); } diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 4297a90910..9c9d695260 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -861,7 +861,7 @@ void GLModel::render(const std::pair& range) #if ENABLE_GL_SHADERS_ATTRIBUTES position_id = shader->get_attrib_location("v_position"); if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(position_id)); } #else @@ -873,7 +873,7 @@ void GLModel::render(const std::pair& range) #if ENABLE_GL_SHADERS_ATTRIBUTES normal_id = shader->get_attrib_location("v_normal"); if (normal_id != -1) { - glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(normal_id)); } #else @@ -885,7 +885,7 @@ void GLModel::render(const std::pair& range) #if ENABLE_GL_SHADERS_ATTRIBUTES tex_coord_id = shader->get_attrib_location("v_tex_coord"); if (tex_coord_id != -1) { - glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::tex_coord_offset_bytes(data.format))); + glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(tex_coord_id)); } #else @@ -930,7 +930,7 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instances_count) const #endif // ENABLE_LEGACY_OPENGL_REMOVAL { - if (instances_vbo == 0) + if (instances_vbo == 0 || instances_count == 0) return; GLShaderProgram* shader = wxGetApp().get_current_shader(); @@ -970,11 +970,12 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance glsafe(::glBindBuffer(GL_ARRAY_BUFFER, instances_vbo)); #if ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)0)); + const size_t instance_stride = 5 * sizeof(float); + glsafe(::glVertexAttribPointer(offset_id, 3, GL_FLOAT, GL_FALSE, instance_stride, (const void*)0)); glsafe(::glEnableVertexAttribArray(offset_id)); glsafe(::glVertexAttribDivisor(offset_id, 1)); - glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (GLvoid*)(3 * sizeof(float)))); + glsafe(::glVertexAttribPointer(scales_id, 2, GL_FLOAT, GL_FALSE, instance_stride, (const void*)(3 * sizeof(float)))); glsafe(::glEnableVertexAttribArray(scales_id)); glsafe(::glVertexAttribDivisor(scales_id, 1)); #else @@ -996,8 +997,6 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance const GLenum mode = get_primitive_mode(data.format); const GLenum index_type = get_index_type(data); - shader->set_uniform("uniform_color", data.color); - const size_t vertex_stride_bytes = Geometry::vertex_stride_bytes(data.format); const bool position = Geometry::has_position(data.format); const bool normal = Geometry::has_normal(data.format); @@ -1005,15 +1004,17 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); if (position) { - glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::position_offset_bytes(data.format))); + glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(position_id)); } if (normal) { - glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (GLvoid*)Geometry::normal_offset_bytes(data.format))); + glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(normal_id)); } + shader->set_uniform("uniform_color", data.color); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); glsafe(::glDrawElementsInstanced(mode, indices_count(), index_type, (const void*)0, instances_count)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index e659a386bd..d5dfa276ce 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1475,10 +1475,10 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) // We are using the OpenGL fixed pipeline to make the example code simpler to read! // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. - GLint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); - GLint last_polygon_mode[2]; glsafe(::glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode)); - GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); - GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); + GLint last_polygon_mode[2]; glsafe(::glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode)); + GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); + GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); GLint last_texture_env_mode; glsafe(::glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_texture_env_mode)); glsafe(::glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT)); glsafe(::glEnable(GL_BLEND)); @@ -1553,17 +1553,17 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) const int position_id = shader->get_attrib_location("Position"); if (position_id != -1) { - glsafe(::glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); + glsafe(::glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, pos))); glsafe(::glEnableVertexAttribArray(position_id)); } const int uv_id = shader->get_attrib_location("UV"); if (uv_id != -1) { - glsafe(::glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); + glsafe(::glVertexAttribPointer(uv_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, uv))); glsafe(::glEnableVertexAttribArray(uv_id)); } const int color_id = shader->get_attrib_location("Color"); if (color_id != -1) { - glsafe(::glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); + glsafe(::glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, col))); glsafe(::glEnableVertexAttribArray(color_id)); } #else @@ -1637,11 +1637,14 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glPopMatrix()); #endif // !ENABLE_GL_IMGUI_SHADERS glsafe(::glPopAttrib()); - glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1])); + glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); + glsafe(::glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]))); glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); #if ENABLE_GL_IMGUI_SHADERS + shader->stop_using(); + if (curr_shader != nullptr) curr_shader->start_using(); #endif // ENABLE_GL_IMGUI_SHADERS From a0630420d9ed417a8848718702a6b01cc3c1975f Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 22 Mar 2022 15:20:51 +0100 Subject: [PATCH 139/149] Tech ENABLE_LEGACY_OPENGL_REMOVAL - Calculation of camera projection matrix --- src/slic3r/GUI/Camera.cpp | 56 ++++++++++++++++++++++++++++------- src/slic3r/GUI/Camera.hpp | 2 ++ src/slic3r/GUI/GLCanvas3D.cpp | 6 ++++ 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 44b0cd84a1..d6272aea55 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -109,12 +109,14 @@ void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); } +#if !ENABLE_LEGACY_OPENGL_REMOVAL void Camera::apply_view_matrix() { glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glLoadIdentity()); glsafe(::glMultMatrixd(m_view_matrix.data())); } +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double far_z) { @@ -123,9 +125,11 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa const double old_distance = m_distance; m_frustrum_zs = calc_tight_frustrum_zs_around(box); +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (m_distance != old_distance) // the camera has been moved re-apply view matrix apply_view_matrix(); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL if (near_z > 0.0) m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); @@ -159,6 +163,35 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } } +#if ENABLE_LEGACY_OPENGL_REMOVAL + switch (m_type) + { + default: + case EType::Ortho: + { + const double dz = m_frustrum_zs.second - m_frustrum_zs.first; + const double zz = m_frustrum_zs.first + m_frustrum_zs.second; + m_projection_matrix.matrix() << 1.0 / w, 0.0, 0.0, 0.0, + 0.0, 1.0 / h, 0.0, 0.0, + 0.0, 0.0, -2.0 / dz, -zz / dz, + 0.0, 0.0, 0.0, 1.0; + break; + } + case EType::Perspective: + { + const double n = m_frustrum_zs.first; + const double f = m_frustrum_zs.second; + const double dz = f - n; + const double zz = n + f; + const double fn = n * f; + m_projection_matrix.matrix() << n / w, 0.0, 0.0, 0.0, + 0.0, n / h, 0.0, 0.0, + 0.0, 0.0, -zz / dz, -2.0 * fn / dz, + 0.0, 0.0, -1.0, 0.0; + break; + } + } +#else glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glLoadIdentity()); @@ -179,6 +212,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa glsafe(::glGetDoublev(GL_PROJECTION_MATRIX, m_projection_matrix.data())); glsafe(::glMatrixMode(GL_MODELVIEW)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) @@ -298,8 +332,8 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo // box in eye space const BoundingBoxf3 eye_box = box.transformed(m_view_matrix); - near_z = -eye_box.max(2); - far_z = -eye_box.min(2); + near_z = -eye_box.max.z(); + far_z = -eye_box.min.z(); // apply margin near_z -= FrustrumZMargin; @@ -465,19 +499,19 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up m_distance = (position - target).norm(); const Vec3d new_position = m_target + m_distance * unit_z; - m_view_matrix(0, 0) = unit_x(0); - m_view_matrix(0, 1) = unit_x(1); - m_view_matrix(0, 2) = unit_x(2); + m_view_matrix(0, 0) = unit_x.x(); + m_view_matrix(0, 1) = unit_x.y(); + m_view_matrix(0, 2) = unit_x.z(); m_view_matrix(0, 3) = -unit_x.dot(new_position); - m_view_matrix(1, 0) = unit_y(0); - m_view_matrix(1, 1) = unit_y(1); - m_view_matrix(1, 2) = unit_y(2); + m_view_matrix(1, 0) = unit_y.x(); + m_view_matrix(1, 1) = unit_y.y(); + m_view_matrix(1, 2) = unit_y.z(); m_view_matrix(1, 3) = -unit_y.dot(new_position); - m_view_matrix(2, 0) = unit_z(0); - m_view_matrix(2, 1) = unit_z(1); - m_view_matrix(2, 2) = unit_z(2); + m_view_matrix(2, 0) = unit_z.x(); + m_view_matrix(2, 1) = unit_z.y(); + m_view_matrix(2, 2) = unit_z.z(); m_view_matrix(2, 3) = -unit_z.dot(new_position); m_view_matrix(3, 0) = 0.0; diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index a61eb44ec5..a1d7426882 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -92,7 +92,9 @@ public: double get_fov() const; void apply_viewport(int x, int y, unsigned int w, unsigned int h); +#if !ENABLE_LEGACY_OPENGL_REMOVAL void apply_view_matrix(); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // Calculates and applies the projection matrix tighting the frustrum z range around the given box. // If larger z span is needed, pass the desired values of near and far z (negative values are ignored) void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1649d2082a..5539d681c4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1662,13 +1662,17 @@ void GLCanvas3D::render() camera.requires_zoom_to_bed = false; } +#if !ENABLE_LEGACY_OPENGL_REMOVAL camera.apply_view_matrix(); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL camera.apply_projection(_max_bounding_box(true, true)); +#if !ENABLE_LEGACY_OPENGL_REMOVAL GLfloat position_cam[4] = { 1.0f, 0.0f, 1.0f, 0.0f }; glsafe(::glLightfv(GL_LIGHT1, GL_POSITION, position_cam)); GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; glsafe(::glLightfv(GL_LIGHT0, GL_POSITION, position_top)); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL wxGetApp().imgui()->new_frame(); @@ -4561,7 +4565,9 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const camera.set_scene_box(scene_bounding_box()); camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); camera.zoom_to_box(volumes_box); +#if !ENABLE_LEGACY_OPENGL_REMOVAL camera.apply_view_matrix(); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES const Transform3d& view_matrix = camera.get_view_matrix(); From 86641a481e0ad107eb5539205f0f449e61036814 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 22 Mar 2022 15:35:02 +0100 Subject: [PATCH 140/149] Fixed typo --- resources/shaders/140/printbed.fs | 9 +++++---- src/slic3r/GUI/GLShadersManager.cpp | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/resources/shaders/140/printbed.fs b/resources/shaders/140/printbed.fs index 86edd0daf4..6d927a749c 100644 --- a/resources/shaders/140/printbed.fs +++ b/resources/shaders/140/printbed.fs @@ -3,16 +3,17 @@ const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); const vec3 back_color_light = vec3(0.365, 0.365, 0.365); -uniform sampler2D texture; +uniform sampler2D in_texture; uniform bool transparent_background; uniform bool svg_source; in vec2 tex_coord; +out vec4 frag_color; vec4 svg_color() { // takes foreground from texture - vec4 fore_color = texture(texture, tex_coord); + vec4 fore_color = texture(in_texture, tex_coord); // calculates radial gradient vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); @@ -24,11 +25,11 @@ vec4 svg_color() vec4 non_svg_color() { // takes foreground from texture - vec4 color = texture(texture, tex_coord); + vec4 color = texture(in_texture, tex_coord); return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); } void main() { - gl_FragColor = svg_source ? svg_color() : non_svg_color(); + frag_color = svg_source ? svg_color() : non_svg_color(); } \ No newline at end of file diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index a01c39864a..ab8dfb3e77 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -35,7 +35,7 @@ std::pair GLShadersManager::init() #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GL_SHADERS_ATTRIBUTES - const std::string prefix = !GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 1) ? "140/" : "110/"; + const std::string prefix = GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 1) ? "140/" : "110/"; // imgui shader valid &= append_shader("imgui", { prefix + "imgui.vs", prefix + "imgui.fs" }); // basic shader, used to render all what was previously rendered using the immediate mode From 1d2339fbce896bff37c59f3040cce334a67cedb3 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 23 Mar 2022 08:18:23 +0100 Subject: [PATCH 141/149] Follow-up of a0630420d9ed417a8848718702a6b01cc3c1975f - Fixed warning --- src/slic3r/GUI/Camera.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index d6272aea55..77ce27a799 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -123,7 +123,9 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa double w = 0.0; double h = 0.0; +#if !ENABLE_LEGACY_OPENGL_REMOVAL const double old_distance = m_distance; +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL m_frustrum_zs = calc_tight_frustrum_zs_around(box); #if !ENABLE_LEGACY_OPENGL_REMOVAL if (m_distance != old_distance) From 43124979e5665f6029d8f5a01704aa98c9064d2f Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 12 Jan 2022 16:21:16 +0100 Subject: [PATCH 142/149] app updater feature checks online version file offers download of new version of slicer download with notification opens instalator or target folder --- src/slic3r/CMakeLists.txt | 3 + src/slic3r/GUI/GUI_App.cpp | 149 +++++- src/slic3r/GUI/GUI_App.hpp | 10 +- src/slic3r/GUI/NotificationManager.cpp | 142 ++++- src/slic3r/GUI/NotificationManager.hpp | 34 +- src/slic3r/GUI/UpdateDialogs.cpp | 103 ++++ src/slic3r/GUI/UpdateDialogs.hpp | 48 ++ src/slic3r/Utils/AppUpdater.cpp | 694 +++++++++++++++++++++++++ src/slic3r/Utils/AppUpdater.hpp | 62 +++ src/slic3r/Utils/Http.cpp | 1 - src/slic3r/Utils/MacUtils.mm | 18 + src/slic3r/Utils/PresetUpdater.cpp | 18 +- src/slic3r/Utils/PresetUpdater.hpp | 4 +- 13 files changed, 1250 insertions(+), 36 deletions(-) create mode 100644 src/slic3r/Utils/AppUpdater.cpp create mode 100644 src/slic3r/Utils/AppUpdater.hpp create mode 100644 src/slic3r/Utils/MacUtils.mm diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index aa6268d885..ef7687f00f 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -213,6 +213,8 @@ set(SLIC3R_GUI_SOURCES GUI/DesktopIntegrationDialog.hpp GUI/HintNotification.cpp GUI/HintNotification.hpp + Utils/AppUpdater.cpp + Utils/AppUpdater.hpp Utils/Http.cpp Utils/Http.hpp Utils/FixModelByWin10.cpp @@ -250,6 +252,7 @@ if (APPLE) list(APPEND SLIC3R_GUI_SOURCES Utils/RetinaHelperImpl.mm Utils/MacDarkMode.mm + Utils/MacUtils.mm GUI/RemovableDriveManagerMM.mm GUI/RemovableDriveManagerMM.h GUI/Mouse3DHandlerMac.mm diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ee91994252..3c0d52bd1e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -57,6 +57,7 @@ #include "../Utils/PrintHost.hpp" #include "../Utils/Process.hpp" #include "../Utils/MacDarkMode.hpp" +#include "../Utils/AppUpdater.hpp" #include "slic3r/Config/Snapshot.hpp" #include "ConfigSnapshotDialog.hpp" #include "FirmwareDialog.hpp" @@ -816,18 +817,13 @@ void GUI_App::post_init() CallAfter([this] { bool cw_showed = this->config_wizard_startup(); this->preset_updater->sync(preset_bundle); + this->app_version_check(); if (! cw_showed) { // The CallAfter is needed as well, without it, GL extensions did not show. // Also, we only want to show this when the wizard does not, so the new user // sees something else than "we want something" on the first start. show_send_system_info_dialog_if_needed(); } - #ifdef _WIN32 - // Run external updater on Windows if version check is enabled. - if (this->preset_updater->version_check_enabled() && ! run_updater_win()) - // "prusaslicer-updater.exe" was not started, run our own update check. - #endif // _WIN32 - this->preset_updater->slic3r_update_notify(); }); } @@ -853,6 +849,8 @@ GUI_App::GUI_App(EAppMode mode) { //app config initializes early becasuse it is used in instance checking in PrusaSlicer.cpp this->init_app_config(); + // init app downloader after path to datadir is set + m_app_updater = std::make_unique(); } GUI_App::~GUI_App() @@ -1242,21 +1240,7 @@ bool GUI_App::on_init_inner() #endif // __WXMSW__ preset_updater = new PresetUpdater(); - Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) { - app_config->set("version_online", into_u8(evt.GetString())); - app_config->save(); - std::string opt = app_config->get("notify_release"); - if (this->plater_ != nullptr && (opt == "all" || opt == "release")) { - if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(into_u8(evt.GetString()))) { - this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable - , NotificationManager::NotificationLevel::ImportantNotificationLevel - , Slic3r::format(_u8L("New release version %1% is available."), evt.GetString()) - , _u8L("See Download page.") - , [](wxEvtHandler* evnthndlr) {wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); return true; } - ); - } - } - }); + Bind(EVT_SLIC3R_VERSION_ONLINE, &GUI_App::on_version_read, this); Bind(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, [this](const wxCommandEvent& evt) { app_config->save(); if (this->plater_ != nullptr && app_config->get("notify_release") == "all") { @@ -1272,6 +1256,18 @@ bool GUI_App::on_init_inner() } } }); + Bind(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, [this](const wxCommandEvent& evt) { + if (this->plater_ != nullptr) + this->plater_->get_notification_manager()->set_download_progress_percentage((float)std::stoi(into_u8(evt.GetString())) / 100.f ); + }); + + Bind(EVT_SLIC3R_APP_DOWNLOAD_FAILED, [this](const wxCommandEvent& evt) { + if (this->plater_ != nullptr) + this->plater_->get_notification_manager()->close_notification_of_type(NotificationType::AppDownload); + show_error(nullptr, evt.GetString()); + }); + + } else { #ifdef __WXMSW__ @@ -2282,7 +2278,8 @@ void GUI_App::add_config_menu(wxMenuBar *menu) local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); local_menu->Append(config_id_base + ConfigMenuSnapshots, _L("&Configuration Snapshots") + dots, _L("Inspect / activate configuration snapshots")); local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _L("Take Configuration &Snapshot"), _L("Capture a configuration snapshot")); - local_menu->Append(config_id_base + ConfigMenuUpdate, _L("Check for Configuration Updates"), _L("Check for configuration updates")); + local_menu->Append(config_id_base + ConfigMenuUpdateConf, _L("Check for Configuration Updates"), _L("Check for configuration updates")); + local_menu->Append(config_id_base + ConfigMenuUpdateApp, _L("Check for Application Updates"), _L("Check for new version of application")); #if defined(__linux__) && defined(SLIC3R_DESKTOP_INTEGRATION) //if (DesktopIntegrationDialog::integration_possible()) local_menu->Append(config_id_base + ConfigMenuDesktopIntegration, _L("Desktop Integration"), _L("Desktop Integration")); @@ -2324,9 +2321,12 @@ void GUI_App::add_config_menu(wxMenuBar *menu) case ConfigMenuWizard: run_wizard(ConfigWizard::RR_USER); break; - case ConfigMenuUpdate: + case ConfigMenuUpdateConf: check_updates(true); break; + case ConfigMenuUpdateApp: + app_updater(true); + break; #ifdef __linux__ case ConfigMenuDesktopIntegration: show_desktop_integration_dialog(); @@ -3266,5 +3266,108 @@ void GUI_App::associate_gcode_files() } #endif // __WXMSW__ + +void GUI_App::on_version_read(wxCommandEvent& evt) +{ + + app_config->set("version_online", into_u8(evt.GetString())); + app_config->save(); + std::string opt = app_config->get("notify_release"); + if (this->plater_ == nullptr || (opt != "all" && opt != "release")) { + return; + } + if (*Semver::parse(SLIC3R_VERSION) >= *Semver::parse(into_u8(evt.GetString()))) { + return; + } + // notification + /* + this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable + , NotificationManager::NotificationLevel::ImportantNotificationLevel + , Slic3r::format(_u8L("New release version %1% is available."), evt.GetString()) + , _u8L("See Download page.") + , [](wxEvtHandler* evnthndlr) {wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); return true; } + ); + */ + // updater + + app_updater(false); +} + +void GUI_App::app_updater(bool from_user) +{ + DownloadAppData app_data = m_app_updater->get_app_data(); + + if (from_user && (!app_data.version || *app_data.version <= *Semver::parse(SLIC3R_VERSION))) + { + BOOST_LOG_TRIVIAL(info) << "There is no newer version online."; + MsgNoAppUpdates no_update_dialog; + no_update_dialog.ShowModal(); + return; + + } + + assert(!app_data.url.empty()); + assert(!app_data.target_path.empty()); + + // dialog with new version info + AppUpdateAvailableDialog dialog(*Semver::parse(SLIC3R_VERSION), *app_data.version); + auto dialog_result = dialog.ShowModal(); + // checkbox "do not show again" + if (dialog.disable_version_check()) { + app_config->set("notify_release", "none"); + } + // Doesn't wish to update + if (dialog_result != wxID_OK) { + return; + } + // dialog with new version download (installer or app dependent on system) + AppUpdateDownloadDialog dwnld_dlg(*app_data.version); + dialog_result = dwnld_dlg.ShowModal(); + // Doesn't wish to download + if (dialog_result != wxID_OK) { + return; + } + // Save as dialog + if (dwnld_dlg.select_download_path()) { + std::string extension = app_data.target_path.filename().extension().string(); + wxString wildcard; + if (!extension.empty()) { + extension = extension.substr(1); + wxString wxext = boost::nowide::widen(extension); + wildcard = GUI::format_wxstr("%1% Files (*.%2%)|*.%2%", wxext.Upper(), wxext); + } + wxFileDialog save_dlg( + plater() + , _L("Save as:") + , boost::nowide::widen(m_app_updater->get_default_dest_folder()) + , boost::nowide::widen(AppUpdater::get_filename_from_url(app_data.url)) + , wildcard + , wxFD_SAVE | wxFD_OVERWRITE_PROMPT + ); + // Canceled + if (save_dlg.ShowModal() != wxID_OK) { + return; + // set path + } else { + app_data.target_path = boost::filesystem::path(save_dlg.GetPath().ToUTF8().data()); + } + } + if (boost::filesystem::exists(app_data.target_path)) + { + BOOST_LOG_TRIVIAL(error) << "App download: File on target path already exists and will be overwritten. Path: " << app_data.target_path; + } + // start download + this->plater_->get_notification_manager()->push_download_progress_notification(_utf8("Download"), std::bind(&AppUpdater::cancel_callback, this->m_app_updater.get())); + app_data.start_after = dwnld_dlg.run_after_download(); + m_app_updater->set_app_data(std::move(app_data)); + m_app_updater->sync_download(); +} + +void GUI_App::app_version_check() +{ + std::string version_check_url = app_config->version_check_url(); + m_app_updater->sync_version(version_check_url); +} + } // GUI } //Slic3r diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index f93728d2e3..4df41c607d 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -32,6 +32,7 @@ class PresetUpdater; class ModelObject; class PrintHostJobQueue; class Model; +class AppUpdater; namespace GUI{ @@ -81,7 +82,8 @@ enum ConfigMenuIDs { ConfigMenuWizard, ConfigMenuSnapshots, ConfigMenuTakeSnapshot, - ConfigMenuUpdate, + ConfigMenuUpdateConf, + ConfigMenuUpdateApp, ConfigMenuDesktopIntegration, ConfigMenuPreferences, ConfigMenuModeSimple, @@ -156,6 +158,7 @@ private: std::unique_ptr m_imgui; std::unique_ptr m_printhost_job_queue; std::unique_ptr m_other_instance_message_handler; + std::unique_ptr m_app_updater; std::unique_ptr m_single_instance_checker; std::string m_instance_hash_string; size_t m_instance_hash_int; @@ -360,6 +363,11 @@ private: // Returns true if the configuration is fine. // Returns true if the configuration is not compatible and the user decided to rather close the slicer instead of reconfiguring. bool check_updates(const bool verbose); + void on_version_read(wxCommandEvent& evt); + // if the data from version file are already downloaded, shows dialogs to start download of new version of app + void app_updater(bool from_user); + // inititate read of version file online in separate thread + void app_version_check(); bool m_datadir_redefined { false }; }; diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 6e9bc267fd..9374ea17fa 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -819,6 +819,120 @@ void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgu imgui.text(text.c_str()); } } +//------ProgressBarWithCancelNotification---------------- + +void NotificationManager::ProgressBarWithCancelNotification::render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + if (m_percentage < 0.f || m_percentage >= 1.f) + render_close_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + else + render_cancel_button_inner(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} +void NotificationManager::ProgressBarWithCancelNotification::render_close_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CloseNotifButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CloseNotifHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + close(); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + close(); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::ProgressBarWithCancelNotification::render_cancel_button_inner(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_state == EState::FadingOut, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + + std::string button_text; + button_text = ImGui::CancelButton; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), + ImVec2(win_pos.x, win_pos.y + win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0)), + true)) + { + button_text = ImGui::CancelHoverButton; + } + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.75f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + on_cancel_button(); + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.125, win_size.y - (m_minimize_b_visible ? 2 * m_line_height : 0))) + { + on_cancel_button(); + } + ImGui::PopStyleColor(5); + +} + +void NotificationManager::ProgressBarWithCancelNotification::on_cancel_button() +{ + if (m_cancel_callback) { + if (m_cancel_callback()) { + close(); + } + } +} + +void NotificationManager::ProgressBarWithCancelNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ProgressBarNotification::render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + std::string text; + if (m_percentage < 0.f) { + text = _u8L("ERROR"); + } else { + std::stringstream stream; + stream << std::fixed << std::setprecision(2) << (int)(m_percentage * 100) << "%"; + text = stream.str(); + } + ImGui::SetCursorPosX(m_left_indentation); + ImGui::SetCursorPosY(win_size_y / 2 + win_size_y / 6 - (m_multiline ? 0 : m_line_height / 4)); + imgui.text(text.c_str()); +} + //------PrintHostUploadNotification---------------- void NotificationManager::PrintHostUploadNotification::init() { @@ -1653,11 +1767,37 @@ void NotificationManager::upload_job_notification_show_error(int id, const std:: } } +void NotificationManager::push_download_progress_notification(const std::string& text, std::function cancel_callback) +{ + // If already exists, change text and reset progress + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::AppDownload) { + notification->update({ NotificationType::AppDownload, NotificationLevel::ProgressBarNotificationLevel, 10, text }); + auto* pbwcn = dynamic_cast(notification.get()); + pbwcn->set_percentage(0.0f); + pbwcn->set_cancel_callback(cancel_callback); + return; + } + } + // push new one + NotificationData data{ NotificationType::AppDownload, NotificationLevel::ProgressBarNotificationLevel, 10, text }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, cancel_callback), 0); +} +void NotificationManager::set_download_progress_percentage(float percentage) +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::AppDownload) { + dynamic_cast(notification.get())->set_percentage(percentage); + return; + } + } +} + void NotificationManager::init_slicing_progress_notification(std::function cancel_callback) { for (std::unique_ptr& notification : m_pop_notifications) { if (notification->get_type() == NotificationType::SlicingProgress) { - dynamic_cast(notification.get())->set_cancel_callback(cancel_callback); + dynamic_cast(notification.get())->set_cancel_callback(cancel_callback); return; } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 9265cb55e4..6d0ac9ed44 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -78,6 +78,8 @@ enum class NotificationType ProgressBar, // Progress bar with info from Print Host Upload Queue dialog. PrintHostUpload, + // Progress bar of download next version app. + AppDownload, // Progress bar with cancel button, cannot be closed // On end of slicing and G-code processing (the full G-code preview is available), // contains a hyperlink to export the G-code to a removable media or hdd. @@ -203,6 +205,9 @@ public: void set_upload_job_notification_percentage(int id, const std::string& filename, const std::string& host, float percentage); void upload_job_notification_show_canceled(int id, const std::string& filename, const std::string& host); void upload_job_notification_show_error(int id, const std::string& filename, const std::string& host); + // Download App progress + void push_download_progress_notification(const std::string& text, std::function cancel_callback); + void set_download_progress_percentage(float percentage); // slicing progress void init_slicing_progress_notification(std::function cancel_callback); void set_slicing_progress_began(); @@ -459,7 +464,34 @@ private: }; - + class ProgressBarWithCancelNotification : public ProgressBarNotification + { + public: + ProgressBarWithCancelNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, std::function cancel_callback) + : ProgressBarNotification(n, id_provider, evt_handler) + , m_cancel_callback(cancel_callback) + { + } + void set_percentage(float percent) override { m_percentage = percent; if(m_percentage >= 1.f) m_state = EState::FadingOut; else m_state = EState::NotFading; } + void set_cancel_callback(std::function cancel_callback) { m_cancel_callback = cancel_callback; } + protected: + void render_close_button(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void render_close_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_cancel_button_inner(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + void render_bar(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + void on_cancel_button(); + + std::function m_cancel_callback; + long m_hover_time{ 0 }; + }; class PrintHostUploadNotification : public ProgressBarNotification { diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index f80975ce52..031d64037a 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -88,6 +88,89 @@ bool MsgUpdateSlic3r::disable_version_check() const return cbox->GetValue(); } + wxSize AppUpdateAvailableDialog::AUAD_size; +// AppUpdater +AppUpdateAvailableDialog::AppUpdateAvailableDialog(const Semver& ver_current, const Semver& ver_online) + : MsgDialog(nullptr, _(L("App Update available")), wxString::Format(_(L("New version of %s is available.\nDo you wish to download it?")), SLIC3R_APP_NAME)) +{ + auto* versions = new wxFlexGridSizer(1, 0, VERT_SPACING); + versions->Add(new wxStaticText(this, wxID_ANY, _(L("Current version:")))); + versions->Add(new wxStaticText(this, wxID_ANY, ver_current.to_string())); + versions->Add(new wxStaticText(this, wxID_ANY, _(L("New version:")))); + versions->Add(new wxStaticText(this, wxID_ANY, ver_online.to_string())); + content_sizer->Add(versions); + content_sizer->AddSpacer(VERT_SPACING); + + cbox = new wxCheckBox(this, wxID_ANY, _(L("Don't notify about new releases any more"))); + content_sizer->Add(cbox); + content_sizer->AddSpacer(VERT_SPACING); + + AUAD_size = content_sizer->GetSize(); + + + add_button(wxID_CANCEL); + + if (auto* btn_ok = get_button(wxID_OK); btn_ok != NULL) { + btn_ok->SetLabel(_L("Next")); + } + + finalize(); +} + +AppUpdateAvailableDialog::~AppUpdateAvailableDialog() {} + + +bool AppUpdateAvailableDialog::disable_version_check() const +{ + return cbox->GetValue(); +} + +// AppUpdateDownloadDialog +AppUpdateDownloadDialog::AppUpdateDownloadDialog( const Semver& ver_online) + : MsgDialog(nullptr, _(L("App Update download")), wxString::Format(_(L("New version of %s is available.")), SLIC3R_APP_NAME)) +{ + + auto* versions = new wxFlexGridSizer(2, 0, VERT_SPACING); + versions->Add(new wxStaticText(this, wxID_ANY, _(L("New version:")))); + versions->Add(new wxStaticText(this, wxID_ANY, ver_online.to_string())); + content_sizer->Add(versions); + content_sizer->AddSpacer(VERT_SPACING); +#ifndef __linux__ + cbox_run = new wxCheckBox(this, wxID_ANY, _(L("Run installer after download."))); + content_sizer->Add(cbox_run); +#endif + content_sizer->AddSpacer(VERT_SPACING); + cbox_path = new wxCheckBox(this, wxID_ANY, _(L("Select path for downloaded file."))); + content_sizer->Add(cbox_path); + content_sizer->AddSpacer(VERT_SPACING); + + content_sizer->SetMinSize(AppUpdateAvailableDialog::AUAD_size); + + add_button(wxID_CANCEL); + + if (auto* btn_ok = get_button(wxID_OK); btn_ok != NULL) { + btn_ok->SetLabel(_L("Download")); + } + + finalize(); +} + +AppUpdateDownloadDialog::~AppUpdateDownloadDialog() {} + + +bool AppUpdateDownloadDialog::run_after_download() const +{ +#ifndef __linux__ + return cbox_run->GetValue(); +#endif + return false; +} + +bool AppUpdateDownloadDialog::select_download_path() const +{ + return cbox_path->GetValue(); +} + // MsgUpdateConfig MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_before_wizard/* = false*/) : @@ -314,5 +397,25 @@ MsgNoUpdates::MsgNoUpdates() : MsgNoUpdates::~MsgNoUpdates() {} +// MsgNoAppUpdates +MsgNoAppUpdates::MsgNoAppUpdates() : + MsgDialog(nullptr, _(L("App update")), _(L("No updates available")), wxICON_ERROR | wxOK) +{ + + auto* text = new wxStaticText(this, wxID_ANY, wxString::Format( + _(L( + "%s has no version updates available." + )), + SLIC3R_APP_NAME + )); + text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); + content_sizer->Add(text); + content_sizer->AddSpacer(VERT_SPACING); + + finalize(); +} + +MsgNoAppUpdates::~MsgNoAppUpdates() {} + } } diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index 435a8ccbd8..fbc21a558f 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -37,6 +37,42 @@ private: }; +class AppUpdateAvailableDialog : public MsgDialog +{ +public: + AppUpdateAvailableDialog(const Semver& ver_current, const Semver& ver_online); + AppUpdateAvailableDialog(AppUpdateAvailableDialog&&) = delete; + AppUpdateAvailableDialog(const AppUpdateAvailableDialog&) = delete; + AppUpdateAvailableDialog& operator=(AppUpdateAvailableDialog&&) = delete; + AppUpdateAvailableDialog& operator=(const AppUpdateAvailableDialog&) = delete; + virtual ~AppUpdateAvailableDialog(); + + // Tells whether the user checked the "don't bother me again" checkbox + bool disable_version_check() const; + static wxSize AUAD_size; +private: + wxCheckBox* cbox; +}; + +class AppUpdateDownloadDialog : public MsgDialog +{ +public: + AppUpdateDownloadDialog(const Semver& ver_online); + AppUpdateDownloadDialog(AppUpdateDownloadDialog&&) = delete; + AppUpdateDownloadDialog(const AppUpdateDownloadDialog&) = delete; + AppUpdateDownloadDialog& operator=(AppUpdateDownloadDialog&&) = delete; + AppUpdateDownloadDialog& operator=(const AppUpdateDownloadDialog&) = delete; + virtual ~AppUpdateDownloadDialog(); + + // Tells whether the user checked the "don't bother me again" checkbox + bool run_after_download() const; + bool select_download_path() const; + +private: + wxCheckBox* cbox_run; + wxCheckBox* cbox_path; +}; + // Confirmation dialog informing about configuration update. Lists updated bundles & their versions. class MsgUpdateConfig : public MsgDialog { @@ -129,6 +165,18 @@ public: ~MsgNoUpdates(); }; +// Informs about absence of new version online. +class MsgNoAppUpdates : public MsgDialog +{ +public: + MsgNoAppUpdates(); + MsgNoAppUpdates(MsgNoAppUpdates&&) = delete; + MsgNoAppUpdates(const MsgNoAppUpdates&) = delete; + MsgNoAppUpdates& operator=(MsgNoUpdates&&) = delete; + MsgNoAppUpdates& operator=(const MsgNoAppUpdates&) = delete; + ~MsgNoAppUpdates(); +}; + } } diff --git a/src/slic3r/Utils/AppUpdater.cpp b/src/slic3r/Utils/AppUpdater.cpp new file mode 100644 index 0000000000..3d5e7a8ae7 --- /dev/null +++ b/src/slic3r/Utils/AppUpdater.cpp @@ -0,0 +1,694 @@ +#include "AppUpdater.hpp" + +#include +#include +#include +#include + +#include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/Utils/Http.hpp" + +#ifdef _WIN32 +#include +#include +#include +#include +#include +#endif // _WIN32 + + +namespace Slic3r { + +namespace { + +#ifdef _WIN32 + bool run_file(const boost::filesystem::path& path) + { + // find updater exe + if (boost::filesystem::exists(path)) { + // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst + + // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. + std::wstring wcmd = L"\"" + path.wstring(); + + // additional information + STARTUPINFOW si; + PROCESS_INFORMATION pi; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // start the program up + if (CreateProcessW(NULL, // the path + wcmd.data(), // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) + )) { + // Close process and thread handles. + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return true; + } + else { + BOOST_LOG_TRIVIAL(error) << "Failed to run " << wcmd; + } + } + return false; + } + + std::string get_downloads_path() + { + std::string ret; + PWSTR path = NULL; + HRESULT hr = SHGetKnownFolderPath(FOLDERID_Downloads, 0, NULL, &path); + if (SUCCEEDED(hr)) { + ret = boost::nowide::narrow(path); + } + CoTaskMemFree(path); + return ret; + } + + bool open_folder(const boost::filesystem::path& path) + { + // this command can run the installer exe as well, but is it better than CreateProcessW? + ShellExecuteW(NULL, NULL, path.wstring().c_str(), NULL, NULL, SW_SHOWNORMAL); + return true; + } + +#elif __linux__ + bool run_file(const boost::filesystem::path& path) + { + return false; + } + + std::string get_downloads_path() + { + wxString command = "xdg-user-dir DOWNLOAD"; + wxArrayString output; + + //Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(command, output, 0, &exec_env); + + } else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(command, output); + } + if (output.GetCount() > 0) { + return boost::nowide::narrow(output[0]); + } + return std::string(); + } + + bool open_folder(const boost::filesystem::path& path) + { + if (boost::filesystem::is_directory(path)) { + const char *argv[] = { "xdg-open", path.string().c_str(), nullptr }; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + + } else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } + return true; + } + return false; + } + +#elif __APPLE__ + bool run_file(const boost::filesystem::path& path) + { + if (boost::filesystem::exists(path)) { + // attach downloaded dmg file + const char* argv1[] = { "hdiutil", "attach", path.string().c_str(), nullptr }; + ::wxExecute(const_cast(argv1), wxEXEC_ASYNC, nullptr); + // open inside attached as a folder in finder + const char* argv2[] = { "open", "/Volumes/PrusaSlicer", nullptr }; + ::wxExecute(const_cast(argv2), wxEXEC_ASYNC, nullptr); + return true; + } + return false; + } + + std::string get_downloads_path() + { + // call objective-c implementation + return get_downloads_path_mac(); + } + + bool open_folder(const boost::filesystem::path& path) + { + + if (boost::filesystem::is_directory(path)) { + const char* argv[] = { "open", path.string().c_str(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); + return true; + } + return false; + } +#endif +} // namespace + +wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, wxCommandEvent); +wxDEFINE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_FAILED, wxCommandEvent); + +// priv handles all operations in separate thread +// 1) download version file and parse it. +// 2) download new app file and open in folder / run it. +struct AppUpdater::priv { + priv(); + // Download file. What happens with the data is specified in completefn. + bool http_get_file(const std::string& url + , size_t size_limit + , std::function progress_fn + , std::function completefn + , std::string& error_message + ) const; + + // Download installer / app + boost::filesystem::path download_file(const DownloadAppData& data) const; + // Run file in m_last_dest_path + bool run_downloaded_file(boost::filesystem::path path); + // gets version file via http + void version_check(const std::string& version_check_url); +#if 0 + // parsing of Prusaslicer.version2 + void parse_version_string_old(const std::string& body) const; +#endif + // parses ini tree of version file, saves to m_online_version_data and queue event(s) to UI + void parse_version_string(const std::string& body); + // thread + std::thread m_thread; + std::atomic_bool m_cancel; + std::mutex m_data_mutex; + // read only variable used to init m_online_version_data.target_path + boost::filesystem::path m_default_dest_folder; // readonly + // DownloadAppData read / write needs to be locked by m_data_mutex + DownloadAppData m_online_version_data; + DownloadAppData get_app_data(); + void set_app_data(DownloadAppData data); +}; + +AppUpdater::priv::priv() : + m_cancel (false) +#ifdef __linux__ + , m_default_dest_folder (boost::filesystem::path("/tmp")) +#else + , m_default_dest_folder (boost::filesystem::path(data_dir()) / "cache") +#endif //_WIN32 +{ + boost::filesystem::path downloads_path = boost::filesystem::path(get_downloads_path()); + if (!downloads_path.empty()) { + m_default_dest_folder = std::move(downloads_path); + } + BOOST_LOG_TRIVIAL(error) << "Default download path: " << m_default_dest_folder; + +} + +bool AppUpdater::priv::http_get_file(const std::string& url, size_t size_limit, std::function progress_fn, std::function complete_fn, std::string& error_message) const +{ + bool res = false; + Http::get(url) + .size_limit(size_limit) + .on_progress([&, progress_fn](Http::Progress progress, bool& cancel) { + // progress function returns true as success (to continue) + cancel = (this->m_cancel ? true : !progress_fn(std::move(progress))); + if (cancel) { + error_message = GUI::format("Error getting: `%1%`: Download was canceled.", + url); + BOOST_LOG_TRIVIAL(debug) << "AppUpdater::priv::http_get_file message: "<< error_message; + } + }) + .on_error([&](std::string body, std::string error, unsigned http_status) { + error_message = GUI::format("Error getting: `%1%`: HTTP %2%, %3%", + url, + http_status, + error); + BOOST_LOG_TRIVIAL(error) << error_message; + }) + .on_complete([&](std::string body, unsigned /* http_status */) { + assert(complete_fn != nullptr); + res = complete_fn(body, error_message); + }) + .perform_sync(); + + return res; +} + +boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& data) const +{ + boost::filesystem::path dest_path; + size_t last_gui_progress = 0; + size_t expected_size = data.size; + dest_path = data.target_path; + assert(!dest_path.empty()); + if (dest_path.empty()) + { + BOOST_LOG_TRIVIAL(error) << "Download from " << data.url << " could not start. Destination path is empty."; + return boost::filesystem::path(); + } + std::string error_message; + bool res = http_get_file(data.url, 80 * 1024 * 1024 //TODO: what value here + // on_progress + , [&last_gui_progress, expected_size](Http::Progress progress) { + // size check + if (progress.dltotal > 0 && progress.dltotal > expected_size) { + std::string message = GUI::format("Downloading new %1% has failed. The file has incorrect file size. Aborting download.\nExpected size: %2%\nDownload size: %3%", SLIC3R_APP_NAME, expected_size, progress.dltotal); + BOOST_LOG_TRIVIAL(error) << message; + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_FAILED); + evt->SetString(message); + GUI::wxGetApp().QueueEvent(evt); + return false; + } else if (progress.dltotal > 0 && progress.dltotal < expected_size) { + BOOST_LOG_TRIVIAL(error) << GUI::format("Downloading new %1% has incorrect size. The download will continue. \nExpected size: %2%\nDownload size: %3%", SLIC3R_APP_NAME, expected_size, progress.dltotal);; + } + // progress event + size_t gui_progress = progress.dltotal > 0 ? 100 * progress.dlnow / progress.dltotal : 0; + //BOOST_LOG_TRIVIAL(error) << "App download " << gui_progress << "% " << progress.dlnow << " of " << progress.dltotal; + if (last_gui_progress < gui_progress && (last_gui_progress != 0 || gui_progress != 100)) { + last_gui_progress = gui_progress; + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS); + evt->SetString(GUI::from_u8(std::to_string(gui_progress))); + GUI::wxGetApp().QueueEvent(evt); + } + return true; + } + // on_complete + , [dest_path, expected_size](std::string body, std::string& error_message){ + // Size check. Does always 1 char == 1 byte? + size_t body_size = body.size(); + if (body_size != expected_size) { + BOOST_LOG_TRIVIAL(error) << "Downloaded file has wrong size. Expected size: " << expected_size << " Downloaded size: " << body_size; + return false; + } + boost::filesystem::path tmp_path = dest_path; + tmp_path += format(".%1%%2%", get_current_pid(), ".download"); + try + { + boost::filesystem::fstream file(tmp_path, std::ios::out | std::ios::binary | std::ios::trunc); + file.write(body.c_str(), body.size()); + file.close(); + boost::filesystem::rename(tmp_path, dest_path); + } + catch (const std::exception&) + { + BOOST_LOG_TRIVIAL(error) << "Failed to write and move " << tmp_path << " to " << dest_path; + return false; + } + return true; + } + , error_message + ); + if (!res) + { + if (this->m_cancel) + { + BOOST_LOG_TRIVIAL(error) << error_message; + } else { + std::string message = GUI::format("Downloading new %1% has failed:\n%2%", SLIC3R_APP_NAME, error_message); + BOOST_LOG_TRIVIAL(error) << message; + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_FAILED); + evt->SetString(message); + GUI::wxGetApp().QueueEvent(evt); + } + return boost::filesystem::path(); + } + + return dest_path; +} + +bool AppUpdater::priv::run_downloaded_file(boost::filesystem::path path) +{ + assert(!path.empty()); + bool res = run_file(path); + BOOST_LOG_TRIVIAL(error) << "Running "<< path.string() << " was " << res; + return res; +} + +void AppUpdater::priv::version_check(const std::string& version_check_url) +{ + assert(!version_check_url.empty()); + std::string error_message; + bool res = http_get_file(version_check_url, 1024 + // on_progress + , [](Http::Progress progress) { return true; } + // on_complete + , [&](std::string body, std::string& error_message) { + boost::trim(body); + parse_version_string(body); + return true; + } + , error_message + ); + if (!res) + BOOST_LOG_TRIVIAL(error) << "Failed to download version file: " << error_message; +} + +void AppUpdater::priv::parse_version_string(const std::string& body) +{ + size_t start = body.find('['); + if (start == std::string::npos) { +#if 0 + BOOST_LOG_TRIVIAL(error) << "Could not find property tree in version file. Starting old parsing."; + parse_version_string_old(body); + return; +#endif // 0 + BOOST_LOG_TRIVIAL(error) << "Could not find property tree in version file. Checking for application update has failed."; + return; + } + std::string tree_string = body.substr(start); + boost::property_tree::ptree tree; + std::stringstream ss(tree_string); + try { + boost::property_tree::read_ini(ss, tree); + } catch (const boost::property_tree::ini_parser::ini_parser_error& err) { + //throw Slic3r::RuntimeError(format("Failed reading version file property tree Error: \"%1%\" at line %2%. \nTree:\n%3%", err.message(), err.line(), tree_string).c_str()); + BOOST_LOG_TRIVIAL(error) << format("Failed reading version file property tree Error: \"%1%\" at line %2%. \nTree:\n%3%", err.message(), err.line(), tree_string); + return; + } + + DownloadAppData new_data; + + for (const auto& section : tree) { + std::string section_name = section.first; + + // online release version info + if (section_name == +#ifdef _WIN32 + "release:win64" +#elif __linux__ + "release:linux" +#else + "release:osx" +#endif + ) { + for (const auto& data : section.second) { + if (data.first == "url") { + new_data.url = data.second.data(); + new_data.target_path = m_default_dest_folder / AppUpdater::get_filename_from_url(new_data.url); + BOOST_LOG_TRIVIAL(error) << format("parsing version string: url: %1%", new_data.url); + } else if (data.first == "size"){ + new_data.size = std::stoi(data.second.data()); + BOOST_LOG_TRIVIAL(error) << format("parsing version string: expected size: %1%", new_data.size); + } + } + } + + // released versions - to be send to UI layer + if (section_name == "common") { + std::vector prerelease_versions; + for (const auto& data : section.second) { + // release version - save and send to UI layer + if (data.first == "release") { + std::string version = data.second.data(); + boost::optional release_version = Semver::parse(version); + if (!release_version) { + BOOST_LOG_TRIVIAL(error) << format("Received invalid contents from version file: Not a correct semver: `%1%`", version); + return; + } + new_data.version = release_version; + // Send after all data is read + /* + BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); + evt->SetString(GUI::from_u8(version)); + GUI::wxGetApp().QueueEvent(evt); + */ + // prerelease versions - write down to be sorted and send to UI layer + } else if (data.first == "alpha") { + prerelease_versions.emplace_back(data.second.data()); + } else if (data.first == "beta") { + prerelease_versions.emplace_back(data.second.data()); + } else if (data.first == "rc") { + prerelease_versions.emplace_back(data.second.data()); + } + } + // find recent version that is newer than last full release. + boost::optional recent_version; + std::string version_string; + for (const std::string& ver_string : prerelease_versions) { + boost::optional ver = Semver::parse(ver_string); + if (ver && *new_data.version < *ver && ((recent_version && *recent_version < *ver) || !recent_version)) { + recent_version = ver; + version_string = ver_string; + } + } + // send prerelease version to UI layer + if (recent_version) { + BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version_string); + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE); + evt->SetString(GUI::from_u8(version_string)); + GUI::wxGetApp().QueueEvent(evt); + } + } + } + assert(!new_data.url.empty()); + assert(new_data.version); + // save + set_app_data(new_data); + // send + std::string version = new_data.version.get().to_string(); + BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); + evt->SetString(GUI::from_u8(version)); + GUI::wxGetApp().QueueEvent(evt); +} + +#if 0 +void AppUpdater::priv::parse_version_string_old(const std::string& body) const +{ + + // release version + std::string version; + const auto first_nl_pos = body.find_first_of("\n\r"); + if (first_nl_pos != std::string::npos) + version = body.substr(0, first_nl_pos); + else + version = body; + boost::optional release_version = Semver::parse(version); + if (!release_version) { + BOOST_LOG_TRIVIAL(error) << format("Received invalid contents from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); + return; + } + BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); + evt->SetString(GUI::from_u8(version)); + GUI::wxGetApp().QueueEvent(evt); + + // alpha / beta version + std::vector prerelease_versions; + size_t nexn_nl_pos = first_nl_pos; + while (nexn_nl_pos != std::string::npos && body.size() > nexn_nl_pos + 1) { + const auto last_nl_pos = nexn_nl_pos; + nexn_nl_pos = body.find_first_of("\n\r", last_nl_pos + 1); + std::string line; + if (nexn_nl_pos == std::string::npos) + line = body.substr(last_nl_pos + 1); + else + line = body.substr(last_nl_pos + 1, nexn_nl_pos - last_nl_pos - 1); + + // alpha + if (line.substr(0, 6) == "alpha=") { + version = line.substr(6); + if (!Semver::parse(version)) { + BOOST_LOG_TRIVIAL(error) << format("Received invalid contents for alpha release from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); + return; + } + prerelease_versions.emplace_back(version); + // beta + } + else if (line.substr(0, 5) == "beta=") { + version = line.substr(5); + if (!Semver::parse(version)) { + BOOST_LOG_TRIVIAL(error) << format("Received invalid contents for beta release from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); + return; + } + prerelease_versions.emplace_back(version); + } + } + // find recent version that is newer than last full release. + boost::optional recent_version; + for (const std::string& ver_string : prerelease_versions) { + boost::optional ver = Semver::parse(ver_string); + if (ver && *release_version < *ver && ((recent_version && *recent_version < *ver) || !recent_version)) { + recent_version = ver; + version = ver_string; + } + } + if (recent_version) { + BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE); + evt->SetString(GUI::from_u8(version)); + GUI::wxGetApp().QueueEvent(evt); + } +} +#endif // 0 + +DownloadAppData AppUpdater::priv::get_app_data() +{ + const std::lock_guard lock(m_data_mutex); + DownloadAppData ret_val(m_online_version_data); + return ret_val; +} + +void AppUpdater::priv::set_app_data(DownloadAppData data) +{ + const std::lock_guard lock(m_data_mutex); + m_online_version_data = data; +} + +AppUpdater::AppUpdater() + :p(new priv()) +{ +} +AppUpdater::~AppUpdater() +{ + if (p && p->m_thread.joinable()) { + // This will stop transfers being done by the thread, if any. + // Cancelling takes some time, but should complete soon enough. + p->m_cancel = true; + p->m_thread.join(); + } +} +void AppUpdater::sync_download() +{ + assert(p); + // join thread first - it could have been in sync_version + if (p->m_thread.joinable()) { + // This will stop transfers being done by the thread, if any. + // Cancelling takes some time, but should complete soon enough. + p->m_cancel = true; + p->m_thread.join(); + } + p->m_cancel = false; + + DownloadAppData input_data = p->get_app_data(); + assert(!input_data.url.empty()); + + p->m_thread = std::thread( + [this, input_data]() { + if (boost::filesystem::path dest_path = p->download_file(input_data); boost::filesystem::exists(dest_path)){ + if (input_data.start_after) { + p->run_downloaded_file(std::move(dest_path)); + } else { + open_folder(dest_path.parent_path()); + } + } + }); +} + +void AppUpdater::sync_version(const std::string& version_check_url) +{ + assert(p); + // join thread first - it could have been in sync_download + if (p->m_thread.joinable()) { + // This will stop transfers being done by the thread, if any. + // Cancelling takes some time, but should complete soon enough. + p->m_cancel = true; + p->m_thread.join(); + } + p->m_cancel = false; + p->m_thread = std::thread( + [this, version_check_url]() { + p->version_check(version_check_url); + }); +} + +void AppUpdater::cancel() +{ + p->m_cancel = true; +} +bool AppUpdater::cancel_callback() +{ + cancel(); + return true; +} + +std::string AppUpdater::get_default_dest_folder() +{ + return p->m_default_dest_folder.string(); +} + +std::string AppUpdater::get_filename_from_url(const std::string& url) +{ + size_t slash = url.rfind('/'); + return (slash != std::string::npos ? url.substr(slash + 1) : url); +} + +std::string AppUpdater::get_file_extension_from_url(const std::string& url) +{ + size_t dot = url.rfind('.'); + return (dot != std::string::npos ? url.substr(dot) : url); +} + +void AppUpdater::set_app_data(DownloadAppData data) +{ + p->set_app_data(std::move(data)); +} + +DownloadAppData AppUpdater::get_app_data() +{ + return p->get_app_data(); +} + + +} //namespace Slic3r diff --git a/src/slic3r/Utils/AppUpdater.hpp b/src/slic3r/Utils/AppUpdater.hpp new file mode 100644 index 0000000000..2cdcb900bb --- /dev/null +++ b/src/slic3r/Utils/AppUpdater.hpp @@ -0,0 +1,62 @@ +#ifndef slic3r_AppUpdate_hpp_ +#define slic3r_AppUpdate_hpp_ + +#include +#include +#include "libslic3r/Utils.hpp" +#include "wx/event.h" + +//class boost::filesystem::path; + +namespace Slic3r { + +#ifdef __APPLE__ +// implmented at MacUtils.mm +std::string get_downloads_path_mac(); +#endif //__APPLE__ + +struct DownloadAppData +{ + std::string url; + bool start_after; + boost::optional version; + size_t size; + boost::filesystem::path target_path; +}; + +class AppUpdater +{ +public: + AppUpdater(); + ~AppUpdater(); + AppUpdater(AppUpdater&&) = delete; + AppUpdater(const AppUpdater&) = delete; + AppUpdater& operator=(AppUpdater&&) = delete; + AppUpdater& operator=(const AppUpdater&) = delete; + + // downloads app file + void sync_download(); + // downloads version file + void sync_version(const std::string& version_check_url); + void cancel(); + bool cancel_callback(); + + std::string get_default_dest_folder(); + + static std::string get_filename_from_url(const std::string& url); + static std::string get_file_extension_from_url(const std::string& url); + + // mutex access + void set_app_data(DownloadAppData data); + DownloadAppData get_app_data(); +private: + struct priv; + std::unique_ptr p; +}; + +wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); +wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); +wxDECLARE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, wxCommandEvent); +wxDECLARE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_FAILED, wxCommandEvent); +} //namespace Slic3r +#endif diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp index 63c26f7217..68ddda0410 100644 --- a/src/slic3r/Utils/Http.cpp +++ b/src/slic3r/Utils/Http.cpp @@ -207,7 +207,6 @@ size_t Http::priv::writecb(void *data, size_t size, size_t nmemb, void *userp) auto self = static_cast(userp); const char *cdata = static_cast(data); const size_t realsize = size * nmemb; - const size_t limit = self->limit > 0 ? self->limit : DEFAULT_SIZE_LIMIT; if (self->buffer.size() + realsize > limit) { // This makes curl_easy_perform return CURLE_WRITE_ERROR diff --git a/src/slic3r/Utils/MacUtils.mm b/src/slic3r/Utils/MacUtils.mm new file mode 100644 index 0000000000..31a28f14e4 --- /dev/null +++ b/src/slic3r/Utils/MacUtils.mm @@ -0,0 +1,18 @@ +#import "AppUpdater.hpp" + +#import + +namespace Slic3r { + +// AppUpdater.hpp +std::string get_downloads_path_mac() +{ + // 1) + NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDownloadsDirectory, NSUserDomainMask, YES); + NSString * desktopPath = [paths objectAtIndex:0]; + return std::string([desktopPath UTF8String]); + // 2) + //[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Downloads"]]; + //return std::string(); +} +} diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 2b458df537..40f068155a 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -136,8 +136,8 @@ struct Updates }; -wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); -wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); +//wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); +//wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); struct PresetUpdater::priv { @@ -162,8 +162,8 @@ struct PresetUpdater::priv void set_download_prefs(AppConfig *app_config); bool get_file(const std::string &url, const fs::path &target_path) const; void prune_tmps() const; - void sync_version() const; - void parse_version_string(const std::string& body) const; +// void sync_version() const; +// void parse_version_string(const std::string& body) const; void sync_config(const VendorMap vendors); void check_install_indices() const; @@ -238,6 +238,8 @@ void PresetUpdater::priv::prune_tmps() const } } +// moved to app updater + /* // Get Slic3rPE version available online, save in AppConfig. void PresetUpdater::priv::sync_version() const { @@ -257,7 +259,7 @@ void PresetUpdater::priv::sync_version() const http_status, error); }) - .on_complete([&](std::string body, unsigned /* http_status */) { + .on_complete([&](std::string body, unsigned ) { boost::trim(body); parse_version_string(body); }) @@ -268,6 +270,7 @@ void PresetUpdater::priv::sync_version() const // Version string must contain release version on first line. Follows non-mandatory alpha / beta releases on following lines (alpha=2.0.0-alpha1). void PresetUpdater::priv::parse_version_string(const std::string& body) const { + // release version std::string version; const auto first_nl_pos = body.find_first_of("\n\r"); @@ -331,8 +334,9 @@ void PresetUpdater::priv::parse_version_string(const std::string& body) const evt->SetString(GUI::from_u8(version)); GUI::wxGetApp().QueueEvent(evt); } + } - +*/ // Download vendor indices. Also download new bundles if an index indicates there's a new one available. // Both are saved in cache. void PresetUpdater::priv::sync_config(const VendorMap vendors) @@ -743,7 +747,7 @@ void PresetUpdater::sync(PresetBundle *preset_bundle) p->thread = std::thread([this, vendors]() { this->p->prune_tmps(); - this->p->sync_version(); +// this->p->sync_version(); this->p->sync_config(std::move(vendors)); }); } diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 97d85a4eae..974a7dcfae 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,7 +65,7 @@ private: std::unique_ptr p; }; -wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); -wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); +//wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); +//wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); } #endif From 0e9a8f24c37eb3acdcdcef335d5446e5ad48e417 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 1 Feb 2022 13:44:40 +0100 Subject: [PATCH 143/149] Added some missing includes (GCC 9.3, without PCH) --- src/slic3r/Utils/AppUpdater.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/Utils/AppUpdater.cpp b/src/slic3r/Utils/AppUpdater.cpp index 3d5e7a8ae7..8b3a2f9f02 100644 --- a/src/slic3r/Utils/AppUpdater.cpp +++ b/src/slic3r/Utils/AppUpdater.cpp @@ -1,7 +1,11 @@ #include "AppUpdater.hpp" +#include +#include + #include #include +#include #include #include From 5a6824273cc5d57ac0de4d62f028b1f8c9b9b70b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 10 Feb 2022 15:39:20 +0100 Subject: [PATCH 144/149] Comments from lm regarding previous commit --- src/slic3r/GUI/GUI_App.cpp | 4 +++- src/slic3r/Utils/AppUpdater.cpp | 31 ++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 3c0d52bd1e..4278766b44 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1242,7 +1242,7 @@ bool GUI_App::on_init_inner() preset_updater = new PresetUpdater(); Bind(EVT_SLIC3R_VERSION_ONLINE, &GUI_App::on_version_read, this); Bind(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, [this](const wxCommandEvent& evt) { - app_config->save(); + app_config->save();//lm:What is the purpose? if (this->plater_ != nullptr && app_config->get("notify_release") == "all") { std::string evt_string = into_u8(evt.GetString()); if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(evt_string)) { @@ -1257,6 +1257,7 @@ bool GUI_App::on_init_inner() } }); Bind(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, [this](const wxCommandEvent& evt) { + //lm:This does not force a render. The progress bar only updateswhen the mouse is moved. if (this->plater_ != nullptr) this->plater_->get_notification_manager()->set_download_progress_percentage((float)std::stoi(into_u8(evt.GetString())) / 100.f ); }); @@ -3354,6 +3355,7 @@ void GUI_App::app_updater(bool from_user) } if (boost::filesystem::exists(app_data.target_path)) { + //lm:UI confirmation dialog? BOOST_LOG_TRIVIAL(error) << "App download: File on target path already exists and will be overwritten. Path: " << app_data.target_path; } // start download diff --git a/src/slic3r/Utils/AppUpdater.cpp b/src/slic3r/Utils/AppUpdater.cpp index 8b3a2f9f02..26bf883de7 100644 --- a/src/slic3r/Utils/AppUpdater.cpp +++ b/src/slic3r/Utils/AppUpdater.cpp @@ -35,7 +35,7 @@ namespace { // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. - std::wstring wcmd = L"\"" + path.wstring(); + std::wstring wcmd = L"\"" + path.wstring(); //lm: closing quote? // additional information STARTUPINFOW si; @@ -64,7 +64,7 @@ namespace { return true; } else { - BOOST_LOG_TRIVIAL(error) << "Failed to run " << wcmd; + BOOST_LOG_TRIVIAL(error) << "Failed to run " << wcmd; //lm: maybe a UI error message? } } return false; @@ -86,6 +86,8 @@ namespace { { // this command can run the installer exe as well, but is it better than CreateProcessW? ShellExecuteW(NULL, NULL, path.wstring().c_str(), NULL, NULL, SW_SHOWNORMAL); + //lm:I would make it explicit that the folder should be opened. + //lm:Also, this always returns true. return true; } @@ -100,6 +102,9 @@ namespace { wxString command = "xdg-user-dir DOWNLOAD"; wxArrayString output; + //lm:It might be a good idea to make the following a separate function in GUI_Utils or something + // It is already used in four different places in almost the same way. + //Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, // because they may mess up the environment expected by the file manager. // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. @@ -131,7 +136,7 @@ namespace { ::wxExecute(command, output); } if (output.GetCount() > 0) { - return boost::nowide::narrow(output[0]); + return boost::nowide::narrow(output[0]); //lm:I would use wxString::ToUTF8(), although on Linux, nothing at all should work too. } return std::string(); } @@ -141,6 +146,8 @@ namespace { if (boost::filesystem::is_directory(path)) { const char *argv[] = { "xdg-open", path.string().c_str(), nullptr }; + //lm:This is a copy of desktop_open_datadir_folder, it would make sense to instead call it. + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, // because they may mess up the environment expected by the file manager. // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. @@ -264,7 +271,7 @@ AppUpdater::priv::priv() : if (!downloads_path.empty()) { m_default_dest_folder = std::move(downloads_path); } - BOOST_LOG_TRIVIAL(error) << "Default download path: " << m_default_dest_folder; + BOOST_LOG_TRIVIAL(error) << "Default download path: " << m_default_dest_folder; //lm:Is this an error? } @@ -277,7 +284,7 @@ bool AppUpdater::priv::http_get_file(const std::string& url, size_t size_limit, // progress function returns true as success (to continue) cancel = (this->m_cancel ? true : !progress_fn(std::move(progress))); if (cancel) { - error_message = GUI::format("Error getting: `%1%`: Download was canceled.", + error_message = GUI::format("Error getting: `%1%`: Download was canceled.", //lm:typo url); BOOST_LOG_TRIVIAL(debug) << "AppUpdater::priv::http_get_file message: "<< error_message; } @@ -311,7 +318,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d return boost::filesystem::path(); } std::string error_message; - bool res = http_get_file(data.url, 80 * 1024 * 1024 //TODO: what value here + bool res = http_get_file(data.url, 80 * 1024 * 1024 //TODO: what value here //lm:I don't know, but larger. The binaries will grow. // on_progress , [&last_gui_progress, expected_size](Http::Progress progress) { // size check @@ -322,7 +329,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d evt->SetString(message); GUI::wxGetApp().QueueEvent(evt); return false; - } else if (progress.dltotal > 0 && progress.dltotal < expected_size) { + } else if (progress.dltotal > 0 && progress.dltotal < expected_size) { //lm:When will this happen? Is that not an error? BOOST_LOG_TRIVIAL(error) << GUI::format("Downloading new %1% has incorrect size. The download will continue. \nExpected size: %2%\nDownload size: %3%", SLIC3R_APP_NAME, expected_size, progress.dltotal);; } // progress event @@ -341,6 +348,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d // Size check. Does always 1 char == 1 byte? size_t body_size = body.size(); if (body_size != expected_size) { + //lm:UI message? BOOST_LOG_TRIVIAL(error) << "Downloaded file has wrong size. Expected size: " << expected_size << " Downloaded size: " << body_size; return false; } @@ -366,7 +374,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d { if (this->m_cancel) { - BOOST_LOG_TRIVIAL(error) << error_message; + BOOST_LOG_TRIVIAL(error) << error_message; //lm:Is this an error? } else { std::string message = GUI::format("Downloading new %1% has failed:\n%2%", SLIC3R_APP_NAME, error_message); BOOST_LOG_TRIVIAL(error) << message; @@ -403,6 +411,9 @@ void AppUpdater::priv::version_check(const std::string& version_check_url) } , error_message ); + //lm:In case the internet is not available, it will report no updates if run by user. + // We might save a flag that we don't know or try to run the version_check again, reporting + // the failure. if (!res) BOOST_LOG_TRIVIAL(error) << "Failed to download version file: " << error_message; } @@ -444,6 +455,8 @@ void AppUpdater::priv::parse_version_string(const std::string& body) #else "release:osx" #endif +//lm:Related to the ifdefs. We should also support BSD, which behaves similar to Linux in most cases. +// Unless you have a reason not to, I would consider doing _WIN32, elif __APPLE__, else ... Not just here. ) { for (const auto& data : section.second) { if (data.first == "url") { @@ -517,7 +530,7 @@ void AppUpdater::priv::parse_version_string(const std::string& body) GUI::wxGetApp().QueueEvent(evt); } -#if 0 +#if 0 //lm:is this meant to be ressurected? void AppUpdater::priv::parse_version_string_old(const std::string& body) const { From 1f362afb2422f7f32c917754a6ce55ef8df50200 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Fri, 18 Feb 2022 16:11:17 +0100 Subject: [PATCH 145/149] Fixes after CR Most important: Change Download dialog to select path there. Every user query triggers new download of version file, possibly stops former download (with dialog). Some functions refactored. --- src/slic3r/GUI/GUI.cpp | 165 ++++++++++++---- src/slic3r/GUI/GUI.hpp | 18 ++ src/slic3r/GUI/GUI_App.cpp | 111 +++-------- src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/NotificationManager.cpp | 7 +- src/slic3r/GUI/NotificationManager.hpp | 2 + src/slic3r/GUI/UpdateDialogs.cpp | 52 ++++- src/slic3r/GUI/UpdateDialogs.hpp | 8 +- src/slic3r/Utils/AppUpdater.cpp | 251 ++++++++----------------- src/slic3r/Utils/AppUpdater.hpp | 6 +- src/slic3r/Utils/PresetUpdater.cpp | 106 ----------- 11 files changed, 316 insertions(+), 412 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index a0b674e27e..1d32832aa4 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -476,50 +476,135 @@ void about() void desktop_open_datadir_folder() { + boost::filesystem::path path(data_dir()); + desktop_open_folder(std::move(path)); +} + +void desktop_open_folder(const boost::filesystem::path& path) +{ + if (!boost::filesystem::is_directory(path)) + return; + // Execute command to open a file explorer, platform dependent. - // FIXME: The const_casts aren't needed in wxWidgets 3.1, remove them when we upgrade. - - const auto path = data_dir(); #ifdef _WIN32 - const wxString widepath = from_u8(path); - const wchar_t *argv[] = { L"explorer", widepath.GetData(), nullptr }; - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); + const wxString widepath = path.wstring(); + const wchar_t* argv[] = { L"explorer", widepath.GetData(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #elif __APPLE__ - const char *argv[] = { "open", path.data(), nullptr }; - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); + const char* argv[] = { "open", path.string(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #else - const char *argv[] = { "xdg-open", path.data(), nullptr }; - - // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, - // because they may mess up the environment expected by the file manager. - // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. - if (wxGetEnv("APPIMAGE", nullptr)) { - // We're running from AppImage - wxEnvVariableHashMap env_vars; - wxGetEnvMap(&env_vars); - - env_vars.erase("APPIMAGE"); - env_vars.erase("APPDIR"); - env_vars.erase("LD_LIBRARY_PATH"); - env_vars.erase("LD_PRELOAD"); - env_vars.erase("UNION_PRELOAD"); - - wxExecuteEnv exec_env; - exec_env.env = std::move(env_vars); - - wxString owd; - if (wxGetEnv("OWD", &owd)) { - // This is the original work directory from which the AppImage image was run, - // set it as CWD for the child process: - exec_env.cwd = std::move(owd); - } - - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); - } else { - // Looks like we're NOT running from AppImage, we'll make no changes to the environment. - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); - } + const char* argv[] = { "xdg-open", path.string().c_str(), nullptr }; + desktop_execute(argv); #endif } -} } +#ifdef __linux__ +namespace { +wxExecuteEnv get_appimage_exec_env() +{ + // If we're running in an AppImage container, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + return exec_env; +} +} // namespace +void desktop_execute(const char* argv[]) +{ + if (sizeof(argv) == 0) + return; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxExecuteEnv exec_env = get_appimage_exec_env(); + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } + else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +} +void desktop_execute_get_result(wxString command, wxArrayString& output) +{ + output.Clear(); + //Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxExecuteEnv exec_env = get_appimage_exec_env(); + ::wxExecute(command, output, 0, &exec_env); + } else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(command, output); + } +} +#endif // __linux__ + +#ifdef _WIN32 +bool create_process(const boost::filesystem::path& path, const std::wstring& cmd_opt, std::string& error_msg) +{ + // find updater exe + if (boost::filesystem::exists(path)) { + // Using quoted string as mentioned in CreateProcessW docs. + std::wstring wcmd = L"\"" + path.wstring() + L"\""; + if (!cmd_opt.empty()) + wcmd += L" " + cmd_opt; + + // additional information + STARTUPINFOW si; + PROCESS_INFORMATION pi; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // start the program up + if (CreateProcessW(NULL, // the path + wcmd.data(), // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) + )) { + // Close process and thread handles. + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return true; + } + else + error_msg = "CreateProcessW failed to create process " + boost::nowide::narrow(path.wstring()); + } + else + error_msg = "Executable doesn't exists. Path: " + boost::nowide::narrow(path.wstring()); + return false; +} +#endif //_WIN32 + +} } // namespaces GUI / Slic3r diff --git a/src/slic3r/GUI/GUI.hpp b/src/slic3r/GUI/GUI.hpp index 20c8828785..2eb99e7bc7 100644 --- a/src/slic3r/GUI/GUI.hpp +++ b/src/slic3r/GUI/GUI.hpp @@ -80,6 +80,24 @@ boost::filesystem::path into_path(const wxString &str); extern void about(); // Ask the destop to open the datadir using the default file explorer. extern void desktop_open_datadir_folder(); +// Ask the destop to open the directory specified by path using the default file explorer. +void desktop_open_folder(const boost::filesystem::path& path); + +#ifdef __linux__ +// Calling wxExecute on Linux with proper handling of AppImage's env vars. +// argv example: { "xdg-open", path.c_str(), nullptr } +void desktop_execute(const char* argv[]); +void desktop_execute_get_result(wxString command, wxArrayString& output); +#endif // __linux__ + +#ifdef _WIN32 +// Call CreateProcessW to start external proccess on path +// returns true on success +// path should contain path to the process +// cmd_opt can be empty or contain command line options. Example: L"/silent" +// error_msg will contain error message if create_process return false +bool create_process(const boost::filesystem::path& path, const std::wstring& cmd_opt, std::string& error_msg); +#endif //_WIN32 } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 4278766b44..8110d42dd8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -431,50 +431,21 @@ bool static check_old_linux_datadir(const wxString& app_name) { } #endif - #ifdef _WIN32 +#if 0 // External Updater is replaced with AppUpdater.cpp static bool run_updater_win() { // find updater exe boost::filesystem::path path_updater = boost::dll::program_location().parent_path() / "prusaslicer-updater.exe"; - if (boost::filesystem::exists(path_updater)) { - // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst - - // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. - std::wstring wcmd = L"\"" + path_updater.wstring() + L"\" /silent"; - - // additional information - STARTUPINFOW si; - PROCESS_INFORMATION pi; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - if (CreateProcessW(NULL, // the path - wcmd.data(), // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) - )) { - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; - } else { - BOOST_LOG_TRIVIAL(error) << "Failed to start prusaslicer-updater.exe with command " << wcmd; - } - } - return false; + // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst + std::string msg; + bool res = create_process(path_updater, L"/silent", msg); + if (!res) + BOOST_LOG_TRIVIAL(error) << msg; + return res; } -#endif //_WIN32 +#endif // 0 +#endif // _WIN32 struct FileWildcards { std::string_view title; @@ -817,7 +788,7 @@ void GUI_App::post_init() CallAfter([this] { bool cw_showed = this->config_wizard_startup(); this->preset_updater->sync(preset_bundle); - this->app_version_check(); + this->app_version_check(false); if (! cw_showed) { // The CallAfter is needed as well, without it, GL extensions did not show. // Also, we only want to show this when the wizard does not, so the new user @@ -1242,7 +1213,6 @@ bool GUI_App::on_init_inner() preset_updater = new PresetUpdater(); Bind(EVT_SLIC3R_VERSION_ONLINE, &GUI_App::on_version_read, this); Bind(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, [this](const wxCommandEvent& evt) { - app_config->save();//lm:What is the purpose? if (this->plater_ != nullptr && app_config->get("notify_release") == "all") { std::string evt_string = into_u8(evt.GetString()); if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(evt_string)) { @@ -1265,10 +1235,13 @@ bool GUI_App::on_init_inner() Bind(EVT_SLIC3R_APP_DOWNLOAD_FAILED, [this](const wxCommandEvent& evt) { if (this->plater_ != nullptr) this->plater_->get_notification_manager()->close_notification_of_type(NotificationType::AppDownload); - show_error(nullptr, evt.GetString()); + if(!evt.GetString().IsEmpty()) + show_error(nullptr, evt.GetString()); }); - + Bind(EVT_SLIC3R_APP_OPEN_FAILED, [this](const wxCommandEvent& evt) { + show_error(nullptr, evt.GetString()); + }); } else { #ifdef __WXMSW__ @@ -2326,7 +2299,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu) check_updates(true); break; case ConfigMenuUpdateApp: - app_updater(true); + app_version_check(true); break; #ifdef __linux__ case ConfigMenuDesktopIntegration: @@ -3270,7 +3243,6 @@ void GUI_App::associate_gcode_files() void GUI_App::on_version_read(wxCommandEvent& evt) { - app_config->set("version_online", into_u8(evt.GetString())); app_config->save(); std::string opt = app_config->get("notify_release"); @@ -3290,8 +3262,8 @@ void GUI_App::on_version_read(wxCommandEvent& evt) ); */ // updater - - app_updater(false); + // read triggered_by_user that was set when calling GUI_App::app_version_check + app_updater(m_app_updater->get_triggered_by_user()); } void GUI_App::app_updater(bool from_user) @@ -3321,43 +3293,15 @@ void GUI_App::app_updater(bool from_user) if (dialog_result != wxID_OK) { return; } - // dialog with new version download (installer or app dependent on system) - AppUpdateDownloadDialog dwnld_dlg(*app_data.version); + // dialog with new version download (installer or app dependent on system) including path selection + AppUpdateDownloadDialog dwnld_dlg(*app_data.version, app_data.target_path); dialog_result = dwnld_dlg.ShowModal(); // Doesn't wish to download if (dialog_result != wxID_OK) { return; } - // Save as dialog - if (dwnld_dlg.select_download_path()) { - std::string extension = app_data.target_path.filename().extension().string(); - wxString wildcard; - if (!extension.empty()) { - extension = extension.substr(1); - wxString wxext = boost::nowide::widen(extension); - wildcard = GUI::format_wxstr("%1% Files (*.%2%)|*.%2%", wxext.Upper(), wxext); - } - wxFileDialog save_dlg( - plater() - , _L("Save as:") - , boost::nowide::widen(m_app_updater->get_default_dest_folder()) - , boost::nowide::widen(AppUpdater::get_filename_from_url(app_data.url)) - , wildcard - , wxFD_SAVE | wxFD_OVERWRITE_PROMPT - ); - // Canceled - if (save_dlg.ShowModal() != wxID_OK) { - return; - // set path - } else { - app_data.target_path = boost::filesystem::path(save_dlg.GetPath().ToUTF8().data()); - } - } - if (boost::filesystem::exists(app_data.target_path)) - { - //lm:UI confirmation dialog? - BOOST_LOG_TRIVIAL(error) << "App download: File on target path already exists and will be overwritten. Path: " << app_data.target_path; - } + app_data.target_path =dwnld_dlg.get_download_path(); + // start download this->plater_->get_notification_manager()->push_download_progress_notification(_utf8("Download"), std::bind(&AppUpdater::cancel_callback, this->m_app_updater.get())); app_data.start_after = dwnld_dlg.run_after_download(); @@ -3365,10 +3309,17 @@ void GUI_App::app_updater(bool from_user) m_app_updater->sync_download(); } -void GUI_App::app_version_check() +void GUI_App::app_version_check(bool from_user) { + if (from_user) { + if (m_app_updater->get_download_ongoing()) { + MessageDialog msgdlg(nullptr, _L("Download of new version is already ongoing. Do you wish to continue?"), _L("Notice"), wxYES_NO); + if (msgdlg.ShowModal() != wxID_YES) + return; + } + } std::string version_check_url = app_config->version_check_url(); - m_app_updater->sync_version(version_check_url); + m_app_updater->sync_version(version_check_url, from_user); } } // GUI diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 4df41c607d..ce07fb7723 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -367,7 +367,7 @@ private: // if the data from version file are already downloaded, shows dialogs to start download of new version of app void app_updater(bool from_user); // inititate read of version file online in separate thread - void app_version_check(); + void app_version_check(bool from_user); bool m_datadir_redefined { false }; }; diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 9374ea17fa..fc9e5f49c8 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1787,7 +1787,12 @@ void NotificationManager::set_download_progress_percentage(float percentage) { for (std::unique_ptr& notification : m_pop_notifications) { if (notification->get_type() == NotificationType::AppDownload) { - dynamic_cast(notification.get())->set_percentage(percentage); + ProgressBarWithCancelNotification* pbwcn = dynamic_cast(notification.get()); + // if this changes the percentage, it should be shown now + float percent_b4 = pbwcn->get_percentage(); + pbwcn->set_percentage(percentage); + if (pbwcn->get_percentage() != percent_b4) + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); return; } } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 6d0ac9ed44..72889c8549 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -442,6 +442,7 @@ private: ProgressBarNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler) : PopNotification(n, id_provider, evt_handler) { } virtual void set_percentage(float percent) { m_percentage = percent; } + float get_percentage() const { return m_percentage; } protected: virtual void init() override; virtual void render_text(ImGuiWrapper& imgui, @@ -474,6 +475,7 @@ private: } void set_percentage(float percent) override { m_percentage = percent; if(m_percentage >= 1.f) m_state = EState::FadingOut; else m_state = EState::NotFading; } void set_cancel_callback(std::function cancel_callback) { m_cancel_callback = cancel_callback; } + protected: void render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 031d64037a..531e99ea25 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -14,11 +14,13 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" +#include "../Utils/AppUpdater.hpp" #include "GUI.hpp" #include "GUI_App.hpp" #include "I18N.hpp" #include "ConfigWizard.hpp" #include "wxExtensions.hpp" +#include "format.hpp" namespace Slic3r { namespace GUI { @@ -126,23 +128,50 @@ bool AppUpdateAvailableDialog::disable_version_check() const } // AppUpdateDownloadDialog -AppUpdateDownloadDialog::AppUpdateDownloadDialog( const Semver& ver_online) +AppUpdateDownloadDialog::AppUpdateDownloadDialog( const Semver& ver_online, boost::filesystem::path& path) : MsgDialog(nullptr, _(L("App Update download")), wxString::Format(_(L("New version of %s is available.")), SLIC3R_APP_NAME)) { - auto* versions = new wxFlexGridSizer(2, 0, VERT_SPACING); versions->Add(new wxStaticText(this, wxID_ANY, _(L("New version:")))); versions->Add(new wxStaticText(this, wxID_ANY, ver_online.to_string())); content_sizer->Add(versions); content_sizer->AddSpacer(VERT_SPACING); #ifndef __linux__ - cbox_run = new wxCheckBox(this, wxID_ANY, _(L("Run installer after download."))); + cbox_run = new wxCheckBox(this, wxID_ANY, _(L("Run installer after download. (Otherwise file explorer will be opened)"))); content_sizer->Add(cbox_run); #endif content_sizer->AddSpacer(VERT_SPACING); - cbox_path = new wxCheckBox(this, wxID_ANY, _(L("Select path for downloaded file."))); - content_sizer->Add(cbox_path); content_sizer->AddSpacer(VERT_SPACING); + content_sizer->Add(new wxStaticText(this, wxID_ANY, _(L("Target path:")))); + content_sizer->AddSpacer(VERT_SPACING); + txtctrl_path = new wxTextCtrl(this, wxID_ANY, path.wstring()); + content_sizer->Add(txtctrl_path, 1, wxEXPAND); + content_sizer->AddSpacer(VERT_SPACING); + + wxButton* btn = new wxButton(this, wxID_ANY, _L("Select path")); + content_sizer->Add(btn/*, 1, wxEXPAND*/); + + // button to open file dialog + btn->Bind(wxEVT_BUTTON, ([this, path](wxCommandEvent& e) { + std::string extension = path.filename().extension().string(); + wxString wildcard; + if (!extension.empty()) { + extension = extension.substr(1); + wxString wxext = boost::nowide::widen(extension); + wildcard = GUI::format_wxstr("%1% Files (*.%2%)|*.%2%", wxext.Upper(), wxext); + } + wxFileDialog save_dlg( + this + , _L("Save as:") + , txtctrl_path->GetValue() + , boost::nowide::widen(AppUpdater::get_filename_from_url(txtctrl_path->GetValue().ToUTF8().data())) + , wildcard + , wxFD_SAVE | wxFD_OVERWRITE_PROMPT + ); + if (save_dlg.ShowModal() == wxID_OK) { + txtctrl_path->SetValue(save_dlg.GetPath()); + } + })); content_sizer->SetMinSize(AppUpdateAvailableDialog::AUAD_size); @@ -150,8 +179,17 @@ AppUpdateDownloadDialog::AppUpdateDownloadDialog( const Semver& ver_online) if (auto* btn_ok = get_button(wxID_OK); btn_ok != NULL) { btn_ok->SetLabel(_L("Download")); + btn_ok->Bind(wxEVT_BUTTON, ([this, path](wxCommandEvent& e){ + if (boost::filesystem::exists(boost::filesystem::path(txtctrl_path->GetValue().ToUTF8().data()))) { + MessageDialog msgdlg(nullptr, GUI::format_wxstr(_L("File %1% already exists. Do you wish to overwrite it?"), txtctrl_path->GetValue()),_L("Notice"), wxYES_NO); + if (msgdlg.ShowModal() != wxID_YES) + return; + } + this->EndModal(wxID_OK); + })); } + finalize(); } @@ -166,9 +204,9 @@ bool AppUpdateDownloadDialog::run_after_download() const return false; } -bool AppUpdateDownloadDialog::select_download_path() const +boost::filesystem::path AppUpdateDownloadDialog::get_download_path() const { - return cbox_path->GetValue(); + return std::move(boost::filesystem::path(txtctrl_path->GetValue().ToUTF8().data())); } // MsgUpdateConfig diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index fbc21a558f..3d9ab5a535 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -57,7 +57,7 @@ private: class AppUpdateDownloadDialog : public MsgDialog { public: - AppUpdateDownloadDialog(const Semver& ver_online); + AppUpdateDownloadDialog(const Semver& ver_online, boost::filesystem::path& path); AppUpdateDownloadDialog(AppUpdateDownloadDialog&&) = delete; AppUpdateDownloadDialog(const AppUpdateDownloadDialog&) = delete; AppUpdateDownloadDialog& operator=(AppUpdateDownloadDialog&&) = delete; @@ -65,12 +65,12 @@ public: virtual ~AppUpdateDownloadDialog(); // Tells whether the user checked the "don't bother me again" checkbox - bool run_after_download() const; - bool select_download_path() const; + bool run_after_download() const; + boost::filesystem::path get_download_path() const; private: wxCheckBox* cbox_run; - wxCheckBox* cbox_path; + wxTextCtrl* txtctrl_path; }; // Confirmation dialog informing about configuration update. Lists updated bundles & their versions. diff --git a/src/slic3r/Utils/AppUpdater.cpp b/src/slic3r/Utils/AppUpdater.cpp index 26bf883de7..60739ccb39 100644 --- a/src/slic3r/Utils/AppUpdater.cpp +++ b/src/slic3r/Utils/AppUpdater.cpp @@ -14,6 +14,8 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/Utils/Http.hpp" +#include "libslic3r/Utils.hpp" + #ifdef _WIN32 #include #include @@ -30,44 +32,16 @@ namespace { #ifdef _WIN32 bool run_file(const boost::filesystem::path& path) { - // find updater exe - if (boost::filesystem::exists(path)) { - // run updater. Original args: /silent -restartapp prusa-slicer.exe -startappfirst - - // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. - std::wstring wcmd = L"\"" + path.wstring(); //lm: closing quote? - - // additional information - STARTUPINFOW si; - PROCESS_INFORMATION pi; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - if (CreateProcessW(NULL, // the path - wcmd.data(), // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) - )) { - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; - } - else { - BOOST_LOG_TRIVIAL(error) << "Failed to run " << wcmd; //lm: maybe a UI error message? - } + std::string msg; + bool res = GUI::create_process(path, std::wstring(), msg); + if (!res) { + std::string full_message = GUI::format("Running downloaded instaler of %1% has failed:\n%2%", SLIC3R_APP_NAME, msg); + BOOST_LOG_TRIVIAL(error) << full_message; // lm: maybe UI error msg? // dk: bellow. (maybe some general show error evt would be better?) + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_FAILED); + evt->SetString(full_message); + GUI::wxGetApp().QueueEvent(evt); } - return false; + return res; } std::string get_downloads_path() @@ -81,108 +55,6 @@ namespace { CoTaskMemFree(path); return ret; } - - bool open_folder(const boost::filesystem::path& path) - { - // this command can run the installer exe as well, but is it better than CreateProcessW? - ShellExecuteW(NULL, NULL, path.wstring().c_str(), NULL, NULL, SW_SHOWNORMAL); - //lm:I would make it explicit that the folder should be opened. - //lm:Also, this always returns true. - return true; - } - -#elif __linux__ - bool run_file(const boost::filesystem::path& path) - { - return false; - } - - std::string get_downloads_path() - { - wxString command = "xdg-user-dir DOWNLOAD"; - wxArrayString output; - - //lm:It might be a good idea to make the following a separate function in GUI_Utils or something - // It is already used in four different places in almost the same way. - - //Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, - // because they may mess up the environment expected by the file manager. - // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. - if (wxGetEnv("APPIMAGE", nullptr)) { - // We're running from AppImage - wxEnvVariableHashMap env_vars; - wxGetEnvMap(&env_vars); - - env_vars.erase("APPIMAGE"); - env_vars.erase("APPDIR"); - env_vars.erase("LD_LIBRARY_PATH"); - env_vars.erase("LD_PRELOAD"); - env_vars.erase("UNION_PRELOAD"); - - wxExecuteEnv exec_env; - exec_env.env = std::move(env_vars); - - wxString owd; - if (wxGetEnv("OWD", &owd)) { - // This is the original work directory from which the AppImage image was run, - // set it as CWD for the child process: - exec_env.cwd = std::move(owd); - } - - ::wxExecute(command, output, 0, &exec_env); - - } else { - // Looks like we're NOT running from AppImage, we'll make no changes to the environment. - ::wxExecute(command, output); - } - if (output.GetCount() > 0) { - return boost::nowide::narrow(output[0]); //lm:I would use wxString::ToUTF8(), although on Linux, nothing at all should work too. - } - return std::string(); - } - - bool open_folder(const boost::filesystem::path& path) - { - if (boost::filesystem::is_directory(path)) { - const char *argv[] = { "xdg-open", path.string().c_str(), nullptr }; - - //lm:This is a copy of desktop_open_datadir_folder, it would make sense to instead call it. - - // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, - // because they may mess up the environment expected by the file manager. - // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. - if (wxGetEnv("APPIMAGE", nullptr)) { - // We're running from AppImage - wxEnvVariableHashMap env_vars; - wxGetEnvMap(&env_vars); - - env_vars.erase("APPIMAGE"); - env_vars.erase("APPDIR"); - env_vars.erase("LD_LIBRARY_PATH"); - env_vars.erase("LD_PRELOAD"); - env_vars.erase("UNION_PRELOAD"); - - wxExecuteEnv exec_env; - exec_env.env = std::move(env_vars); - - wxString owd; - if (wxGetEnv("OWD", &owd)) { - // This is the original work directory from which the AppImage image was run, - // set it as CWD for the child process: - exec_env.cwd = std::move(owd); - } - - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); - - } else { - // Looks like we're NOT running from AppImage, we'll make no changes to the environment. - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); - } - return true; - } - return false; - } - #elif __APPLE__ bool run_file(const boost::filesystem::path& path) { @@ -203,24 +75,30 @@ namespace { // call objective-c implementation return get_downloads_path_mac(); } - - bool open_folder(const boost::filesystem::path& path) - { - - if (boost::filesystem::is_directory(path)) { - const char* argv[] = { "open", path.string().c_str(), nullptr }; - ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); - return true; - } +#else + bool run_file(const boost::filesystem::path& path) + { return false; } -#endif + + std::string get_downloads_path() + { + wxString command = "xdg-user-dir DOWNLOAD"; + wxArrayString output; + GUI::desktop_execute_get_result(command, output); + if (output.GetCount() > 0) { + return output[0].ToUTF8().data(); //lm:I would use wxString::ToUTF8(), although on Linux, nothing at all should work too. + } + return std::string(); + } +#endif // _WIN32 / __apple__ / else } // namespace wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_FAILED, wxCommandEvent); +wxDEFINE_EVENT(EVT_SLIC3R_APP_OPEN_FAILED, wxCommandEvent); // priv handles all operations in separate thread // 1) download version file and parse it. @@ -251,12 +129,19 @@ struct AppUpdater::priv { std::thread m_thread; std::atomic_bool m_cancel; std::mutex m_data_mutex; + // used to tell if notify user hes about to stop ongoing download + std::atomic_bool m_download_ongoing { false }; + bool get_download_ongoing() const { return m_download_ongoing; } // read only variable used to init m_online_version_data.target_path boost::filesystem::path m_default_dest_folder; // readonly // DownloadAppData read / write needs to be locked by m_data_mutex DownloadAppData m_online_version_data; DownloadAppData get_app_data(); - void set_app_data(DownloadAppData data); + void set_app_data(DownloadAppData data); + // set only before version file is downloaded, to keep information to show info dialog about no updates + // should never change during thread run + std::atomic_bool m_triggered_by_user {false}; + bool get_triggered_by_user() const { return m_triggered_by_user; } }; AppUpdater::priv::priv() : @@ -271,7 +156,7 @@ AppUpdater::priv::priv() : if (!downloads_path.empty()) { m_default_dest_folder = std::move(downloads_path); } - BOOST_LOG_TRIVIAL(error) << "Default download path: " << m_default_dest_folder; //lm:Is this an error? + BOOST_LOG_TRIVIAL(trace) << "App updater default download path: " << m_default_dest_folder; //lm:Is this an error? // dk: changed to trace } @@ -284,7 +169,7 @@ bool AppUpdater::priv::http_get_file(const std::string& url, size_t size_limit, // progress function returns true as success (to continue) cancel = (this->m_cancel ? true : !progress_fn(std::move(progress))); if (cancel) { - error_message = GUI::format("Error getting: `%1%`: Download was canceled.", //lm:typo + error_message = GUI::format("Error getting: `%1%`: Download was canceled.", //lm:typo //dk: am i blind? :) url); BOOST_LOG_TRIVIAL(debug) << "AppUpdater::priv::http_get_file message: "<< error_message; } @@ -318,7 +203,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d return boost::filesystem::path(); } std::string error_message; - bool res = http_get_file(data.url, 80 * 1024 * 1024 //TODO: what value here //lm:I don't know, but larger. The binaries will grow. + bool res = http_get_file(data.url, 130 * 1024 * 1024 //2.4.0 windows installer is 65MB //lm:I don't know, but larger. The binaries will grow. // dk: changed to 130, to have 100% more space. We should put this information into version file. // on_progress , [&last_gui_progress, expected_size](Http::Progress progress) { // size check @@ -329,12 +214,13 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d evt->SetString(message); GUI::wxGetApp().QueueEvent(evt); return false; - } else if (progress.dltotal > 0 && progress.dltotal < expected_size) { //lm:When will this happen? Is that not an error? - BOOST_LOG_TRIVIAL(error) << GUI::format("Downloading new %1% has incorrect size. The download will continue. \nExpected size: %2%\nDownload size: %3%", SLIC3R_APP_NAME, expected_size, progress.dltotal);; - } + } else if (progress.dltotal > 0 && progress.dltotal < expected_size) { + //lm:When will this happen? Is that not an error? // dk: It is possible error, but we cannot know until the download is finished. Somehow the total size can grow during the download. + BOOST_LOG_TRIVIAL(info) << GUI::format("Downloading new %1% has incorrect size. The download will continue. \nExpected size: %2%\nDownload size: %3%", SLIC3R_APP_NAME, expected_size, progress.dltotal); + } // progress event size_t gui_progress = progress.dltotal > 0 ? 100 * progress.dlnow / progress.dltotal : 0; - //BOOST_LOG_TRIVIAL(error) << "App download " << gui_progress << "% " << progress.dlnow << " of " << progress.dltotal; + BOOST_LOG_TRIVIAL(error) << "App download " << gui_progress << "% " << progress.dlnow << " of " << progress.dltotal; if (last_gui_progress < gui_progress && (last_gui_progress != 0 || gui_progress != 100)) { last_gui_progress = gui_progress; wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS); @@ -348,8 +234,8 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d // Size check. Does always 1 char == 1 byte? size_t body_size = body.size(); if (body_size != expected_size) { - //lm:UI message? - BOOST_LOG_TRIVIAL(error) << "Downloaded file has wrong size. Expected size: " << expected_size << " Downloaded size: " << body_size; + //lm:UI message? // dk: changed. Now it propagates to UI. + error_message = GUI::format("Downloaded file has wrong size. Expected size: %1% Downloaded size: %2%", expected_size, body_size); return false; } boost::filesystem::path tmp_path = dest_path; @@ -363,7 +249,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d } catch (const std::exception&) { - BOOST_LOG_TRIVIAL(error) << "Failed to write and move " << tmp_path << " to " << dest_path; + error_message = GUI::format("Failed to write and move %1% to %2%", tmp_path, dest_path); return false; } return true; @@ -374,7 +260,9 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d { if (this->m_cancel) { - BOOST_LOG_TRIVIAL(error) << error_message; //lm:Is this an error? + BOOST_LOG_TRIVIAL(info) << error_message; //lm:Is this an error? // dk: changed to info + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_FAILED); // FAILED with empty msg only closes progress notification + GUI::wxGetApp().QueueEvent(evt); } else { std::string message = GUI::format("Downloading new %1% has failed:\n%2%", SLIC3R_APP_NAME, error_message); BOOST_LOG_TRIVIAL(error) << message; @@ -391,9 +279,7 @@ boost::filesystem::path AppUpdater::priv::download_file(const DownloadAppData& d bool AppUpdater::priv::run_downloaded_file(boost::filesystem::path path) { assert(!path.empty()); - bool res = run_file(path); - BOOST_LOG_TRIVIAL(error) << "Running "<< path.string() << " was " << res; - return res; + return run_file(path); } void AppUpdater::priv::version_check(const std::string& version_check_url) @@ -414,8 +300,16 @@ void AppUpdater::priv::version_check(const std::string& version_check_url) //lm:In case the internet is not available, it will report no updates if run by user. // We might save a flag that we don't know or try to run the version_check again, reporting // the failure. - if (!res) - BOOST_LOG_TRIVIAL(error) << "Failed to download version file: " << error_message; + // dk: changed to download version every time. Dialog will show if m_triggered_by_user. + if (!res) { + std::string message = GUI::format("Downloading %1% version file has failed:\n%2%", SLIC3R_APP_NAME, error_message); + BOOST_LOG_TRIVIAL(error) << message; + if (m_triggered_by_user) { + wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_APP_DOWNLOAD_FAILED); + evt->SetString(message); + GUI::wxGetApp().QueueEvent(evt); + } + } } void AppUpdater::priv::parse_version_string(const std::string& body) @@ -450,13 +344,14 @@ void AppUpdater::priv::parse_version_string(const std::string& body) if (section_name == #ifdef _WIN32 "release:win64" -#elif __linux__ - "release:linux" -#else +#elif __APPLE__ "release:osx" +#else + "release:linux" #endif //lm:Related to the ifdefs. We should also support BSD, which behaves similar to Linux in most cases. // Unless you have a reason not to, I would consider doing _WIN32, elif __APPLE__, else ... Not just here. +// dk: so its ok now or we need to specify BSD? ) { for (const auto& data : section.second) { if (data.first == "url") { @@ -530,7 +425,7 @@ void AppUpdater::priv::parse_version_string(const std::string& body) GUI::wxGetApp().QueueEvent(evt); } -#if 0 //lm:is this meant to be ressurected? +#if 0 //lm:is this meant to be ressurected? //dk: it is code that parses PrusaSlicer.version2 in 2.4.0, It was deleted from PresetUpdater.cpp and I would keep it here for possible reference. void AppUpdater::priv::parse_version_string_old(const std::string& body) const { @@ -643,17 +538,19 @@ void AppUpdater::sync_download() p->m_thread = std::thread( [this, input_data]() { + p->m_download_ongoing = true; if (boost::filesystem::path dest_path = p->download_file(input_data); boost::filesystem::exists(dest_path)){ if (input_data.start_after) { p->run_downloaded_file(std::move(dest_path)); } else { - open_folder(dest_path.parent_path()); + GUI::desktop_open_folder(dest_path.parent_path()); } } + p->m_download_ongoing = false; }); } -void AppUpdater::sync_version(const std::string& version_check_url) +void AppUpdater::sync_version(const std::string& version_check_url, bool from_user) { assert(p); // join thread first - it could have been in sync_download @@ -663,6 +560,7 @@ void AppUpdater::sync_version(const std::string& version_check_url) p->m_cancel = true; p->m_thread.join(); } + p->m_triggered_by_user = from_user; p->m_cancel = false; p->m_thread = std::thread( [this, version_check_url]() { @@ -707,5 +605,14 @@ DownloadAppData AppUpdater::get_app_data() return p->get_app_data(); } +bool AppUpdater::get_triggered_by_user() const +{ + return p->get_triggered_by_user(); +} + +bool AppUpdater::get_download_ongoing() const +{ + return p->get_download_ongoing(); +} } //namespace Slic3r diff --git a/src/slic3r/Utils/AppUpdater.hpp b/src/slic3r/Utils/AppUpdater.hpp index 2cdcb900bb..16d0d668f1 100644 --- a/src/slic3r/Utils/AppUpdater.hpp +++ b/src/slic3r/Utils/AppUpdater.hpp @@ -37,7 +37,7 @@ public: // downloads app file void sync_download(); // downloads version file - void sync_version(const std::string& version_check_url); + void sync_version(const std::string& version_check_url, bool from_user); void cancel(); bool cancel_callback(); @@ -46,6 +46,9 @@ public: static std::string get_filename_from_url(const std::string& url); static std::string get_file_extension_from_url(const std::string& url); + // atomic bool + bool get_triggered_by_user() const; + bool get_download_ongoing() const; // mutex access void set_app_data(DownloadAppData data); DownloadAppData get_app_data(); @@ -58,5 +61,6 @@ wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_PROGRESS, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_APP_DOWNLOAD_FAILED, wxCommandEvent); +wxDECLARE_EVENT(EVT_SLIC3R_APP_OPEN_FAILED, wxCommandEvent); } //namespace Slic3r #endif diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 40f068155a..f4863ff20a 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -135,10 +135,6 @@ struct Updates std::vector updates; }; - -//wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); -//wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); - struct PresetUpdater::priv { std::vector index_db; @@ -162,8 +158,6 @@ struct PresetUpdater::priv void set_download_prefs(AppConfig *app_config); bool get_file(const std::string &url, const fs::path &target_path) const; void prune_tmps() const; -// void sync_version() const; -// void parse_version_string(const std::string& body) const; void sync_config(const VendorMap vendors); void check_install_indices() const; @@ -238,105 +232,6 @@ void PresetUpdater::priv::prune_tmps() const } } -// moved to app updater - /* -// Get Slic3rPE version available online, save in AppConfig. -void PresetUpdater::priv::sync_version() const -{ - if (! enabled_version_check) { return; } - - BOOST_LOG_TRIVIAL(info) << format("Downloading %1% online version from: `%2%`", SLIC3R_APP_NAME, version_check_url); - - Http::get(version_check_url) - .size_limit(SLIC3R_VERSION_BODY_MAX) - .on_progress([this](Http::Progress, bool &cancel) { - cancel = this->cancel; - }) - .on_error([&](std::string body, std::string error, unsigned http_status) { - (void)body; - BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", - version_check_url, - http_status, - error); - }) - .on_complete([&](std::string body, unsigned ) { - boost::trim(body); - parse_version_string(body); - }) - .perform_sync(); -} - -// Parses version string obtained in sync_version() and sends events to UI thread. -// Version string must contain release version on first line. Follows non-mandatory alpha / beta releases on following lines (alpha=2.0.0-alpha1). -void PresetUpdater::priv::parse_version_string(const std::string& body) const -{ - - // release version - std::string version; - const auto first_nl_pos = body.find_first_of("\n\r"); - if (first_nl_pos != std::string::npos) - version = body.substr(0, first_nl_pos); - else - version = body; - boost::optional release_version = Semver::parse(version); - if (!release_version) { - BOOST_LOG_TRIVIAL(error) << format("Received invalid contents from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); - return; - } - BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); - wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); - evt->SetString(GUI::from_u8(version)); - GUI::wxGetApp().QueueEvent(evt); - - // alpha / beta version - std::vector prerelease_versions; - size_t nexn_nl_pos = first_nl_pos; - while (nexn_nl_pos != std::string::npos && body.size() > nexn_nl_pos + 1) { - const auto last_nl_pos = nexn_nl_pos; - nexn_nl_pos = body.find_first_of("\n\r", last_nl_pos + 1); - std::string line; - if (nexn_nl_pos == std::string::npos) - line = body.substr(last_nl_pos + 1); - else - line = body.substr(last_nl_pos + 1, nexn_nl_pos - last_nl_pos - 1); - - // alpha - if (line.substr(0, 6) == "alpha=") { - version = line.substr(6); - if (!Semver::parse(version)) { - BOOST_LOG_TRIVIAL(error) << format("Received invalid contents for alpha release from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); - return; - } - prerelease_versions.emplace_back(version); - // beta - } - else if (line.substr(0, 5) == "beta=") { - version = line.substr(5); - if (!Semver::parse(version)) { - BOOST_LOG_TRIVIAL(error) << format("Received invalid contents for beta release from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, version); - return; - } - prerelease_versions.emplace_back(version); - } - } - // find recent version that is newer than last full release. - boost::optional recent_version; - for (const std::string& ver_string : prerelease_versions) { - boost::optional ver = Semver::parse(ver_string); - if (ver && *release_version < *ver && ((recent_version && *recent_version < *ver) || !recent_version)) { - recent_version = ver; - version = ver_string; - } - } - if (recent_version) { - BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, version); - wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE); - evt->SetString(GUI::from_u8(version)); - GUI::wxGetApp().QueueEvent(evt); - } - -} -*/ // Download vendor indices. Also download new bundles if an index indicates there's a new one available. // Both are saved in cache. void PresetUpdater::priv::sync_config(const VendorMap vendors) @@ -747,7 +642,6 @@ void PresetUpdater::sync(PresetBundle *preset_bundle) p->thread = std::thread([this, vendors]() { this->p->prune_tmps(); -// this->p->sync_version(); this->p->sync_config(std::move(vendors)); }); } From 6853f8a3c6251c4cd278dc765fb49195c5d7a8cf Mon Sep 17 00:00:00 2001 From: David Kocik Date: Fri, 18 Feb 2022 16:47:24 +0100 Subject: [PATCH 146/149] MacOS build fixes --- src/slic3r/GUI/GUI.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 1d32832aa4..6c52a79a85 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -491,7 +491,7 @@ void desktop_open_folder(const boost::filesystem::path& path) const wchar_t* argv[] = { L"explorer", widepath.GetData(), nullptr }; ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #elif __APPLE__ - const char* argv[] = { "open", path.string(), nullptr }; + const char* argv[] = { "open", path.string().c_str(), nullptr }; ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); #else const char* argv[] = { "xdg-open", path.string().c_str(), nullptr }; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 8110d42dd8..76f321d893 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1239,7 +1239,7 @@ bool GUI_App::on_init_inner() show_error(nullptr, evt.GetString()); }); - Bind(EVT_SLIC3R_APP_OPEN_FAILED, [this](const wxCommandEvent& evt) { + Bind(EVT_SLIC3R_APP_OPEN_FAILED, [](const wxCommandEvent& evt) { show_error(nullptr, evt.GetString()); }); } From 3cecd0701173d881c7782b03af076c589292d55a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 23 Mar 2022 11:11:13 +0100 Subject: [PATCH 147/149] Tech ENABLE_LEGACY_OPENGL_REMOVAL - Refactoring of Camera::apply_viewport() --- src/slic3r/GUI/Camera.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 77ce27a799..1370484c3d 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -106,7 +106,11 @@ double Camera::get_fov() const void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) { glsafe(::glViewport(0, 0, w, h)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_viewport = { 0, 0, int(w), int(h) }; +#else glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } #if !ENABLE_LEGACY_OPENGL_REMOVAL From 4b4ed423ef0c606d3f95ab5e9ac9dc9f765d4a8e Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 23 Mar 2022 13:16:51 +0100 Subject: [PATCH 148/149] Tech ENABLE_LEGACY_OPENGL_REMOVAL - Fix into GLModel::send_to_gpu() --- src/slic3r/GUI/GLModel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index 9c9d695260..75998609be 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -1130,6 +1130,7 @@ bool GLModel::send_to_gpu() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } else { + data.index_type = Geometry::EIndexType::UINT; glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } From 24bcbd9c0ceb4ebd8035a0b69324140dee9d818b Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Wed, 23 Mar 2022 15:18:24 +0100 Subject: [PATCH 149/149] Optimization in GLCanvas3D::_render_camera_target() --- src/slic3r/GUI/GLCanvas3D.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 5539d681c4..51a0f0585a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6070,35 +6070,34 @@ void GLCanvas3D::_render_camera_target() #if ENABLE_LEGACY_OPENGL_REMOVAL const Vec3f& target = wxGetApp().plater()->get_camera().get_target().cast(); - bool target_changed = !m_camera_target.target.isApprox(target.cast()); m_camera_target.target = target.cast(); for (int i = 0; i < 3; ++i) { - if (!m_camera_target.axis[i].is_initialized() || target_changed) { + if (!m_camera_target.axis[i].is_initialized()) { m_camera_target.axis[i].reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3, GLModel::Geometry::EIndexType::USHORT }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; init_data.color = (i == X) ? ColorRGBA::X() : ((i == Y) ? ColorRGBA::Y() : ColorRGBA::Z()); init_data.reserve_vertices(2); init_data.reserve_indices(2); // vertices if (i == X) { - init_data.add_vertex(Vec3f(target.x() - half_length, target.y(), target.z())); - init_data.add_vertex(Vec3f(target.x() + half_length, target.y(), target.z())); + init_data.add_vertex(Vec3f(-half_length, 0.0f, 0.0f)); + init_data.add_vertex(Vec3f(+half_length, 0.0f, 0.0f)); } else if (i == Y) { - init_data.add_vertex(Vec3f(target.x(), target.y() - half_length, target.z())); - init_data.add_vertex(Vec3f(target.x(), target.y() + half_length, target.z())); + init_data.add_vertex(Vec3f(0.0f, -half_length, 0.0f)); + init_data.add_vertex(Vec3f(0.0f, +half_length, 0.0f)); } else { - init_data.add_vertex(Vec3f(target.x(), target.y(), target.z() - half_length)); - init_data.add_vertex(Vec3f(target.x(), target.y(), target.z() + half_length)); + init_data.add_vertex(Vec3f(0.0f, 0.0f, -half_length)); + init_data.add_vertex(Vec3f(0.0f, 0.0f, +half_length)); } // indices - init_data.add_ushort_line(0, 1); + init_data.add_line(0, 1); m_camera_target.axis[i].init_from(std::move(init_data)); } @@ -6109,7 +6108,7 @@ void GLCanvas3D::_render_camera_target() shader->start_using(); #if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::assemble_transform(m_camera_target.target)); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GL_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) {