mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Merge branch 'tm_opencsg' into lm_tm_hollowing
This commit is contained in:
		
						commit
						39fbb31db2
					
				
					 5 changed files with 245 additions and 214 deletions
				
			
		|  | @ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) | |||
| 
 | ||||
| project(OpenCSG-example) | ||||
| 
 | ||||
| add_executable(opencsg_example main.cpp  GLScene.hpp GLScene.cpp Canvas.hpp  | ||||
| add_executable(opencsg_example main.cpp  GLScene.hpp GLScene.cpp  | ||||
|     ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp | ||||
|     ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp | ||||
|     ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) | ||||
|  |  | |||
|  | @ -1,100 +0,0 @@ | |||
| #ifndef CANVAS_HPP | ||||
| #define CANVAS_HPP | ||||
| 
 | ||||
| #include <memory> | ||||
| 
 | ||||
| // For compilers that support precompilation, includes "wx/wx.h".
 | ||||
| #include <wx/wxprec.h> | ||||
| #ifndef WX_PRECOMP | ||||
| #include <wx/wx.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <wx/glcanvas.h> | ||||
| #include <wx/msgdlg.h> | ||||
| 
 | ||||
| #include "GLScene.hpp" | ||||
| 
 | ||||
| namespace Slic3r { namespace GL { | ||||
| 
 | ||||
| class Canvas: public wxGLCanvas, public Slic3r::GL::Display | ||||
| { | ||||
|     std::unique_ptr<wxGLContext> m_context; | ||||
| public: | ||||
|      | ||||
|     void set_active(long w, long h) override | ||||
|     { | ||||
|         SetCurrent(*m_context); | ||||
|         Slic3r::GL::Display::set_active(w, h); | ||||
|     } | ||||
|      | ||||
|     void swap_buffers() override { SwapBuffers(); } | ||||
|          | ||||
|     template<class...Args> | ||||
|     Canvas(Args &&...args): wxGLCanvas(std::forward<Args>(args)...) | ||||
|     { | ||||
|         auto ctx = new wxGLContext(this); | ||||
|         if (!ctx || !ctx->IsOK()) { | ||||
|             wxMessageBox("Could not create OpenGL context.", "Error", | ||||
|                          wxOK | wxICON_ERROR); | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         m_context.reset(ctx); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_MOUSEWHEEL, | ||||
|             [this](wxMouseEvent &evt) { | ||||
|                 on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), | ||||
|                           evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? | ||||
|                               Slic3r::GL::MouseInput::waVertical : | ||||
|                               Slic3r::GL::MouseInput::waHorizontal); | ||||
|             }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_MOTION, | ||||
|             [this](wxMouseEvent &evt) { | ||||
|                 on_moved_to(evt.GetPosition().x, evt.GetPosition().y); | ||||
|             }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_RIGHT_DOWN, | ||||
|             [this](wxMouseEvent & /*evt*/) { on_right_click_down(); }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_RIGHT_UP, | ||||
|             [this](wxMouseEvent & /*evt*/) { on_right_click_up(); }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_LEFT_DOWN, | ||||
|             [this](wxMouseEvent & /*evt*/) { on_left_click_down(); }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind( | ||||
|             wxEVT_LEFT_UP, | ||||
|             [this](wxMouseEvent & /*evt*/) { on_left_click_up(); }, | ||||
|             GetId()); | ||||
|          | ||||
|         Bind(wxEVT_PAINT, [this](wxPaintEvent &) { | ||||
|             // This is required even though dc is not used otherwise.
 | ||||
|             wxPaintDC dc(this); | ||||
|              | ||||
|             // Set the OpenGL viewport according to the client size of this
 | ||||
|             // canvas. This is done here rather than in a wxSizeEvent handler
 | ||||
|             // because our OpenGL rendering context (and thus viewport setting) is
 | ||||
|             // used with multiple canvases: If we updated the viewport in the
 | ||||
|             // wxSizeEvent handler, changing the size of one canvas causes a
 | ||||
|             // viewport setting that is wrong when next another canvas is
 | ||||
|             // repainted.
 | ||||
|             const wxSize ClientSize = GetClientSize(); | ||||
|             repaint(ClientSize.x, ClientSize.y); | ||||
|         }, GetId()); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| }} // namespace Slic3r::GL
 | ||||
| 
 | ||||
| #endif // CANVAS_HPP
 | ||||
|  | @ -133,7 +133,7 @@ void Scene::set_print(uqptr<SLAPrint> &&print) | |||
|     m_print = std::move(print); | ||||
|          | ||||
|     // Notify displays
 | ||||
|     call(&Display::on_scene_updated, m_displays); | ||||
|     call(&Listener::on_scene_updated, m_listeners, *this); | ||||
| } | ||||
| 
 | ||||
| BoundingBoxf3 Scene::get_bounding_box() const | ||||
|  | @ -383,13 +383,18 @@ void Display::set_active(long width, long height) | |||
|     m_camera->set_screen(width, height); | ||||
| } | ||||
| 
 | ||||
| void Display::repaint(long width, long height) | ||||
| void Display::set_screen_size(long width, long height) | ||||
| { | ||||
|     if (m_size.x() != width || m_size.y() != height) | ||||
|         m_camera->set_screen(width, height); | ||||
|      | ||||
|     m_size = {width, height}; | ||||
|      | ||||
|     repaint(); | ||||
| } | ||||
| 
 | ||||
| void Display::repaint() | ||||
| { | ||||
|     clear_screen(); | ||||
|      | ||||
|     m_camera->view(); | ||||
|  | @ -400,23 +405,34 @@ void Display::repaint(long width, long height) | |||
|     swap_buffers(); | ||||
| } | ||||
| 
 | ||||
| void Display::on_scroll(long v, long d, MouseInput::WheelAxis wa) | ||||
| void Controller::on_scene_updated(const Scene &scene) | ||||
| { | ||||
|     const SLAPrint *print = scene.get_print(); | ||||
|     if (!print) return; | ||||
|      | ||||
|     auto bb = scene.get_bounding_box(); | ||||
|     double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); | ||||
|     m_wheel_pos = long(2 * d); | ||||
|      | ||||
|     call_cameras(&Camera::set_zoom, m_wheel_pos); | ||||
|     call(&Display::on_scene_updated, m_displays, scene);     | ||||
| } | ||||
| 
 | ||||
| void Controller::on_scroll(long v, long d, MouseInput::WheelAxis /*wa*/) | ||||
| { | ||||
|     m_wheel_pos += v / d; | ||||
|      | ||||
|     m_camera->set_zoom(m_wheel_pos); | ||||
|      | ||||
|     m_scene->on_scroll(v, d, wa); | ||||
|      | ||||
|     repaint(m_size.x(), m_size.y()); | ||||
|     call_cameras(&Camera::set_zoom, m_wheel_pos); | ||||
|     call(&Display::repaint, m_displays); | ||||
| } | ||||
| 
 | ||||
| void Display::on_moved_to(long x, long y) | ||||
| void Controller::on_moved_to(long x, long y) | ||||
| { | ||||
|     if (m_left_btn) { | ||||
|         m_camera->rotate((Vec2i{x, y} - m_mouse_pos).cast<float>()); | ||||
|         repaint(); | ||||
|         call_cameras(&Camera::rotate, (Vec2i{x, y} - m_mouse_pos).cast<float>()); | ||||
|         call(&Display::repaint, m_displays); | ||||
|     } | ||||
|      | ||||
|     m_mouse_pos = {x, y}; | ||||
| } | ||||
| 
 | ||||
|  | @ -424,30 +440,27 @@ void Display::apply_csgsettings(const CSGSettings &settings) | |||
| { | ||||
|     using namespace OpenCSG; | ||||
|      | ||||
|     bool update = m_csgsettings.get_convexity() != settings.get_convexity(); | ||||
|     bool needupdate = m_csgsettings.get_convexity() != settings.get_convexity(); | ||||
|      | ||||
|     m_csgsettings = settings; | ||||
|     setOption(AlgorithmSetting, m_csgsettings.get_algo()); | ||||
|     setOption(DepthComplexitySetting, m_csgsettings.get_depth_algo()); | ||||
|     setOption(DepthBoundsOptimization, m_csgsettings.get_optimization()); | ||||
|      | ||||
|     if (update) on_scene_updated(); | ||||
|     if (needupdate) { | ||||
|         for (OpenCSG::Primitive * p : m_scene_cache.primitives_csg) | ||||
|             if (p->getConvexity() > 1) | ||||
|                 p->setConvexity(m_csgsettings.get_convexity()); | ||||
|     } | ||||
|      | ||||
|     repaint(); | ||||
| } | ||||
| 
 | ||||
| void Display::on_scene_updated() | ||||
| void Display::on_scene_updated(const Scene &scene) | ||||
| { | ||||
|     const SLAPrint *print = m_scene->get_print(); | ||||
|     const SLAPrint *print = scene.get_print(); | ||||
|     if (!print) return; | ||||
|      | ||||
|     { | ||||
|     auto bb = m_scene->get_bounding_box(); | ||||
|     double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); | ||||
|     m_wheel_pos = long(2 * d); | ||||
|     m_camera->set_zoom(m_wheel_pos); | ||||
|     } | ||||
|      | ||||
|     m_scene_cache.clear(); | ||||
|      | ||||
|     for (const SLAPrintObject *po : print->objects()) { | ||||
|  | @ -499,12 +512,6 @@ void Display::on_scene_updated() | |||
|     repaint(); | ||||
| } | ||||
| 
 | ||||
| void Display::set_scene(shptr<Scene> scene) | ||||
| { | ||||
|     m_scene = scene; | ||||
|     m_scene->add_display(shared_from_this()); | ||||
| } | ||||
| 
 | ||||
| void Camera::view() | ||||
| { | ||||
|     glMatrixMode(GL_MODELVIEW); | ||||
|  |  | |||
|  | @ -21,16 +21,16 @@ template<class T> using uqptr = std::unique_ptr<T>; | |||
| template<class T> using wkptr = std::weak_ptr<T>; | ||||
| 
 | ||||
| template<class T, class A = std::allocator<T>> | ||||
| using Collection = std::vector<T, A>; | ||||
| using vector = std::vector<T, A>; | ||||
| 
 | ||||
| template<class L> void cleanup(Collection<std::weak_ptr<L>> &listeners) { | ||||
| template<class L> void cleanup(vector<std::weak_ptr<L>> &listeners) { | ||||
|     auto it = std::remove_if(listeners.begin(), listeners.end(), | ||||
|                              [](auto &l) { return !l.lock(); }); | ||||
|     listeners.erase(it, listeners.end()); | ||||
| } | ||||
| 
 | ||||
| template<class F, class L, class...Args> | ||||
| void call(F &&f, Collection<std::weak_ptr<L>> &listeners, Args&&... args) { | ||||
| void call(F &&f, vector<std::weak_ptr<L>> &listeners, Args&&... args) { | ||||
|     for (auto &l : listeners) | ||||
|         if (auto p = l.lock()) ((p.get())->*f)(std::forward<Args>(args)...); | ||||
| } | ||||
|  | @ -57,7 +57,7 @@ public: | |||
|     }; | ||||
|      | ||||
| private: | ||||
|     Collection<wkptr<Listener>> m_listeners; | ||||
|     vector<wkptr<Listener>> m_listeners; | ||||
|          | ||||
| public: | ||||
|     virtual ~MouseInput() = default; | ||||
|  | @ -104,9 +104,9 @@ public: | |||
| 
 | ||||
|     // Vertices and their normals, interleaved to be used by void
 | ||||
|     // glInterleavedArrays(GL_N3F_V3F, 0, x)
 | ||||
|     Collection<float> vertices_and_normals_interleaved; | ||||
|     Collection<int>   triangle_indices; | ||||
|     Collection<int>   quad_indices; | ||||
|     vector<float> vertices_and_normals_interleaved; | ||||
|     vector<int>   triangle_indices; | ||||
|     vector<int>   quad_indices; | ||||
| 
 | ||||
|     // When the geometry data is loaded into the graphics card as Vertex
 | ||||
|     // Buffer Objects, the above mentioned std::vectors are cleared and the
 | ||||
|  | @ -223,8 +223,8 @@ public: | |||
|      | ||||
| private: | ||||
|     OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; | ||||
|     OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::DepthComplexityAlgorithm::NoDepthComplexitySampling; | ||||
|     OpenCSG::Optimization m_optim = OpenCSG::Optimization::OptimizationDefault; | ||||
|     OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::NoDepthComplexitySampling; | ||||
|     OpenCSG::Optimization m_optim = OpenCSG::OptimizationDefault; | ||||
|     bool m_enable = true; | ||||
|     unsigned int m_convexity = DEFAULT_CONVEXITY; | ||||
|      | ||||
|  | @ -244,25 +244,48 @@ public: | |||
|     unsigned get_convexity() const { return m_convexity; } | ||||
|     void set_convexity(unsigned c) { m_convexity = c; } | ||||
| }; | ||||
|         | ||||
| class Display : public std::enable_shared_from_this<Display>, | ||||
|                 public MouseInput::Listener | ||||
|        | ||||
| class Scene | ||||
| { | ||||
|     uqptr<SLAPrint> m_print; | ||||
| public: | ||||
|      | ||||
|     class Listener { | ||||
|     public: | ||||
|         virtual ~Listener() = default; | ||||
|         virtual void on_scene_updated(const Scene &scene) = 0; | ||||
|     }; | ||||
|      | ||||
|     Scene(); | ||||
|     ~Scene(); | ||||
|      | ||||
|     void set_print(uqptr<SLAPrint> &&print); | ||||
|     const SLAPrint * get_print() const { return m_print.get(); } | ||||
|      | ||||
|     BoundingBoxf3 get_bounding_box() const; | ||||
|      | ||||
|     void add_listener(shptr<Listener> listener) | ||||
|     { | ||||
|         m_listeners.emplace_back(listener); | ||||
|         cleanup(m_listeners); | ||||
|     } | ||||
|      | ||||
| private: | ||||
|     vector<wkptr<Listener>> m_listeners; | ||||
| }; | ||||
| 
 | ||||
| class Display : public Scene::Listener | ||||
| { | ||||
| protected: | ||||
|     shptr<Scene> m_scene; | ||||
|     long m_wheel_pos = 0; | ||||
|     Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; | ||||
|     Vec2i m_size; | ||||
|     bool m_initialized = false, m_left_btn = false, m_right_btn = false; | ||||
|     bool m_initialized = false; | ||||
|      | ||||
|     CSGSettings m_csgsettings; | ||||
|      | ||||
|     shptr<Camera> m_camera; | ||||
|      | ||||
|     struct SceneCache { | ||||
|         Collection<shptr<Primitive>> primitives; | ||||
|         Collection<Primitive *> primitives_free; | ||||
|         Collection<OpenCSG::Primitive *> primitives_csg; | ||||
|         vector<shptr<Primitive>> primitives; | ||||
|         vector<Primitive *> primitives_free; | ||||
|         vector<OpenCSG::Primitive *> primitives_csg; | ||||
|          | ||||
|         void clear(); | ||||
|          | ||||
|  | @ -272,64 +295,80 @@ protected: | |||
|                                   unsigned            covexity); | ||||
|     } m_scene_cache; | ||||
|      | ||||
|     shptr<Camera>  m_camera; | ||||
|      | ||||
| public: | ||||
|     Display(shptr<Scene> scene = nullptr, shptr<Camera> camera = nullptr) | ||||
|         : m_scene(scene) | ||||
|         , m_camera(camera ? camera : std::make_shared<PerspectiveCamera>()) | ||||
|      | ||||
|     explicit Display(shptr<Camera> camera = nullptr) | ||||
|         : m_camera(camera ? camera : std::make_shared<PerspectiveCamera>()) | ||||
|     {} | ||||
| 
 | ||||
|      | ||||
|     Camera * camera() { return m_camera.get(); } | ||||
|      | ||||
|     virtual void swap_buffers() = 0; | ||||
|      | ||||
|     virtual void set_active(long width, long height); | ||||
|     virtual void set_screen_size(long width, long height); | ||||
|     Vec2i get_screen_size() const { return m_size; } | ||||
|      | ||||
|     virtual void repaint(long width, long height);     | ||||
|     void repaint() { repaint(m_size.x(), m_size.y()); } | ||||
|      | ||||
|     void set_scene(shptr<Scene> scene); | ||||
|     shptr<Scene> get_scene() { return m_scene; } | ||||
|     virtual void repaint(); | ||||
|      | ||||
|     bool is_initialized() const { return m_initialized; } | ||||
|      | ||||
|     void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; | ||||
|     void on_moved_to(long x, long y) override; | ||||
|     void on_left_click_down() override { m_left_btn = true; } | ||||
|     void on_left_click_up() override { m_left_btn = false;  } | ||||
|     void on_right_click_down() override { m_right_btn = true;  } | ||||
|     void on_right_click_up() override { m_right_btn = false; } | ||||
|      | ||||
|     void move_clip_plane(double z) { m_camera->set_clip_z(z); } | ||||
|      | ||||
|     const CSGSettings & get_csgsettings() const { return m_csgsettings; } | ||||
|     void apply_csgsettings(const CSGSettings &settings); | ||||
|      | ||||
|     virtual void on_scene_updated(); | ||||
|     void on_scene_updated(const Scene &scene) override; | ||||
|      | ||||
|     virtual void clear_screen(); | ||||
|     virtual void render_scene(); | ||||
| }; | ||||
| 
 | ||||
| class Scene: public MouseInput::Listener | ||||
| class Controller : public std::enable_shared_from_this<Controller>, | ||||
|                    public MouseInput::Listener, | ||||
|                    public Scene::Listener | ||||
| { | ||||
|     uqptr<SLAPrint> m_print; | ||||
|     long m_wheel_pos = 0; | ||||
|     Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; | ||||
|     bool m_left_btn = false, m_right_btn = false; | ||||
| 
 | ||||
|     shptr<Scene>               m_scene; | ||||
|     vector<wkptr<Display>> m_displays; | ||||
|      | ||||
|     // Call a method of Camera on all the cameras of the attached displays
 | ||||
|     template<class F, class...Args> | ||||
|     void call_cameras(F &&f, Args&&... args) { | ||||
|         for (wkptr<Display> &l : m_displays) | ||||
|             if (auto disp = l.lock()) if (disp->camera()) | ||||
|                 (disp->camera()->*f)(std::forward<Args>(args)...); | ||||
|     } | ||||
|      | ||||
| public: | ||||
|      | ||||
|     Scene(); | ||||
|     ~Scene(); | ||||
|     void set_scene(shptr<Scene> scene) | ||||
|     { | ||||
|         m_scene = scene; | ||||
|         m_scene->add_listener(shared_from_this()); | ||||
|     } | ||||
|      | ||||
|     const Scene * get_scene() const { return m_scene.get(); } | ||||
| 
 | ||||
|     void add_display(shptr<Display> disp) | ||||
|     { | ||||
|         m_displays.emplace_back(disp); | ||||
|         cleanup(m_displays); | ||||
|     } | ||||
|      | ||||
|     void set_print(uqptr<SLAPrint> &&print); | ||||
|     const SLAPrint * get_print() const { return m_print.get(); } | ||||
|     void on_scene_updated(const Scene &scene) override; | ||||
|      | ||||
|     BoundingBoxf3 get_bounding_box() const; | ||||
|     void on_left_click_down() override { m_left_btn = true; } | ||||
|     void on_left_click_up() override { m_left_btn = false;  } | ||||
|     void on_right_click_down() override { m_right_btn = true;  } | ||||
|     void on_right_click_up() override { m_right_btn = false; } | ||||
|      | ||||
|     void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; | ||||
|     void on_moved_to(long x, long y) override; | ||||
| 
 | ||||
| private: | ||||
|      | ||||
|     Collection<wkptr<Display>> m_displays; | ||||
|     void move_clip_plane(double z) { call_cameras(&Camera::set_clip_z, z); } | ||||
| }; | ||||
| 
 | ||||
| }}     // namespace Slic3r::GL
 | ||||
| #endif // GLSCENE_HPP
 | ||||
|  |  | |||
|  | @ -15,9 +15,9 @@ | |||
| #include <wx/tglbtn.h> | ||||
| #include <wx/combobox.h> | ||||
| #include <wx/spinctrl.h> | ||||
| #include <wx/msgdlg.h> | ||||
| #include <wx/glcanvas.h> | ||||
| 
 | ||||
| #include "Canvas.hpp" | ||||
| #include "GLScene.hpp" | ||||
| 
 | ||||
| #include "libslic3r/Model.hpp" | ||||
|  | @ -29,51 +29,60 @@ | |||
| 
 | ||||
| using namespace Slic3r::GL; | ||||
| 
 | ||||
| class Canvas: public wxGLCanvas, public Slic3r::GL::Display | ||||
| { | ||||
|     std::unique_ptr<wxGLContext> m_context; | ||||
| public: | ||||
|      | ||||
|     void set_active(long w, long h) override | ||||
|     { | ||||
|         SetCurrent(*m_context); | ||||
|         Slic3r::GL::Display::set_active(w, h); | ||||
|     } | ||||
|      | ||||
|     void swap_buffers() override { SwapBuffers(); } | ||||
|      | ||||
|     template<class...Args> | ||||
|     Canvas(Args &&...args): wxGLCanvas(std::forward<Args>(args)...) | ||||
|     { | ||||
|         auto ctx = new wxGLContext(this); | ||||
|         if (!ctx || !ctx->IsOK()) { | ||||
|             wxMessageBox("Could not create OpenGL context.", "Error", | ||||
|                          wxOK | wxICON_ERROR); | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         m_context.reset(ctx); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| class MyFrame: public wxFrame | ||||
| { | ||||
|     std::shared_ptr<Canvas> m_canvas; | ||||
|     std::shared_ptr<Slic3r::GUI::ProgressStatusBar> m_stbar; | ||||
|     std::unique_ptr<Slic3r::GUI::Job> m_ui_job; | ||||
|     shptr<Scene>      m_scene;    // Model
 | ||||
|     shptr<Canvas>     m_canvas;   // View
 | ||||
|     shptr<Controller> m_ctl;      // Controller
 | ||||
| 
 | ||||
|     shptr<Slic3r::GUI::ProgressStatusBar> m_stbar; | ||||
|     uqptr<Slic3r::GUI::Job> m_ui_job; | ||||
|      | ||||
|     class SLAJob: public Slic3r::GUI::Job { | ||||
|         MyFrame *m_parent; | ||||
|         std::unique_ptr<Slic3r::SLAPrint> m_print; | ||||
|         std::string m_fname; | ||||
|     public: | ||||
|          | ||||
|         SLAJob(MyFrame *frame, const std::string &fname)  | ||||
|         SLAJob(MyFrame *frame, const std::string &fname) | ||||
|             : Slic3r::GUI::Job{frame->m_stbar} | ||||
|             , m_parent{frame} | ||||
|             , m_fname{fname} | ||||
|         { | ||||
|         } | ||||
|          | ||||
|         void process() override  | ||||
|         { | ||||
|             using Status = Slic3r::PrintBase::SlicingStatus; | ||||
|              | ||||
|             Slic3r::DynamicPrintConfig cfg; | ||||
|             auto model = Slic3r::Model::read_from_file(m_fname, &cfg); | ||||
|              | ||||
|             m_print = std::make_unique<Slic3r::SLAPrint>(); | ||||
|             m_print->apply(model, cfg); | ||||
|              | ||||
|             Slic3r::PrintBase::TaskParams params; | ||||
|             params.to_object_step = Slic3r::slaposHollowing; | ||||
|             m_print->set_task(params); | ||||
|              | ||||
|             m_print->set_status_callback([this](const Status &status) { | ||||
|                 update_status(status.percent, status.text); | ||||
|             }); | ||||
|              | ||||
|             m_print->process(); | ||||
|         } | ||||
|         {} | ||||
| 
 | ||||
|         void process() override; | ||||
|          | ||||
|     protected: | ||||
|          | ||||
|         void finalize() override  | ||||
|         { | ||||
|             m_parent->m_canvas->get_scene()->set_print(std::move(m_print)); | ||||
|             m_parent->m_scene->set_print(std::move(m_print)); | ||||
|             m_parent->m_stbar->set_status_text( | ||||
|                         wxString::Format("Model %s loaded.", m_fname)); | ||||
|         } | ||||
|  | @ -84,6 +93,8 @@ public: | |||
|      | ||||
| private: | ||||
|      | ||||
|     void bind_canvas_events_to_controller(); | ||||
|      | ||||
|     void OnExit(wxCommandEvent& /*event*/)  | ||||
|     { | ||||
|         RemoveChild(m_canvas.get()); | ||||
|  | @ -108,7 +119,8 @@ private: | |||
|         const wxSize ClientSize = GetClientSize(); | ||||
|         m_canvas->set_active(ClientSize.x, ClientSize.y);  | ||||
|          | ||||
|         m_canvas->repaint(ClientSize.x, ClientSize.y); | ||||
|         m_canvas->set_screen_size(ClientSize.x, ClientSize.y); | ||||
|         m_canvas->repaint(); | ||||
|          | ||||
|         // Do the repaint continuously
 | ||||
|         Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { | ||||
|  | @ -159,9 +171,14 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): | |||
|      WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, | ||||
|      WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; | ||||
|      | ||||
|     m_scene = std::make_shared<Scene>(); | ||||
|     m_ctl = std::make_shared<Controller>(); | ||||
|     m_ctl->set_scene(m_scene); | ||||
|      | ||||
|     m_canvas = std::make_shared<Canvas>(this, wxID_ANY, attribList, | ||||
|                                         wxDefaultPosition, wxDefaultSize, | ||||
|                                         wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); | ||||
|     m_ctl->add_display(m_canvas); | ||||
|      | ||||
|     wxPanel *control_panel = new wxPanel(this); | ||||
|     auto controlsizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|  | @ -234,7 +251,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): | |||
|     Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); | ||||
|      | ||||
|     Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { | ||||
|         m_canvas->move_clip_plane(double(slider->GetValue())); | ||||
|         m_ctl->move_clip_plane(double(slider->GetValue())); | ||||
|     }); | ||||
|      | ||||
|     ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ | ||||
|  | @ -283,5 +300,73 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): | |||
|         } | ||||
|     }); | ||||
|      | ||||
|     m_canvas->set_scene(std::make_shared<Slic3r::GL::Scene>()); | ||||
|     bind_canvas_events_to_controller(); | ||||
| } | ||||
| 
 | ||||
| void MyFrame::bind_canvas_events_to_controller() | ||||
| { | ||||
|     m_canvas->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent &evt) { | ||||
|         m_ctl->on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), | ||||
|                          evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? | ||||
|                              Slic3r::GL::MouseInput::waVertical : | ||||
|                              Slic3r::GL::MouseInput::waHorizontal); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_MOTION, [this](wxMouseEvent &evt) { | ||||
|         m_ctl->on_moved_to(evt.GetPosition().x, evt.GetPosition().y); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_RIGHT_DOWN, [this](wxMouseEvent & /*evt*/) { | ||||
|         m_ctl->on_right_click_down(); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_RIGHT_UP, [this](wxMouseEvent & /*evt*/) { | ||||
|         m_ctl->on_right_click_up(); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent & /*evt*/) { | ||||
|         m_ctl->on_left_click_down(); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent & /*evt*/) { | ||||
|         m_ctl->on_left_click_up(); | ||||
|     }); | ||||
| 
 | ||||
|     m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { | ||||
|         // This is required even though dc is not used otherwise.
 | ||||
|         wxPaintDC dc(this); | ||||
|          | ||||
|         // Set the OpenGL viewport according to the client size of this
 | ||||
|         // canvas. This is done here rather than in a wxSizeEvent handler
 | ||||
|         // because our OpenGL rendering context (and thus viewport setting) is
 | ||||
|         // used with multiple canvases: If we updated the viewport in the
 | ||||
|         // wxSizeEvent handler, changing the size of one canvas causes a
 | ||||
|         // viewport setting that is wrong when next another canvas is
 | ||||
|         // repainted.
 | ||||
|         const wxSize ClientSize = m_canvas->GetClientSize(); | ||||
|          | ||||
|         m_canvas->set_screen_size(ClientSize.x, ClientSize.y); | ||||
|         m_canvas->repaint(); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| void MyFrame::SLAJob::process()  | ||||
| { | ||||
|     using Status = Slic3r::PrintBase::SlicingStatus; | ||||
|      | ||||
|     Slic3r::DynamicPrintConfig cfg; | ||||
|     auto model = Slic3r::Model::read_from_file(m_fname, &cfg); | ||||
|      | ||||
|     m_print = std::make_unique<Slic3r::SLAPrint>(); | ||||
|     m_print->apply(model, cfg); | ||||
|      | ||||
|     Slic3r::PrintBase::TaskParams params; | ||||
|     params.to_object_step = Slic3r::slaposHollowing; | ||||
|     m_print->set_task(params); | ||||
|      | ||||
|     m_print->set_status_callback([this](const Status &status) { | ||||
|         update_status(status.percent, status.text); | ||||
|     }); | ||||
|      | ||||
|     m_print->process(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tamasmeszaros
						tamasmeszaros