Clipping plane can now handle multiple-part objects

This commit is contained in:
Lukas Matena 2020-04-08 11:52:22 +02:00
parent fe57826695
commit c32fa67523
2 changed files with 41 additions and 23 deletions

View file

@ -284,15 +284,24 @@ void ObjectClipper::on_update()
return; return;
// which mesh should be cut? // which mesh should be cut?
const TriangleMesh* mesh = &mo->volumes.front()->mesh(); std::vector<const TriangleMesh*> meshes;
bool has_hollowed = get_pool()->hollowed_mesh() && get_pool()->hollowed_mesh()->get_hollowed_mesh(); bool has_hollowed = get_pool()->hollowed_mesh() && get_pool()->hollowed_mesh()->get_hollowed_mesh();
if (has_hollowed) if (has_hollowed)
mesh = get_pool()->hollowed_mesh()->get_hollowed_mesh(); meshes.push_back(get_pool()->hollowed_mesh()->get_hollowed_mesh());
if (mesh != m_old_mesh) { if (meshes.empty()) {
m_clipper.reset(new MeshClipper); for (const ModelVolume* mv : mo->volumes)
m_clipper->set_mesh(*mesh); if (mv->is_model_part())
m_old_mesh = mesh; meshes.push_back(&mv->mesh());
}
if (meshes != m_old_meshes) {
m_clippers.clear();
for (const TriangleMesh* mesh : meshes) {
m_clippers.emplace_back(new MeshClipper);
m_clippers.back()->set_mesh(*mesh);
}
m_old_meshes = meshes;
m_active_inst_bb_radius = m_active_inst_bb_radius =
mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius(); mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius();
//if (has_hollowed && m_clp_ratio != 0.) //if (has_hollowed && m_clp_ratio != 0.)
@ -303,8 +312,8 @@ void ObjectClipper::on_update()
void ObjectClipper::on_release() void ObjectClipper::on_release()
{ {
m_clipper.reset(); m_clippers.clear();
m_old_mesh = nullptr; m_old_meshes.clear();
m_clp.reset(); m_clp.reset();
m_clp_ratio = 0.; m_clp_ratio = 0.;
@ -317,22 +326,31 @@ void ObjectClipper::render_cut() const
const SelectionInfo* sel_info = get_pool()->selection_info(); const SelectionInfo* sel_info = get_pool()->selection_info();
const ModelObject* mo = sel_info->model_object(); const ModelObject* mo = sel_info->model_object();
Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation();
Geometry::Transformation vol_trafo = mo->volumes.front()->get_transformation();
size_t clipper_id = 0;
for (const ModelVolume* mv : mo->volumes) {
if (! mv->is_model_part())
continue;
Geometry::Transformation vol_trafo = mv->get_transformation();
Geometry::Transformation trafo = inst_trafo * vol_trafo; Geometry::Transformation trafo = inst_trafo * vol_trafo;
trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift())); trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift()));
m_clipper->set_plane(*m_clp); auto& clipper = m_clippers[clipper_id];
m_clipper->set_transformation(trafo); clipper->set_plane(*m_clp);
clipper->set_transformation(trafo);
if (! m_clipper->get_triangles().empty()) { if (! clipper->get_triangles().empty()) {
::glPushMatrix(); ::glPushMatrix();
::glColor3f(1.0f, 0.37f, 0.0f); ::glColor3f(1.0f, 0.37f, 0.0f);
::glBegin(GL_TRIANGLES); ::glBegin(GL_TRIANGLES);
for (const Vec3f& point : m_clipper->get_triangles()) for (const Vec3f& point : clipper->get_triangles())
::glVertex3f(point(0), point(1), point(2)); ::glVertex3f(point(0), point(1), point(2));
::glEnd(); ::glEnd();
::glPopMatrix(); ::glPopMatrix();
} }
++clipper_id;
}
} }

View file

@ -257,8 +257,8 @@ protected:
void on_release() override; void on_release() override;
private: private:
const TriangleMesh* m_old_mesh = nullptr; std::vector<const TriangleMesh*> m_old_meshes;
std::unique_ptr<MeshClipper> m_clipper; std::vector<std::unique_ptr<MeshClipper>> m_clippers;
std::unique_ptr<ClippingPlane> m_clp; std::unique_ptr<ClippingPlane> m_clp;
double m_clp_ratio = 0.; double m_clp_ratio = 0.;
double m_active_inst_bb_radius = 0.; double m_active_inst_bb_radius = 0.;