ENH:The model also uses parameter passing to avoid using global variables

jira: none
Change-Id: I04675dd81509b92160598b3a4359895b13752fa8
(cherry picked from commit eef83dafce93130ecfd078a7ff0a689ec51c66bc)
This commit is contained in:
zhou.xu 2025-04-08 15:18:45 +08:00 committed by lane.wei
parent 682e70ca94
commit 3e0d806040
6 changed files with 46 additions and 38 deletions

View File

@ -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<BoundingBoxf3>* trans_box = const_cast<std::optional<BoundingBoxf3>*>(&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<std::array<float, 4>> &colors, bool with_outline, const std::array<float, 4> &body_color) const
void GLVolume::render(const GUI::Camera &camera, const std::vector<std::array<float, 4>> &colors, Model &model, bool with_outline, const std::array<float, 4> &body_color) const
{
if (!is_active)
return;
@ -851,7 +852,7 @@ void GLVolume::render(const GUI::Camera &camera, const std::vector<std::array<fl
// BBS: add logic for mmu segmentation rendering
auto render_body = [&]() {
bool color_volume = false;
ModelObjectPtrs& model_objects = GUI::wxGetApp().model().objects;
ModelObjectPtrs &model_objects = model.objects;
do {
if ((!printable) || object_idx() >= 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<std::array<float, 4>>& colors)
@ -1226,6 +1227,7 @@ GLWipeTowerVolume::GLWipeTowerVolume(const std::vector<std::array<float, 4>>& co
void GLWipeTowerVolume::render(const GUI::Camera &camera,
const std::vector<std::array<float, 4>> &extruder_colors,
Model &model,
bool with_outline,
const std::array<float, 4> &body_color) const
{
@ -1619,6 +1621,7 @@ void GLVolumeCollection::render(GUI::ERenderPipelineStage render_pip
bool disable_cullface,
const GUI::Camera & camera,
const std::vector<std::array<float, 4>>& colors,
Model& model,
std::function<bool(const GLVolume &)> filter_func,
bool with_outline,
const std::array<float, 4> & 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<float, 4>({ 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(); };

View File

@ -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<std::array<float, 4>>& colors,
Model & model,
bool with_outline = false,
const std::array<float, 4> &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<std::array<float, 4>>& colors);
void render(const GUI::Camera & camera,
const std::vector<std::array<float, 4>> & colors,
Model & model,
bool with_outline = false,
const std::array<float, 4> & 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<std::array<float, 4>>& colors,
Model & model,
std::function<bool(const GLVolume &)> filter_func = std::function<bool(const GLVolume &)>(),
bool with_outline = true,
const std::array<float, 4> & 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);

View File

@ -4263,7 +4263,7 @@ void GCodeViewer::render_shells()
//BBS: reopen cul faces
auto& camera = wxGetApp().plater()->get_camera();
std::vector<std::array<float, 4>> 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));

View File

@ -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<float, 4> 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;
}
}

View File

@ -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; }

View File

@ -130,7 +130,7 @@ void GLGizmoFdmSupports::render_painter_gizmo() const
const auto & camera = m_parent.get_active_camera();
std::vector<std::array<float, 4>> 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();