mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 17:45:57 +08:00
Follow-up of 4e188c71c30677c64d97404c36d6cc8181938644 - Betterfix for update of non selected instances when applying mirror
This commit is contained in:
parent
130f0dff84
commit
4e315bcf27
@ -550,12 +550,16 @@ void Transformation::set_rotation(Axis axis, double rotation)
|
|||||||
Vec3d Transformation::get_scaling_factor() const
|
Vec3d Transformation::get_scaling_factor() const
|
||||||
{
|
{
|
||||||
const Transform3d scale = extract_scale(m_matrix);
|
const Transform3d scale = extract_scale(m_matrix);
|
||||||
return { scale(0, 0), scale(1, 1), scale(2, 2) };
|
return { std::abs(scale(0, 0)), std::abs(scale(1, 1)), std::abs(scale(2, 2)) };
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform3d Transformation::get_scaling_factor_matrix() const
|
Transform3d Transformation::get_scaling_factor_matrix() const
|
||||||
{
|
{
|
||||||
return extract_scale(m_matrix);
|
Transform3d scale = extract_scale(m_matrix);
|
||||||
|
scale(0, 0) = std::abs(scale(0, 0));
|
||||||
|
scale(1, 1) = std::abs(scale(1, 1));
|
||||||
|
scale(2, 2) = std::abs(scale(2, 2));
|
||||||
|
return scale;
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
@ -577,6 +581,8 @@ void Transformation::set_scaling_factor(const Vec3d& scaling_factor)
|
|||||||
void Transformation::set_scaling_factor(Axis axis, double scaling_factor)
|
void Transformation::set_scaling_factor(Axis axis, double scaling_factor)
|
||||||
{
|
{
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
|
assert(scaling_factor > 0.0);
|
||||||
|
|
||||||
auto [rotation, scale] = extract_rotation_scale(m_matrix);
|
auto [rotation, scale] = extract_rotation_scale(m_matrix);
|
||||||
scale(axis, axis) = scaling_factor;
|
scale(axis, axis) = scaling_factor;
|
||||||
|
|
||||||
@ -600,8 +606,11 @@ Vec3d Transformation::get_mirror() const
|
|||||||
|
|
||||||
Transform3d Transformation::get_mirror_matrix() const
|
Transform3d Transformation::get_mirror_matrix() const
|
||||||
{
|
{
|
||||||
const Vec3d scale = get_scaling_factor();
|
Transform3d scale = extract_scale(m_matrix);
|
||||||
return scale_transform({ scale.x() / std::abs(scale.x()), scale.y() / std::abs(scale.y()), scale.z() / std::abs(scale.z()) });
|
scale(0, 0) = scale(0, 0) / std::abs(scale(0, 0));
|
||||||
|
scale(1, 1) = scale(1, 1) / std::abs(scale(1, 1));
|
||||||
|
scale(2, 2) = scale(2, 2) / std::abs(scale(2, 2));
|
||||||
|
return scale;
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
@ -617,13 +626,17 @@ void Transformation::set_mirror(const Vec3d& mirror)
|
|||||||
copy(i) /= abs_mirror(i);
|
copy(i) /= abs_mirror(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Vec3d curr_scale = get_scaling_factor();
|
auto [rotation, scale] = extract_rotation_scale(m_matrix);
|
||||||
const Vec3d signs = curr_scale.cwiseProduct(copy);
|
const Vec3d curr_scales = { scale(0, 0), scale(1, 1), scale(2, 2) };
|
||||||
set_scaling_factor({
|
const Vec3d signs = curr_scales.cwiseProduct(copy);
|
||||||
signs.x() < 0.0 ? std::abs(curr_scale.x()) * copy.x() : curr_scale.x(),
|
|
||||||
signs.y() < 0.0 ? std::abs(curr_scale.y()) * copy.y() : curr_scale.y(),
|
if (signs[0] < 0.0) scale(0, 0) = -scale(0, 0);
|
||||||
signs.z() < 0.0 ? std::abs(curr_scale.z()) * copy.z() : curr_scale.z()
|
if (signs[1] < 0.0) scale(1, 1) = -scale(1, 1);
|
||||||
});
|
if (signs[2] < 0.0) scale(2, 2) = -scale(2, 2);
|
||||||
|
|
||||||
|
const Vec3d offset = get_offset();
|
||||||
|
m_matrix = rotation * scale;
|
||||||
|
m_matrix.translation() = offset;
|
||||||
#else
|
#else
|
||||||
set_mirror(X, mirror.x());
|
set_mirror(X, mirror.x());
|
||||||
set_mirror(Y, mirror.y());
|
set_mirror(Y, mirror.y());
|
||||||
@ -640,9 +653,15 @@ void Transformation::set_mirror(Axis axis, double mirror)
|
|||||||
mirror /= abs_mirror;
|
mirror /= abs_mirror;
|
||||||
|
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
const double curr_scale = get_scaling_factor(axis);
|
auto [rotation, scale] = extract_rotation_scale(m_matrix);
|
||||||
|
const double curr_scale = scale(axis, axis);
|
||||||
const double sign = curr_scale * mirror;
|
const double sign = curr_scale * mirror;
|
||||||
set_scaling_factor(axis, sign < 0.0 ? std::abs(curr_scale) * mirror : curr_scale);
|
|
||||||
|
if (sign < 0.0) scale(axis, axis) = -scale(axis, axis);
|
||||||
|
|
||||||
|
const Vec3d offset = get_offset();
|
||||||
|
m_matrix = rotation * scale;
|
||||||
|
m_matrix.translation() = offset;
|
||||||
#else
|
#else
|
||||||
if (m_mirror(axis) != mirror) {
|
if (m_mirror(axis) != mirror) {
|
||||||
m_mirror(axis) = mirror;
|
m_mirror(axis) = mirror;
|
||||||
@ -746,7 +765,6 @@ Transform3d Transformation::get_matrix_no_scaling_factor() const
|
|||||||
{
|
{
|
||||||
Transformation copy(*this);
|
Transformation copy(*this);
|
||||||
copy.reset_scaling_factor();
|
copy.reset_scaling_factor();
|
||||||
copy.reset_mirror();
|
|
||||||
return copy.get_matrix();
|
return copy.get_matrix();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -2981,6 +2981,7 @@ void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_
|
|||||||
const Geometry::Transformation& curr_inst_trafo_i = volume_i->get_instance_transformation();
|
const Geometry::Transformation& curr_inst_trafo_i = volume_i->get_instance_transformation();
|
||||||
const Vec3d curr_inst_rotation_i = curr_inst_trafo_i.get_rotation();
|
const Vec3d curr_inst_rotation_i = curr_inst_trafo_i.get_rotation();
|
||||||
const Vec3d& curr_inst_scaling_factor_i = curr_inst_trafo_i.get_scaling_factor();
|
const Vec3d& curr_inst_scaling_factor_i = curr_inst_trafo_i.get_scaling_factor();
|
||||||
|
const Vec3d& curr_inst_mirror_i = curr_inst_trafo_i.get_mirror();
|
||||||
const Vec3d old_inst_rotation_i = m_cache.volumes_data[i].get_instance_transform().get_rotation();
|
const Vec3d old_inst_rotation_i = m_cache.volumes_data[i].get_instance_transform().get_rotation();
|
||||||
#else
|
#else
|
||||||
const Vec3d& rotation = volume_i->get_instance_rotation();
|
const Vec3d& rotation = volume_i->get_instance_rotation();
|
||||||
@ -3053,7 +3054,7 @@ void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_
|
|||||||
|
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
volume_j->set_instance_transformation(Geometry::assemble_transform(new_inst_offset_j, new_inst_rotation_j,
|
volume_j->set_instance_transformation(Geometry::assemble_transform(new_inst_offset_j, new_inst_rotation_j,
|
||||||
curr_inst_scaling_factor_i));
|
curr_inst_scaling_factor_i, curr_inst_mirror_i));
|
||||||
#else
|
#else
|
||||||
volume_j->set_instance_scaling_factor(scaling_factor);
|
volume_j->set_instance_scaling_factor(scaling_factor);
|
||||||
volume_j->set_instance_mirror(mirror);
|
volume_j->set_instance_mirror(mirror);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user