diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 88815d9a6..d4fcdd2e0 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -2002,9 +2002,9 @@ std::string _3DScene::get_gl_info(bool format_as_html, bool extensions) return s_canvas_mgr.get_gl_info(format_as_html, extensions); } -bool _3DScene::add_canvas(wxGLCanvas* canvas) +bool _3DScene::add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar) { - return s_canvas_mgr.add(canvas); + return s_canvas_mgr.add(canvas, bed, camera, view_toolbar); } bool _3DScene::remove_canvas(wxGLCanvas* canvas) diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 46cb5b870..5daf4b941 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -25,6 +25,11 @@ inline void glAssertRecentCall() { } #endif namespace Slic3r { +namespace GUI { +class Bed3D; +struct Camera; +class GLToolbar; +} // namespace GUI class Print; class PrintObject; @@ -563,7 +568,7 @@ class _3DScene public: static std::string get_gl_info(bool format_as_html, bool extensions); - static bool add_canvas(wxGLCanvas* canvas); + static bool add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar); static bool remove_canvas(wxGLCanvas* canvas); static void remove_all_canvases(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 12361bdbc..b8afc325a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3153,7 +3153,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } }); #if ENABLE_IMGUI if (it->second->get_state() == GLGizmoBase::On) { - float toolbar_top = (float)cnv_h - canvas.m_view_toolbar->get_height(); + float toolbar_top = (float)cnv_h - canvas.m_view_toolbar.get_height(); #if ENABLE_SVG_ICONS it->second->render_input_window(2.0f * m_overlay_border + m_overlay_icons_size, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #else @@ -3673,21 +3673,21 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); -GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) : m_canvas(canvas) , m_context(nullptr) #if ENABLE_RETINA_GL , m_retina_helper(nullptr) #endif , m_in_render(false) - , m_camera(nullptr) - , m_bed(nullptr) + , m_bed(bed) + , m_camera(camera) + , m_view_toolbar(view_toolbar) #if ENABLE_SVG_ICONS , m_toolbar(GLToolbar::Normal, "Top") #else , m_toolbar(GLToolbar::Normal) #endif // ENABLE_SVG_ICONS - , m_view_toolbar(nullptr) , m_use_clipping_planes(false) , m_sidebar_field("") , m_config(nullptr) @@ -3909,12 +3909,8 @@ void GLCanvas3D::set_model(Model* model) void GLCanvas3D::bed_shape_changed() { - if (m_camera != nullptr) - { - m_camera->set_scene_box(scene_bounding_box()); - m_camera->requires_zoom_to_bed = true; - } - + m_camera.set_scene_box(scene_bounding_box()); + m_camera.requires_zoom_to_bed = true; m_dirty = true; } @@ -3925,7 +3921,7 @@ void GLCanvas3D::set_color_by(const std::string& value) float GLCanvas3D::get_camera_zoom() const { - return (m_camera != nullptr) ? m_camera->zoom : 0.0f; + return m_camera.zoom; } BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const @@ -3942,8 +3938,7 @@ BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const BoundingBoxf3 GLCanvas3D::scene_bounding_box() const { BoundingBoxf3 bb = volumes_bounding_box(); - if (m_bed != nullptr) - bb.merge(m_bed->get_bounding_box()); + bb.merge(m_bed.get_bounding_box()); if (m_config != nullptr) { @@ -4032,8 +4027,7 @@ bool GLCanvas3D::is_toolbar_item_pressed(const std::string& name) const void GLCanvas3D::zoom_to_bed() { - if (m_bed != nullptr) - _zoom_to_bounding_box(m_bed->get_bounding_box()); + _zoom_to_bounding_box(m_bed.get_bounding_box()); } void GLCanvas3D::zoom_to_volumes() @@ -4070,12 +4064,8 @@ void GLCanvas3D::select_view(const std::string& direction) if (dir_vec != nullptr) { - if (m_camera != nullptr) - { - m_camera->phi = dir_vec[0]; - m_camera->set_theta(dir_vec[1], false); - } - + m_camera.phi = dir_vec[0]; + m_camera.set_theta(dir_vec[1], false); if (m_canvas != nullptr) m_canvas->Refresh(); } @@ -4135,18 +4125,16 @@ void GLCanvas3D::render() if (!_set_current() || !_3DScene::init(m_canvas)) return; - if ((m_bed != nullptr) && m_bed->get_shape().empty()) - { + if (m_bed.get_shape().empty()) // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); - } - if ((m_camera != nullptr) && m_camera->requires_zoom_to_bed) + if (m_camera.requires_zoom_to_bed) { zoom_to_bed(); const Size& cnv_size = get_canvas_size(); _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); - m_camera->requires_zoom_to_bed = false; + m_camera.requires_zoom_to_bed = false; } _camera_tranform(); @@ -4156,13 +4144,11 @@ void GLCanvas3D::render() GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); - float theta = (m_camera != nullptr) ? m_camera->get_theta() : 0.0f; + float theta = m_camera.get_theta(); if (theta > 180.f) // absolute value of the rotation theta = 360.f - theta; - bool is_custom_bed = (m_bed == nullptr) || m_bed->is_custom(); - #if ENABLE_IMGUI wxGetApp().imgui()->new_frame(); #endif // ENABLE_IMGUI @@ -4175,8 +4161,8 @@ void GLCanvas3D::render() _render_background(); // textured bed needs to be rendered after objects if the texture is transparent - bool early_bed_render = is_custom_bed || (theta <= 90.0f); - if (early_bed_render) + bool early_bed_render = m_bed.is_custom() || (theta <= 90.0f); + if (early_bed_render) _render_bed(theta); _render_objects(); @@ -4593,8 +4579,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // restore to default value m_regenerate_volumes = true; - if (m_camera != nullptr) - m_camera->set_scene_box(scene_bounding_box()); + m_camera.set_scene_box(scene_bounding_box()); if (m_selection.is_empty()) { @@ -5048,7 +5033,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.select_object(*m_model, layer_editing_object_idx); bool gizmos_overlay_contains_mouse = m_gizmos.overlay_contains_mouse(*this, m_mouse.position); int toolbar_contains_mouse = m_toolbar.contains_mouse(m_mouse.position, *this); - int view_toolbar_contains_mouse = (m_view_toolbar != nullptr) ? m_view_toolbar->contains_mouse(m_mouse.position, *this) : -1; + int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); #if ENABLE_MOVE_MIN_THRESHOLD if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) @@ -5160,10 +5145,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // event was taken care of by the SlaSupports gizmo } else if (evt.LeftDown() && (view_toolbar_contains_mouse != -1)) - { - if (m_view_toolbar != nullptr) - m_view_toolbar->do_action((unsigned int)view_toolbar_contains_mouse, *this); - } + m_view_toolbar.do_action((unsigned int)view_toolbar_contains_mouse, *this); else if (evt.LeftDown() && (toolbar_contains_mouse != -1)) { m_toolbar_action_running = true; @@ -5281,7 +5263,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // 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(m_hover_volume_id)) { - if ((m_camera != nullptr) && (m_camera->get_theta() == 90.0f)) + if (m_camera.get_theta() == 90.0f) { // side view -> move selected volumes orthogonally to camera view direction Linef3 ray = mouse_ray(pos); @@ -5392,12 +5374,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_MOVE_MIN_THRESHOLD { const Vec3d& orig = m_mouse.drag.start_position_3D; - if (m_camera != nullptr) - { - m_camera->phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); - m_camera->set_theta(m_camera->get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); - } - + m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); + m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); m_dirty = true; } m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); @@ -5411,9 +5389,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) 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); - if (m_camera != nullptr) - m_camera->set_target(m_camera->get_target() + orig - cur_pos); - + m_camera.set_target(m_camera.get_target() + orig - cur_pos); m_dirty = true; } @@ -5490,7 +5466,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Let the platter know that the dragging finished, so a delayed refresh // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - m_camera->set_scene_box(scene_bounding_box()); + m_camera.set_scene_box(scene_bounding_box()); } m_moving = false; @@ -5520,9 +5496,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) tooltip = m_toolbar.update_hover_state(m_mouse.position, *this); // updates view toolbar overlay - if (tooltip.empty() && (m_view_toolbar != nullptr)) + if (tooltip.empty()) { - tooltip = m_view_toolbar->update_hover_state(m_mouse.position, *this); + tooltip = m_view_toolbar.update_hover_state(m_mouse.position, *this); if (!tooltip.empty()) m_dirty = true; } @@ -5835,9 +5811,7 @@ void GLCanvas3D::set_camera_zoom(float zoom) // Don't allow to zoom too close to the scene. zoom = std::min(zoom, 100.0f); - if (m_camera != nullptr) - m_camera->zoom = zoom; - + m_camera.zoom = zoom; _refresh_if_shown_on_screen(); } @@ -5872,11 +5846,8 @@ void GLCanvas3D::update_ui_from_settings() if (new_scaling != orig_scaling) { BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; - if (m_camera != nullptr) - { - m_camera->zoom /= orig_scaling; - m_camera->zoom *= new_scaling; - } + m_camera.zoom /= orig_scaling; + m_camera.zoom *= new_scaling; _refresh_if_shown_on_screen(); } #endif @@ -6063,8 +6034,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) const BoundingBoxf3& bbox = _max_bounding_box(); - Camera::EType camera_type = (m_camera != nullptr) ? m_camera->type : Camera::Unknown; - switch (camera_type) + switch (m_camera.type) { case Camera::Ortho: { @@ -6121,8 +6091,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) BoundingBoxf3 GLCanvas3D::_max_bounding_box() const { BoundingBoxf3 bb = volumes_bounding_box(); - if (m_bed != nullptr) - bb.merge(m_bed->get_bounding_box()); + bb.merge(m_bed.get_bounding_box()); return bb; } @@ -6132,13 +6101,9 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) float zoom = _get_zoom_to_bounding_box_factor(bbox); if (zoom > 0.0f) { - if (m_camera != nullptr) - { - m_camera->zoom = zoom; - // center view around bounding box center - m_camera->set_target(bbox.center()); - } - + m_camera.zoom = zoom; + // center view around bounding box center + m_camera.set_target(bbox.center()); m_dirty = true; } } @@ -6228,13 +6193,9 @@ void GLCanvas3D::_camera_tranform() const ::glMatrixMode(GL_MODELVIEW); ::glLoadIdentity(); - Vec3d target = Vec3d::Zero(); - if (m_camera != nullptr) - { - ::glRotatef(-m_camera->get_theta(), 1.0f, 0.0f, 0.0f); // pitch - ::glRotatef(m_camera->phi, 0.0f, 0.0f, 1.0f); // yaw - target = -m_camera->get_target(); - } + ::glRotatef(-m_camera.get_theta(), 1.0f, 0.0f, 0.0f); // pitch + ::glRotatef(m_camera.phi, 0.0f, 0.0f, 1.0f); // yaw + Vec3d target = -m_camera.get_target(); ::glTranslated(target(0), target(1), target(2)); } @@ -6329,16 +6290,13 @@ void GLCanvas3D::_render_bed(float theta) const float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); -#endif - - if (m_bed != nullptr) - m_bed->render(theta, m_use_VBOs, scale_factor); +#endif // ENABLE_RETINA_GL + m_bed.render(theta, m_use_VBOs, scale_factor); } void GLCanvas3D::_render_axes() const { - if (m_bed != nullptr) - m_bed->render_axes(); + m_bed.render_axes(); } void GLCanvas3D::_render_objects() const @@ -6356,9 +6314,9 @@ void GLCanvas3D::_render_objects() const // Update the layer editing selection to the first object selected, update the current object maximum Z. const_cast(m_layers_editing).select_object(*m_model, this->is_layers_editing_enabled() ? m_selection.get_object_idx() : -1); - if ((m_config != nullptr) && (m_bed != nullptr)) + if (m_config != nullptr) { - const BoundingBoxf3& bed_bb = m_bed->get_bounding_box(); + const BoundingBoxf3& bed_bb = m_bed.get_bounding_box(); m_volumes.set_print_box((float)bed_bb.min(0), (float)bed_bb.min(1), 0.0f, (float)bed_bb.max(0), (float)bed_bb.max(1), (float)m_config->opt_float("max_print_height")); m_volumes.check_outside_state(m_config, nullptr); } @@ -6540,7 +6498,7 @@ void GLCanvas3D::_render_toolbar() const } else { - top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; left = -0.5f * m_toolbar.get_width() * inv_zoom; } break; @@ -6575,31 +6533,29 @@ void GLCanvas3D::_render_toolbar() const void GLCanvas3D::_render_view_toolbar() const { - if (m_view_toolbar != nullptr) { #if ENABLE_SVG_ICONS #if ENABLE_RETINA_GL - m_view_toolbar->set_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor()); #endif // ENABLE_RETINA_GL - Size cnv_size = get_canvas_size(); - float zoom = get_camera_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + Size cnv_size = get_canvas_size(); + float zoom = get_camera_zoom(); + float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - // places the toolbar on the bottom-left corner of the 3d scene - float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; - float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; - m_view_toolbar->set_position(top, left); + // places the toolbar on the bottom-left corner of the 3d scene + float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; + float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; + m_view_toolbar.set_position(top, left); #else #if ENABLE_RETINA_GL - m_view_toolbar->set_icons_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_icons_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); #endif /* __WXMSW__ */ #endif // ENABLE_SVG_ICONS - m_view_toolbar->render(*this); - } + m_view_toolbar.render(*this); } #if ENABLE_SHOW_CAMERA_TARGET @@ -6611,7 +6567,7 @@ void GLCanvas3D::_render_camera_target() const ::glLineWidth(2.0f); ::glBegin(GL_LINES); - Vec3d target = (m_camera != nullptr) ? m_camera->get_target() : Vec3d::Zero(); + const Vec3d& target = m_camera.get_target(); // draw line for x axis ::glColor3f(1.0f, 0.0f, 0.0f); ::glVertex3d(target(0) - half_length, target(1), target(2)); @@ -8115,7 +8071,7 @@ void GLCanvas3D::_resize_toolbars() const } else { - top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; left = -0.5f * m_toolbar.get_width() * inv_zoom; } m_toolbar.set_position(top, left); @@ -8143,15 +8099,15 @@ void GLCanvas3D::_resize_toolbars() const if (m_view_toolbar != nullptr) { #if ENABLE_RETINA_GL - m_view_toolbar->set_icons_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_icons_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); #endif /* __WXMSW__ */ // places the toolbar on the bottom-left corner of the 3d scene - float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; - m_view_toolbar->set_position(top, left); + m_view_toolbar.set_position(top, left); } } #endif // !ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 51a7202e7..7c39ab490 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -850,14 +850,14 @@ private: LegendTexture m_legend_texture; WarningTexture m_warning_texture; wxTimer m_timer; - Camera* m_camera; - Bed3D* m_bed; + Bed3D& m_bed; + Camera& m_camera; + GLToolbar& m_view_toolbar; LayersEditing m_layers_editing; Shader m_shader; Mouse m_mouse; mutable Gizmos m_gizmos; mutable GLToolbar m_toolbar; - GLToolbar* m_view_toolbar; ClippingPlane m_clipping_planes[2]; bool m_use_clipping_planes; mutable SlaCap m_sla_caps[2]; @@ -898,7 +898,7 @@ private: #endif // not ENABLE_IMGUI public: - GLCanvas3D(wxGLCanvas* canvas); + GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); ~GLCanvas3D(); void set_context(wxGLContext* context) { m_context = context; } @@ -906,11 +906,6 @@ public: wxGLCanvas* get_wxglcanvas() { return m_canvas; } const wxGLCanvas* get_wxglcanvas() const { return m_canvas; } - void set_camera(Camera* camera) { m_camera = camera; } - void set_bed(Bed3D* bed) { m_bed = bed; } - - void set_view_toolbar(GLToolbar* toolbar) { m_view_toolbar = toolbar; } - bool init(bool useVBOs, bool use_legacy_opengl); void post_event(wxEvent &&event); diff --git a/src/slic3r/GUI/GLCanvas3DManager.cpp b/src/slic3r/GUI/GLCanvas3DManager.cpp index 71299f777..e409bed0d 100644 --- a/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -129,7 +129,7 @@ GLCanvas3DManager::~GLCanvas3DManager() } } -bool GLCanvas3DManager::add(wxGLCanvas* canvas) +bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) { if (canvas == nullptr) return false; @@ -137,7 +137,7 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas) if (_get_canvas(canvas) != m_canvases.end()) return false; - GLCanvas3D* canvas3D = new GLCanvas3D(canvas); + GLCanvas3D* canvas3D = new GLCanvas3D(canvas, bed, camera, view_toolbar); if (canvas3D == nullptr) return false; diff --git a/src/slic3r/GUI/GLCanvas3DManager.hpp b/src/slic3r/GUI/GLCanvas3DManager.hpp index 1f7c49f72..75647e6b2 100644 --- a/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -23,6 +23,9 @@ class PrintObject; namespace GUI { class GLCanvas3D; +class Bed3D; +class GLToolbar; +struct Camera; class GLCanvas3DManager { @@ -62,7 +65,7 @@ public: GLCanvas3DManager(); ~GLCanvas3DManager(); - bool add(wxGLCanvas* canvas); + bool add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); bool remove(wxGLCanvas* canvas); void remove_all(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 7f819dc3e..57ede0a96 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -27,7 +27,7 @@ namespace Slic3r { namespace GUI { -View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) + View3D::View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) : m_canvas_widget(nullptr) , m_canvas(nullptr) #if !ENABLE_IMGUI @@ -37,7 +37,7 @@ View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, Backg , m_config(nullptr) , m_process(nullptr) { - init(parent, model, config, process); + init(parent, bed, camera, view_toolbar, model, config, process); } View3D::~View3D() @@ -50,13 +50,13 @@ View3D::~View3D() } } -bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) +bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) { if (!Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 /* disable wxTAB_TRAVERSAL */)) return false; m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this); - _3DScene::add_canvas(m_canvas_widget); + _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar); m_canvas = _3DScene::get_canvas(this->m_canvas_widget); m_canvas->allow_multisample(GLCanvas3DManager::can_multisample()); @@ -89,24 +89,6 @@ bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, Ba return true; } -void View3D::set_bed(Bed3D* bed) -{ - if (m_canvas != nullptr) - m_canvas->set_bed(bed); -} - -void View3D::set_camera(Camera* camera) -{ - if (m_canvas != nullptr) - m_canvas->set_camera(camera); -} - -void View3D::set_view_toolbar(GLToolbar* toolbar) -{ - if (m_canvas != nullptr) - m_canvas->set_view_toolbar(toolbar); -} - void View3D::set_as_dirty() { if (m_canvas != nullptr) @@ -199,7 +181,7 @@ void View3D::render() m_canvas->set_as_dirty(); } -Preview::Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) +Preview::Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) : m_canvas_widget(nullptr) , m_canvas(nullptr) , m_double_slider_sizer(nullptr) @@ -220,14 +202,14 @@ Preview::Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicing , m_enabled(false) , m_schedule_background_process(schedule_background_process_func) { - if (init(parent, config, process, gcode_preview_data)) + if (init(parent, bed, camera, view_toolbar, config, process, gcode_preview_data)) { show_hide_ui_elements("none"); load_print(); } } -bool Preview::init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data) +bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data) { if ((config == nullptr) || (process == nullptr) || (gcode_preview_data == nullptr)) return false; @@ -236,8 +218,8 @@ bool Preview::init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlici return false; m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this); - _3DScene::add_canvas(m_canvas_widget); - m_canvas = _3DScene::get_canvas(this->m_canvas_widget); + _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar); + m_canvas = _3DScene::get_canvas(this->m_canvas_widget); m_canvas->allow_multisample(GLCanvas3DManager::can_multisample()); m_canvas->set_config(m_config); m_canvas->set_process(process); @@ -348,24 +330,6 @@ Preview::~Preview() } } -void Preview::set_bed(Bed3D* bed) -{ - if (m_canvas != nullptr) - m_canvas->set_bed(bed); -} - -void Preview::set_camera(Camera* camera) -{ - if (m_canvas != nullptr) - m_canvas->set_camera(camera); -} - -void Preview::set_view_toolbar(GLToolbar* toolbar) -{ - if (m_canvas != nullptr) - m_canvas->set_view_toolbar(toolbar); -} - void Preview::set_number_extruders(unsigned int number_extruders) { if (m_number_extruders != number_extruders) diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 3fb64ce21..05f9fc2ca 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -28,7 +28,7 @@ namespace GUI { class GLCanvas3D; class GLToolbar; class Bed3D; -class Camera; +struct Camera; class View3D : public wxPanel { @@ -44,17 +44,12 @@ class View3D : public wxPanel BackgroundSlicingProcess* m_process; public: - View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); + View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); virtual ~View3D(); wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; } GLCanvas3D* get_canvas3d() { return m_canvas; } - void set_bed(Bed3D* bed); - void set_camera(Camera* camera); - - void set_view_toolbar(GLToolbar* toolbar); - void set_as_dirty(); void bed_shape_changed(); @@ -78,7 +73,7 @@ public: void render(); private: - bool init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); + bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); }; class Preview : public wxPanel @@ -111,17 +106,12 @@ class Preview : public wxPanel PrusaDoubleSlider* m_slider {nullptr}; public: - Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = [](){}); + Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = [](){}); virtual ~Preview(); wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; } GLCanvas3D* get_canvas3d() { return m_canvas; } - void set_bed(Bed3D* bed); - void set_camera(Camera* camera); - - void set_view_toolbar(GLToolbar* toolbar); - void set_number_extruders(unsigned int number_extruders); void set_canvas_as_dirty(); void set_enabled(bool enabled); @@ -134,7 +124,7 @@ public: void refresh_print(); private: - bool init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data); + bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data); void bind_event_handlers(); void unbind_event_handlers(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 39a81c210..65868a4e7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1203,14 +1203,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) sla_print.set_status_callback(statuscb); this->q->Bind(EVT_SLICING_UPDATE, &priv::on_slicing_update, this); - view3D = new View3D(q, &model, config, &background_process); - preview = new Preview(q, config, &background_process, &gcode_preview_data, [this](){ schedule_background_process(); }); - - view3D->set_bed(&bed); - preview->set_bed(&bed); - - view3D->set_camera(&camera); - preview->set_camera(&camera); + view3D = new View3D(q, bed, camera, view_toolbar, &model, config, &background_process); + preview = new Preview(q, bed, camera, view_toolbar, config, &background_process, &gcode_preview_data, [this](){ schedule_background_process(); }); panels.push_back(view3D); panels.push_back(preview); @@ -2674,9 +2668,6 @@ void Plater::priv::init_view_toolbar() view_toolbar.select_item("3D"); view_toolbar.set_enabled(true); - - view3D->set_view_toolbar(&view_toolbar); - preview->set_view_toolbar(&view_toolbar); } bool Plater::priv::can_delete_object() const