Fixing sla support point and drillhole transformations

May brake compatibility with 3mf files storing these objects from from previous Slic3r versions
This commit is contained in:
tamasmeszaros 2023-01-17 13:13:09 +01:00
parent 9ee71ddd92
commit 873725d905
4 changed files with 35 additions and 8 deletions

View file

@ -292,8 +292,6 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st
m = generate_preview_vdb(po, step); m = generate_preview_vdb(po, step);
} }
assert(!po.m_preview_meshes[step]);
if (!m.empty()) if (!m.empty())
po.m_preview_meshes[step] = po.m_preview_meshes[step] =
std::make_shared<const indexed_triangle_set>(std::move(m)); std::make_shared<const indexed_triangle_set>(std::move(m));

View file

@ -463,7 +463,16 @@ void GLGizmoHollow::update_hole_raycasters_for_picking_transform()
assert(!m_hole_raycasters.empty()); assert(!m_hole_raycasters.empty());
const GLVolume* vol = m_parent.get_selection().get_first_volume(); const GLVolume* vol = m_parent.get_selection().get_first_volume();
const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_scaling_factor_matrix().inverse(); Geometry::Transformation transformation(vol->get_instance_transformation());
auto *inst = m_c->selection_info()->model_instance();
if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) {
double shift_z = m_c->selection_info()->print_object()->get_current_elevation();
auto trafo = inst->get_transformation().get_matrix();
trafo.translation()(2) += shift_z;
transformation.set_matrix(trafo);
}
const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse();
for (size_t i = 0; i < drain_holes.size(); ++i) { for (size_t i = 0; i < drain_holes.size(); ++i) {
const sla::DrainHole& drain_hole = drain_holes[i]; const sla::DrainHole& drain_hole = drain_holes[i];
@ -471,7 +480,7 @@ void GLGizmoHollow::update_hole_raycasters_for_picking_transform()
Eigen::Quaterniond q; Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast<double>()); q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast<double>());
const Eigen::AngleAxisd aa(q); const Eigen::AngleAxisd aa(q);
const Transform3d matrix = vol->world_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * const Transform3d matrix = transformation.get_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) *
Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength));
m_hole_raycasters[i]->set_transform(matrix); m_hole_raycasters[i]->set_transform(matrix);
} }

View file

@ -148,12 +148,23 @@ bool GLGizmoSlaBase::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f,
if (m_volumes.volumes.empty()) if (m_volumes.volumes.empty())
return false; return false;
auto *inst = m_c->selection_info()->model_instance();
if (!inst)
return false;
Transform3d trafo = m_volumes.volumes.front()->world_matrix();
if (m_c->selection_info() && m_c->selection_info()->print_object()) {
double shift_z = m_c->selection_info()->print_object()->get_current_elevation();
trafo = inst->get_transformation().get_matrix();
trafo.translation()(2) += shift_z;
}
// The raycaster query // The raycaster query
Vec3f hit; Vec3f hit;
Vec3f normal; Vec3f normal;
if (m_c->raycaster()->raycaster()->unproject_on_mesh( if (m_c->raycaster()->raycaster()->unproject_on_mesh(
mouse_pos, mouse_pos,
m_volumes.volumes.front()->world_matrix(), trafo/*m_volumes.volumes.front()->world_matrix()*/,
wxGetApp().plater()->get_camera(), wxGetApp().plater()->get_camera(),
hit, hit,
normal, normal,

View file

@ -1184,7 +1184,16 @@ void GLGizmoSlaSupports::update_point_raycasters_for_picking_transform()
assert(!m_point_raycasters.empty()); assert(!m_point_raycasters.empty());
const GLVolume* vol = m_parent.get_selection().get_first_volume(); const GLVolume* vol = m_parent.get_selection().get_first_volume();
const Geometry::Transformation transformation(vol->world_matrix()); Geometry::Transformation transformation(vol->world_matrix());
auto *inst = m_c->selection_info()->model_instance();
if (inst && m_c->selection_info() && m_c->selection_info()->print_object()) {
double shift_z = m_c->selection_info()->print_object()->get_current_elevation();
auto trafo = inst->get_transformation().get_matrix();
trafo.translation()(2) += shift_z;
transformation.set_matrix(trafo);
}
const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse();
for (size_t i = 0; i < m_editing_cache.size(); ++i) { for (size_t i = 0; i < m_editing_cache.size(); ++i) {
const Transform3d support_matrix = Geometry::translation_transform(m_editing_cache[i].support_point.pos.cast<double>()) * instance_scaling_matrix_inverse; const Transform3d support_matrix = Geometry::translation_transform(m_editing_cache[i].support_point.pos.cast<double>()) * instance_scaling_matrix_inverse;
@ -1195,13 +1204,13 @@ void GLGizmoSlaSupports::update_point_raycasters_for_picking_transform()
Eigen::Quaterniond q; Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast<double>()); q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast<double>());
const Eigen::AngleAxisd aa(q); const Eigen::AngleAxisd aa(q);
const Transform3d cone_matrix = vol->world_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * const Transform3d cone_matrix = transformation.get_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) *
Geometry::assemble_transform((CONE_HEIGHT + m_editing_cache[i].support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), Geometry::assemble_transform((CONE_HEIGHT + m_editing_cache[i].support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(),
Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT)); Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT));
m_point_raycasters[i].second->set_transform(cone_matrix); m_point_raycasters[i].second->set_transform(cone_matrix);
const double radius = (double)m_editing_cache[i].support_point.head_front_radius * RenderPointScale; const double radius = (double)m_editing_cache[i].support_point.head_front_radius * RenderPointScale;
const Transform3d sphere_matrix = vol->world_matrix() * support_matrix * Geometry::scale_transform(radius); const Transform3d sphere_matrix = transformation.get_matrix() * support_matrix * Geometry::scale_transform(radius);
m_point_raycasters[i].first->set_transform(sphere_matrix); m_point_raycasters[i].first->set_transform(sphere_matrix);
} }
} }