From 3e0d80604019617341ab36fb1de6791e8ac6ac58 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 8 Apr 2025 15:18:45 +0800 Subject: [PATCH] ENH:The model also uses parameter passing to avoid using global variables jira: none Change-Id: I04675dd81509b92160598b3a4359895b13752fa8 (cherry picked from commit eef83dafce93130ecfd078a7ff0a689ec51c66bc) --- src/slic3r/GUI/3DScene.cpp | 45 +++++++++++--------- src/slic3r/GUI/3DScene.hpp | 15 ++++--- src/slic3r/GUI/GCodeViewer.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 19 +++++---- src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 2 +- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 175e715e7..e443c7307 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -355,7 +355,7 @@ void GLIndexedVertexArray::render( const float GLVolume::SinkingContours::HalfWidth = 0.25f; -void GLVolume::SinkingContours::render(const GUI::Camera &camera) +void GLVolume::SinkingContours::render(const GUI::Camera &camera, Model &model) { const auto& shader = GUI::wxGetApp().get_shader("flat"); if (!shader) { @@ -364,7 +364,7 @@ void GLVolume::SinkingContours::render(const GUI::Camera &camera) GUI::wxGetApp().bind_shader(shader); - update(); + update(model); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::assemble_transform(m_shift)); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); m_model.render_geometry(); @@ -372,11 +372,9 @@ void GLVolume::SinkingContours::render(const GUI::Camera &camera) GUI::wxGetApp().unbind_shader(); } -void GLVolume::SinkingContours::update() +void GLVolume::SinkingContours::update(Model &model) { int object_idx = m_parent.object_idx(); - Model& model = GUI::wxGetApp().plater()->model(); - if (0 <= object_idx && object_idx < (int)model.objects.size() && m_parent.is_sinking() && !m_parent.is_below_printbed()) { const BoundingBoxf3& box = m_parent.transformed_convex_hull_bounding_box(); if (!m_old_box.size().isApprox(box.size()) || m_old_box.min.z() != box.min.z()) { @@ -784,17 +782,20 @@ BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d & bounding_box().transformed(trafo); } -BoundingBoxf3 GLVolume::transformed_non_sinking_bounding_box(const Transform3d& trafo) const +BoundingBoxf3 GLVolume::transformed_non_sinking_bounding_box(const Transform3d& trafo,Model& model) const { - return GUI::wxGetApp().plater()->model().objects[object_idx()]->volumes[volume_idx()]->mesh().transformed_bounding_box(trafo, 0.0); + if (object_idx() < model.objects.size()) + return model.objects[object_idx()]->volumes[volume_idx()]->mesh().transformed_bounding_box(trafo, 0.0); + else + return {}; } -const BoundingBoxf3& GLVolume::transformed_non_sinking_bounding_box() const +const BoundingBoxf3 &GLVolume::transformed_non_sinking_bounding_box(Model &model) const { if (!m_transformed_non_sinking_bounding_box.has_value()) { std::optional* trans_box = const_cast*>(&m_transformed_non_sinking_bounding_box); const Transform3d& trafo = world_matrix(); - *trans_box = transformed_non_sinking_bounding_box(trafo); + *trans_box = transformed_non_sinking_bounding_box(trafo, model); } return *m_transformed_non_sinking_bounding_box; } @@ -836,7 +837,7 @@ void GLVolume::set_range(double min_z, double max_z) //BBS: add outline related logic //static unsigned char stencil_data[1284][2944]; -void GLVolume::render(const GUI::Camera &camera, const std::vector> &colors, bool with_outline, const std::array &body_color) const +void GLVolume::render(const GUI::Camera &camera, const std::vector> &colors, Model &model, bool with_outline, const std::array &body_color) const { if (!is_active) return; @@ -851,7 +852,7 @@ void GLVolume::render(const GUI::Camera &camera, const std::vector= model_objects.size()) break; @@ -1214,8 +1215,8 @@ bool GLVolume::is_below_printbed() const return transformed_convex_hull_bounding_box().max.z() < 0.0; } -void GLVolume::render_sinking_contours(const GUI::Camera &camera) { - m_sinking_contours.render(camera); +void GLVolume::render_sinking_contours(const GUI::Camera &camera, Model &model) { + m_sinking_contours.render(camera, model); } GLWipeTowerVolume::GLWipeTowerVolume(const std::vector>& colors) @@ -1226,6 +1227,7 @@ GLWipeTowerVolume::GLWipeTowerVolume(const std::vector>& co void GLWipeTowerVolume::render(const GUI::Camera &camera, const std::vector> &extruder_colors, + Model &model, bool with_outline, const std::array &body_color) const { @@ -1619,6 +1621,7 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip bool disable_cullface, const GUI::Camera & camera, const std::vector>& colors, + Model& model, std::function filter_func, bool with_outline, const std::array & body_color, @@ -1673,7 +1676,7 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip if (volume.first->is_sinking() && !volume.first->is_below_printbed() && volume.first->hover == GLVolume::HS_None && !volume.first->force_sinking_contours) { GUI::wxGetApp().unbind_shader(); - volume.first->render_sinking_contours(camera); + volume.first->render_sinking_contours(camera, model); GUI::wxGetApp().bind_shader(shader); } } @@ -1744,12 +1747,12 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip //BBS: add outline related logic auto red_color = std::array({ 1.0f, 0.0f, 0.0f, 1.0f });//slice_error - volume.first->render(camera, colors,with_outline && volume.first->selected, volume.first->slice_error ? red_color : body_color); + volume.first->render(camera, colors,model,with_outline && volume.first->selected, volume.first->slice_error ? red_color : body_color); } else { if (volume.first->selected) { shader->set_uniform("u_model_matrix", volume.first->world_matrix()); - volume.first->render(camera, colors, false, body_color); + volume.first->render(camera, colors, model, false, body_color); } } @@ -1770,7 +1773,7 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip (volume.first->hover != GLVolume::HS_None || volume.first->force_sinking_contours)) { GUI::wxGetApp().unbind_shader(); glsafe(::glDepthFunc(GL_ALWAYS)); - volume.first->render_sinking_contours(camera); + volume.first->render_sinking_contours(camera, model); glsafe(::glDepthFunc(GL_LESS)); GUI::wxGetApp().bind_shader(shader); } @@ -1785,7 +1788,7 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip glsafe(::glDisable(GL_BLEND)); } -bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, ModelInstanceEPrintVolumeState *out_state, ObjectFilamentResults* object_results) const +bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, ModelInstanceEPrintVolumeState *out_state, ObjectFilamentResults *object_results, Model &model) const { if (GUI::wxGetApp().plater() == NULL) { @@ -1794,15 +1797,15 @@ bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, Mo return false; } - const Model& model = GUI::wxGetApp().plater()->model(); auto volume_below = [](GLVolume& volume) -> bool { return volume.object_idx() != -1 && volume.volume_idx() != -1 && volume.is_below_printbed(); }; // Volume is partially below the print bed, thus a pre-calculated convex hull cannot be used. auto volume_sinking = [](GLVolume& volume) -> bool { return volume.object_idx() != -1 && volume.volume_idx() != -1 && volume.is_sinking(); }; // Cached bounding box of a volume above the print bed. - auto volume_bbox = [volume_sinking](GLVolume& volume) -> BoundingBoxf3 - { return volume_sinking(volume) ? volume.transformed_non_sinking_bounding_box() : volume.transformed_convex_hull_bounding_box(); }; + auto volume_bbox = [volume_sinking ,&model](GLVolume& volume) -> BoundingBoxf3 { + return volume_sinking(volume) ? volume.transformed_non_sinking_bounding_box(model) : volume.transformed_convex_hull_bounding_box(); + }; // Cached 3D convex hull of a volume above the print bed. auto volume_convex_mesh = [volume_sinking, &model](GLVolume& volume) -> const TriangleMesh& { return volume_sinking(volume) ? model.objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh() : *volume.convex_hull(); }; diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index b80f516a1..e6b0219e9 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -354,10 +354,10 @@ protected: public: SinkingContours(GLVolume& volume) : m_parent(volume) {} - void render(const GUI::Camera &camera); + void render(const GUI::Camera &camera, Model &model); private: - void update(); + void update(Model &model); }; SinkingContours m_sinking_contours; @@ -576,9 +576,9 @@ public: // caching variant const BoundingBoxf3& transformed_convex_hull_bounding_box() const; // non-caching variant - BoundingBoxf3 transformed_non_sinking_bounding_box(const Transform3d& trafo) const; + BoundingBoxf3 transformed_non_sinking_bounding_box(const Transform3d &trafo, Model &model) const; // caching variant - const BoundingBoxf3& transformed_non_sinking_bounding_box() const; + const BoundingBoxf3 &transformed_non_sinking_bounding_box(Model &model) const; // convex hull const TriangleMesh* convex_hull() const { return m_convex_hull.get(); } @@ -589,6 +589,7 @@ public: //BBS: add outline related logic and add virtual specifier virtual void render(const GUI::Camera & camera, const std::vector>& colors, + Model & model, bool with_outline = false, const std::array &body_color = {1.0f, 1.0f, 1.0f, 1.0f} ) const; @@ -605,7 +606,7 @@ public: bool is_sinking() const; bool is_below_printbed() const; - void render_sinking_contours(const GUI::Camera &camera); + void render_sinking_contours(const GUI::Camera &camera,Model& model); // Return an estimate of the memory consumed by this class. size_t cpu_memory_used() const { @@ -623,6 +624,7 @@ public: GLWipeTowerVolume(const std::vector>& colors); void render(const GUI::Camera & camera, const std::vector> & colors, + Model & model, bool with_outline = false, const std::array & body_color = {1.0f, 1.0f, 1.0f, 1.0f}) const override; @@ -739,6 +741,7 @@ public: bool disable_cullface, const GUI::Camera & camera, const std::vector>& colors, + Model & model, std::function filter_func = std::function(), bool with_outline = true, const std::array & body_color = {1.0f, 1.0f, 1.0f, 1.0f}, @@ -783,7 +786,7 @@ public: // returns true if all the volumes are completely contained in the print volume // returns the containment state in the given out_state, if non-null - bool check_outside_state(const Slic3r::BuildVolume& build_volume, ModelInstanceEPrintVolumeState* out_state, ObjectFilamentResults* object_results) const; + bool check_outside_state(const Slic3r::BuildVolume& build_volume, ModelInstanceEPrintVolumeState* out_state, ObjectFilamentResults* object_results,Model& model) const; void reset_outside_state(); void update_colors_by_extruder(const DynamicPrintConfig *config, bool is_update_alpha = true); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index ac7584d62..4f45820d1 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4263,7 +4263,7 @@ void GCodeViewer::render_shells() //BBS: reopen cul faces auto& camera = wxGetApp().plater()->get_camera(); std::vector> colors = wxGetApp().plater()->get_extruders_colors(); - m_shells.volumes.render(GUI::ERenderPipelineStage::Normal, GLVolumeCollection::ERenderType::Transparent, false, camera, colors); + m_shells.volumes.render(GUI::ERenderPipelineStage::Normal, GLVolumeCollection::ERenderType::Transparent, false, camera, colors, wxGetApp().plater()->model()); wxGetApp().unbind_shader(); glsafe(::glDepthMask(GL_TRUE)); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e53e48072..d34d5ef54 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -693,7 +693,7 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D & canvas, const 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()); - glvolume->render(camera, colors); + glvolume->render(camera, colors, m_canvas.get_ref_model()); } // Revert back to the previous shader. glBindTexture(GL_TEXTURE_2D, 0); @@ -1679,7 +1679,7 @@ ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state(ObjectFil //assert(m_initialized); ModelInstanceEPrintVolumeState state; - m_volumes.check_outside_state(m_bed.build_volume(), &state, object_results); + m_volumes.check_outside_state(m_bed.build_volume(), &state, object_results,*m_model); construct_error_string(*object_results, get_object_clashed_text()); construct_extruder_unprintable_error(*object_results, get_left_extruder_unprintable_text(), get_right_extruder_unprintable_text()); @@ -3211,7 +3211,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (!m_volumes.empty()) { ModelInstanceEPrintVolumeState state; ObjectFilamentResults object_results; - const bool contained_min_one = m_volumes.check_outside_state(m_bed.build_volume(), &state, &object_results); + const bool contained_min_one = m_volumes.check_outside_state(m_bed.build_volume(), &state, &object_results, *m_model); const bool partlyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Partly_Outside); const bool fullyOut = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Fully_Outside); // const bool objectLimited = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Limited); @@ -7346,7 +7346,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with } } if (m_requires_check_outside_state) { - m_volumes.check_outside_state(build_volume, nullptr, nullptr); + m_volumes.check_outside_state(build_volume, nullptr, nullptr, *m_model); m_requires_check_outside_state = false; } } @@ -7397,7 +7397,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with { if (m_picking_enabled && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f) && GUI::ERenderPipelineStage::Silhouette != render_pipeline_stage) { int object_id = m_layers_editing.last_object_id; - m_volumes.render(render_pipeline_stage, type, false, camera, colors, [object_id](const GLVolume &volume) { + m_volumes.render( + render_pipeline_stage, type, false, camera, colors, *m_model,[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); }); @@ -7413,8 +7414,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with //BBS:add assemble view related logic // do not cull backfaces to show broken geometry, if any m_volumes.render( - render_pipeline_stage, type, m_picking_enabled, camera, - colors,[this, canvas_type](const GLVolume &volume) { + render_pipeline_stage, type, m_picking_enabled, camera, colors, + *m_model,[this, canvas_type](const GLVolume &volume) { if (canvas_type == ECanvasType::CanvasAssembleView) { return !volume.is_modifier && !volume.is_wipe_tower; } @@ -7449,7 +7450,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with }*/ //BBS:add assemble view related logic m_volumes.render( - render_pipeline_stage, type, false, camera, colors, + render_pipeline_stage, type, false, camera, colors,*m_model, [this, canvas_type](const GLVolume &volume) { if (canvas_type == ECanvasType::CanvasAssembleView) { return !volume.is_modifier; @@ -7846,7 +7847,7 @@ void GLCanvas3D::_render_volumes_for_picking() const std::array t_color{ (GLfloat)r * INV_255, (GLfloat)g * INV_255, (GLfloat)b * INV_255, (GLfloat)a * INV_255 }; shader->set_uniform("uniform_color", t_color); volume.first->picking = true; - volume.first->render(camera, colors); // colors is no use here + volume.first->render(camera, colors, *m_model); // colors is no use here volume.first->picking = false; } } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 88962b4ac..90e7e731f 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -827,6 +827,7 @@ public: void set_process(BackgroundSlicingProcess* process); void set_model(Model* model); const Model* get_model() const { return m_model; } + Model& get_ref_model() const { return *m_model; } const Selection& get_selection() const { return m_selection; } Selection& get_selection() { return m_selection; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index a3dd42efe..086835269 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -130,7 +130,7 @@ void GLGizmoFdmSupports::render_painter_gizmo() const const auto & camera = m_parent.get_active_camera(); std::vector> colors = m_parent.get_active_colors(); - m_support_volume->render(camera, colors); + m_support_volume->render(camera, colors, m_parent.get_ref_model()); } m_c->object_clipper()->render_cut();