From 8e001972a9efaf23e4ee5129d6a2c82a5e438cd2 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 4 Jan 2019 12:56:48 +0100 Subject: [PATCH] Added print bed models for mk2 and mk3 printers to 3D scene --- resources/models/mk2_bed.stl | Bin 0 -> 2484 bytes resources/models/mk3_bed.stl | Bin 0 -> 59984 bytes src/libslic3r/Technologies.hpp | 4 +- src/slic3r/GUI/3DScene.cpp | 82 +++++++++++++++++++++++++++++---- src/slic3r/GUI/3DScene.hpp | 27 +++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 63 ++++++++++++++++++++++++- src/slic3r/GUI/GLCanvas3D.hpp | 11 +++++ 7 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 resources/models/mk2_bed.stl create mode 100644 resources/models/mk3_bed.stl diff --git a/resources/models/mk2_bed.stl b/resources/models/mk2_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..07b7655ea6f601ec070d0c06f70265e35d2d1e5b GIT binary patch literal 2484 zcma)-ziJgx5XMh1Q3#}vyuc~7i-s*_F{TQsqCP+n!64i~tkNCC#uQ1b;7g=S6ZRIq zfrzcx3&I7lbiOk?XTG!9WOE>!Vej{we>*$7_vT=B`0Dl1;k&qXFxx*mj?Z80#s_g{ ze-`6re7x~!Gd^5fjkh~%s~e%56hi9uc0X?)KRJ08LY$vBVqd;5_TOJ0vz-Z1lG95WPR(4R$1X9F z)X{pcLIADRs;v`K^dbl0T@1mWpb(|gV}xc^t9%xELj2>TmVaTt98aZ?gBaFfxig)K z{xTpacYppS)&EjCsbE{LMv0W`C{q%GPe$E^>|NA2sr4r%-7S-G6XBCstC&{j`Px50 zdmbE*>r<^{)FCaND<|UIZPVXONQPxXLEK$w+Mml!j^Vy!mz2uc9uT>sHtkMmr>#CP zsl^4BtJJS;HQZMls%e5fLBCjTTKoZZU)mqryQt5mvLbR;mIuG@+JTP literal 0 HcmV?d00001 diff --git a/resources/models/mk3_bed.stl b/resources/models/mk3_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..cfa6d8c6d63e3f8e767556727c04277de82285c6 GIT binary patch literal 59984 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 literal 0 HcmV?d00001 diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index c32fe3e8d..dc6a2041c 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -42,8 +42,10 @@ //==================== #define ENABLE_1_42_0_ALPHA2 1 +// Improves navigation between sidebar fields #define ENABLE_IMPROVED_SIDEBAR_OBJECTS_MANIPULATION (1 && ENABLE_1_42_0_ALPHA2) - +// Adds print bed models to 3D scene +#define ENABLE_PRINT_BED_MODELS (1 && ENABLE_1_42_0_ALPHA2) #endif // _technologies_h_ diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 42b025093..d44789b7a 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -11,6 +11,9 @@ #include "libslic3r/Slicing.hpp" #include "libslic3r/GCode/Analyzer.hpp" #include "slic3r/GUI/PresetBundle.hpp" +#if ENABLE_PRINT_BED_MODELS +#include "libslic3r/Format/STL.hpp" +#endif // ENABLE_PRINT_BED_MODELS #include #include @@ -20,6 +23,11 @@ #include +#if ENABLE_PRINT_BED_MODELS +#include +#include +#endif // ENABLE_PRINT_BED_MODELS + #include #include @@ -249,11 +257,7 @@ void GLVolume::set_render_color(float r, float g, float b, float a) void GLVolume::set_render_color(const float* rgba, unsigned int size) { - size = std::min((unsigned int)4, size); - for (unsigned int i = 0; i < size; ++i) - { - render_color[i] = rgba[i]; - } + ::memcpy((void*)render_color, (const void*)rgba, (size_t)(std::min((unsigned int)4, size) * sizeof(float))); } void GLVolume::set_render_color() @@ -1790,17 +1794,27 @@ GUI::GLCanvas3DManager _3DScene::s_canvas_mgr; #if ENABLE_SIDEBAR_VISUAL_HINTS GLModel::GLModel() : m_useVBOs(false) +#if ENABLE_PRINT_BED_MODELS + , m_filename("") +#endif // ENABLE_PRINT_BED_MODELS { m_volume.shader_outside_printer_detection_enabled = false; } GLModel::~GLModel() { +#if ENABLE_PRINT_BED_MODELS + reset(); +#else m_volume.release_geometry(); +#endif // ENABLE_PRINT_BED_MODELS } void GLModel::set_color(const float* color, unsigned int size) { +#if ENABLE_PRINT_BED_MODELS + ::memcpy((void*)m_volume.color, (const void*)color, (size_t)(std::min((unsigned int)4, size) * sizeof(float))); +#endif // ENABLE_PRINT_BED_MODELS m_volume.set_render_color(color, size); } @@ -1834,6 +1848,14 @@ void GLModel::set_scale(const Vec3d& scale) m_volume.set_volume_scaling_factor(scale); } +#if ENABLE_PRINT_BED_MODELS +void GLModel::reset() +{ + m_volume.release_geometry(); + m_filename = ""; +} +#endif // ENABLE_PRINT_BED_MODELS + void GLModel::render() const { if (m_useVBOs) @@ -1854,9 +1876,7 @@ void GLModel::render_VBOs() const GLint current_program_id; ::glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id); GLint color_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "uniform_color") : -1; - GLint print_box_detection_id = (current_program_id > 0) ? glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1; - - m_volume.render_VBOs(color_id, print_box_detection_id, -1); + m_volume.render_VBOs(color_id, -1, -1); ::glBindBuffer(GL_ARRAY_BUFFER, 0); ::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -2066,11 +2086,57 @@ bool GLCurvedArrow::on_init(bool useVBOs) else m_volume.indexed_vertex_array.load_mesh_flat_shading(TriangleMesh(vertices, triangles)); + m_volume.bounding_box = m_volume.indexed_vertex_array.bounding_box(); m_volume.finalize_geometry(m_useVBOs); return true; } #endif // ENABLE_SIDEBAR_VISUAL_HINTS +#if ENABLE_PRINT_BED_MODELS +bool GLBed::on_init_from_file(const std::string& filename, bool useVBOs) +{ + reset(); + + if (!boost::filesystem::exists(filename)) + return false; + + if (!boost::algorithm::iends_with(filename, ".stl")) + return false; + + Model model; + try + { + model = Model::read_from_file(filename); + } + catch (std::exception &e) + { + return false; + } + + m_filename = filename; + m_useVBOs = useVBOs; + + ModelObject* model_object = model.objects.front(); + model_object->center_around_origin(); + + TriangleMesh mesh = model.mesh(); + mesh.repair(); + + if (m_useVBOs) + m_volume.indexed_vertex_array.load_mesh_full_shading(mesh); + else + m_volume.indexed_vertex_array.load_mesh_flat_shading(mesh); + + float color[4] = { 0.235f, 0.235, 0.235f, 1.0f }; + set_color(color, 4); + + m_volume.bounding_box = m_volume.indexed_vertex_array.bounding_box(); + m_volume.finalize_geometry(m_useVBOs); + + return true; +} +#endif // ENABLE_PRINT_BED_MODELS + std::string _3DScene::get_gl_info(bool format_as_html, bool extensions) { return s_canvas_mgr.get_gl_info(format_as_html, extensions); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 38996dc04..b7b1af73d 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -569,13 +569,20 @@ class GLModel protected: GLVolume m_volume; bool m_useVBOs; +#if ENABLE_PRINT_BED_MODELS + std::string m_filename; +#endif // ENABLE_PRINT_BED_MODELS public: GLModel(); virtual ~GLModel(); bool init(bool useVBOs) { return on_init(useVBOs); } +#if ENABLE_PRINT_BED_MODELS + bool init_from_file(const std::string& filename, bool useVBOs) { return on_init_from_file(filename, useVBOs); } + void center_around(const Vec3d& center) { m_volume.set_volume_offset(center - m_volume.bounding_box.center()); } +#endif // ENABLE_PRINT_BED_MODELS void set_color(const float* color, unsigned int size); const Vec3d& get_offset() const; @@ -585,10 +592,22 @@ public: const Vec3d& get_scale() const; void set_scale(const Vec3d& scale); +#if ENABLE_PRINT_BED_MODELS + const std::string& get_filename() const { return m_filename; } + const BoundingBoxf3& get_bounding_box() const { return m_volume.bounding_box; } + + void reset(); +#endif // ENABLE_PRINT_BED_MODELS + void render() const; protected: +#if ENABLE_PRINT_BED_MODELS + virtual bool on_init(bool useVBOs) { return false; } + virtual bool on_init_from_file(const std::string& filename, bool useVBOs) { return false; } +#else virtual bool on_init(bool useVBOs) = 0; +#endif // ENABLE_PRINT_BED_MODELS private: void render_VBOs() const; @@ -613,6 +632,14 @@ protected: }; #endif // ENABLE_SIDEBAR_VISUAL_HINTS +#if ENABLE_PRINT_BED_MODELS +class GLBed : public GLModel +{ +protected: + virtual bool on_init_from_file(const std::string& filename, bool useVBOs); +}; +#endif // ENABLE_PRINT_BED_MODELS + class _3DScene { static GUI::GLCanvas3DManager s_canvas_mgr; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 5fa09d334..91b4a2855 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -386,6 +386,35 @@ Point GLCanvas3D::Bed::point_projection(const Point& point) const return m_polygon.point_projection(point); } +#if ENABLE_PRINT_BED_MODELS +void GLCanvas3D::Bed::render(float theta, bool useVBOs) const +{ + switch (m_type) + { + case MK2: + { + _render_prusa("mk2", theta, useVBOs); + break; + } + case MK3: + { + _render_prusa("mk3", theta, useVBOs); + break; + } + case SL1: + { + _render_prusa("sl1", theta, useVBOs); + break; + } + default: + case Custom: + { + _render_custom(); + break; + } + } +} +#else void GLCanvas3D::Bed::render(float theta) const { switch (m_type) @@ -413,6 +442,7 @@ void GLCanvas3D::Bed::render(float theta) const } } } +#endif // ENABLE_PRINT_BED_MODELS void GLCanvas3D::Bed::_calc_bounding_box() { @@ -504,9 +534,18 @@ GLCanvas3D::Bed::EType GLCanvas3D::Bed::_detect_type() const return type; } +#if ENABLE_PRINT_BED_MODELS +void GLCanvas3D::Bed::_render_prusa(const std::string &key, float theta, bool useVBOs) const +#else void GLCanvas3D::Bed::_render_prusa(const std::string &key, float theta) const +#endif // ENABLE_PRINT_BED_MODELS { - std::string filename = resources_dir() + "/icons/bed/" + key + "_top.png"; + std::string tex_path = resources_dir() + "/icons/bed/" + key; +#if ENABLE_PRINT_BED_MODELS + std::string model_path = resources_dir() + "/models/" + key; +#endif // ENABLE_PRINT_BED_MODELS + + std::string filename = tex_path + "_top.png"; if ((m_top_texture.get_id() == 0) || (m_top_texture.get_source() != filename)) { if (!m_top_texture.load_from_file(filename, true)) @@ -516,7 +555,7 @@ void GLCanvas3D::Bed::_render_prusa(const std::string &key, float theta) const } } - filename = resources_dir() + "/icons/bed/" + key + "_bottom.png"; + filename = tex_path + "_bottom.png"; if ((m_bottom_texture.get_id() == 0) || (m_bottom_texture.get_source() != filename)) { if (!m_bottom_texture.load_from_file(filename, true)) @@ -526,6 +565,22 @@ void GLCanvas3D::Bed::_render_prusa(const std::string &key, float theta) const } } +#if ENABLE_PRINT_BED_MODELS + if (theta <= 90.0f) + { + filename = model_path + "_bed.stl"; + if ((m_model.get_filename() != filename) && m_model.init_from_file(filename, useVBOs)) + m_model.center_around(m_bounding_box.center() - Vec3d(0.0, 0.0, 1.0 + 0.5 * m_model.get_bounding_box().size()(2))); + + if (!m_model.get_filename().empty()) + { + ::glEnable(GL_LIGHTING); + m_model.render(); + ::glDisable(GL_LIGHTING); + } + } +#endif // ENABLE_PRINT_BED_MODELS + unsigned int triangles_vcount = m_triangles.get_vertices_count(); if (triangles_vcount > 0) { @@ -6087,7 +6142,11 @@ void GLCanvas3D::_render_background() const void GLCanvas3D::_render_bed(float theta) const { +#if ENABLE_PRINT_BED_MODELS + m_bed.render(theta, m_use_VBOs); +#else m_bed.render(theta); +#endif // ENABLE_PRINT_BED_MODELS } void GLCanvas3D::_render_axes() const diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 73aa4bd02..c2f2074c1 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -201,6 +201,9 @@ class GLCanvas3D GeometryBuffer m_gridlines; mutable GLTexture m_top_texture; mutable GLTexture m_bottom_texture; +#if ENABLE_PRINT_BED_MODELS + mutable GLBed m_model; +#endif // ENABLE_PRINT_BED_MODELS public: Bed(); @@ -216,14 +219,22 @@ class GLCanvas3D bool contains(const Point& point) const; Point point_projection(const Point& point) const; +#if ENABLE_PRINT_BED_MODELS + void render(float theta, bool useVBOs) const; +#else void render(float theta) const; +#endif // ENABLE_PRINT_BED_MODELS private: void _calc_bounding_box(); void _calc_triangles(const ExPolygon& poly); void _calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); EType _detect_type() const; +#if ENABLE_PRINT_BED_MODELS + void _render_prusa(const std::string &key, float theta, bool useVBOs) const; +#else void _render_prusa(const std::string &key, float theta) const; +#endif // ENABLE_PRINT_BED_MODELS void _render_custom() const; static bool _are_equal(const Pointfs& bed_1, const Pointfs& bed_2); };