mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 07:05:56 +08:00
Tech ENABLE_WORLD_COORDINATE - Fixed size of Move Gizmo in 3D scene
This commit is contained in:
parent
fcacc7042c
commit
49fdf01319
@ -149,7 +149,10 @@ void GLGizmoMove3D::on_render()
|
|||||||
glsafe(::glEnable(GL_DEPTH_TEST));
|
glsafe(::glEnable(GL_DEPTH_TEST));
|
||||||
|
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
calc_selection_box_and_center();
|
const Selection& selection = m_parent.get_selection();
|
||||||
|
const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system();
|
||||||
|
m_bounding_box = box;
|
||||||
|
m_center = box_trafo.translation();
|
||||||
const Transform3d base_matrix = local_transform(m_parent.get_selection());
|
const Transform3d base_matrix = local_transform(m_parent.get_selection());
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 3; ++i) {
|
||||||
m_grabbers[i].matrix = base_matrix;
|
m_grabbers[i].matrix = base_matrix;
|
||||||
@ -363,33 +366,6 @@ Transform3d GLGizmoMove3D::local_transform(const Selection& selection) const
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoMove3D::calc_selection_box_and_center()
|
|
||||||
{
|
|
||||||
const Selection& selection = m_parent.get_selection();
|
|
||||||
const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type();
|
|
||||||
if (coordinates_type == ECoordinatesType::World) {
|
|
||||||
m_bounding_box = selection.get_bounding_box();
|
|
||||||
m_center = m_bounding_box.center();
|
|
||||||
}
|
|
||||||
else if (coordinates_type == ECoordinatesType::Local && selection.is_single_volume_or_modifier()) {
|
|
||||||
const GLVolume& v = *selection.get_first_volume();
|
|
||||||
m_bounding_box = v.transformed_convex_hull_bounding_box(
|
|
||||||
v.get_instance_transformation().get_scaling_factor_matrix() * v.get_volume_transformation().get_scaling_factor_matrix());
|
|
||||||
m_center = v.world_matrix() * m_bounding_box.center();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_bounding_box.reset();
|
|
||||||
const Selection::IndicesList& ids = selection.get_volume_idxs();
|
|
||||||
for (unsigned int id : ids) {
|
|
||||||
const GLVolume& v = *selection.get_volume(id);
|
|
||||||
m_bounding_box.merge(v.transformed_convex_hull_bounding_box(v.get_volume_transformation().get_matrix()));
|
|
||||||
}
|
|
||||||
const Geometry::Transformation inst_trafo = selection.get_first_volume()->get_instance_transformation();
|
|
||||||
m_bounding_box = m_bounding_box.transformed(inst_trafo.get_scaling_factor_matrix());
|
|
||||||
m_center = inst_trafo.get_matrix_no_scaling_factor() * m_bounding_box.center();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
} // namespace GUI
|
} // namespace GUI
|
||||||
|
@ -67,7 +67,6 @@ private:
|
|||||||
double calc_projection(const UpdateData& data) const;
|
double calc_projection(const UpdateData& data) const;
|
||||||
#if ENABLE_WORLD_COORDINATE
|
#if ENABLE_WORLD_COORDINATE
|
||||||
Transform3d local_transform(const Selection& selection) const;
|
Transform3d local_transform(const Selection& selection) const;
|
||||||
void calc_selection_box_and_center();
|
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -802,7 +802,6 @@ const BoundingBoxf3& Selection::get_full_unscaled_instance_local_bounding_box()
|
|||||||
return *m_full_unscaled_instance_local_bounding_box;
|
return *m_full_unscaled_instance_local_bounding_box;
|
||||||
}
|
}
|
||||||
|
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
const std::pair<BoundingBoxf3, Transform3d>& Selection::get_bounding_box_in_current_reference_system() const
|
const std::pair<BoundingBoxf3, Transform3d>& Selection::get_bounding_box_in_current_reference_system() const
|
||||||
{
|
{
|
||||||
static int last_coordinates_type = -1;
|
static int last_coordinates_type = -1;
|
||||||
@ -925,7 +924,6 @@ const std::pair<BoundingBoxf3, Transform3d>& Selection::get_bounding_box_in_curr
|
|||||||
|
|
||||||
return *m_bounding_box_in_current_reference_system;
|
return *m_bounding_box_in_current_reference_system;
|
||||||
}
|
}
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
void Selection::setup_cache()
|
void Selection::setup_cache()
|
||||||
@ -961,7 +959,8 @@ void Selection::translate(const Vec3d& displacement, TransformationType transfor
|
|||||||
else {
|
else {
|
||||||
if (transformation_type.local()) {
|
if (transformation_type.local()) {
|
||||||
const Geometry::Transformation& vol_trafo = volume_data.get_volume_transform();
|
const Geometry::Transformation& vol_trafo = volume_data.get_volume_transform();
|
||||||
v.set_volume_offset(vol_trafo.get_offset() + vol_trafo.get_rotation_matrix() * displacement);
|
const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform();
|
||||||
|
v.set_volume_offset(vol_trafo.get_offset() + inst_trafo.get_scaling_factor_matrix().inverse() * vol_trafo.get_rotation_matrix() * displacement);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Vec3d relative_disp = displacement;
|
Vec3d relative_disp = displacement;
|
||||||
|
@ -242,11 +242,9 @@ private:
|
|||||||
// Bounding box of a single full instance selection, in local coordinates, with no instance scaling applied.
|
// Bounding box of a single full instance selection, in local coordinates, with no instance scaling applied.
|
||||||
// Modifiers are taken in account
|
// Modifiers are taken in account
|
||||||
std::optional<BoundingBoxf3> m_full_unscaled_instance_local_bounding_box;
|
std::optional<BoundingBoxf3> m_full_unscaled_instance_local_bounding_box;
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
// Bounding box aligned to the axis of the currently selected reference system (World/Object/Part)
|
// Bounding box aligned to the axis of the currently selected reference system (World/Object/Part)
|
||||||
// and transform to place and orient it in world coordinates
|
// and transform to place and orient it in world coordinates
|
||||||
std::optional<std::pair<BoundingBoxf3, Transform3d>> m_bounding_box_in_current_reference_system;
|
std::optional<std::pair<BoundingBoxf3, Transform3d>> m_bounding_box_in_current_reference_system;
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
#if ENABLE_RENDER_SELECTION_CENTER
|
#if ENABLE_RENDER_SELECTION_CENTER
|
||||||
@ -393,11 +391,9 @@ public:
|
|||||||
// Bounding box of a single full instance selection, in local coordinates, with no instance scaling applied.
|
// Bounding box of a single full instance selection, in local coordinates, with no instance scaling applied.
|
||||||
// Modifiers are taken in account
|
// Modifiers are taken in account
|
||||||
const BoundingBoxf3& get_full_unscaled_instance_local_bounding_box() const;
|
const BoundingBoxf3& get_full_unscaled_instance_local_bounding_box() const;
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
// Returns the bounding box aligned to the axis of the currently selected reference system (World/Object/Part)
|
// Returns the bounding box aligned to the axis of the currently selected reference system (World/Object/Part)
|
||||||
// and the transform to place and orient it in world coordinates
|
// and the transform to place and orient it in world coordinates
|
||||||
const std::pair<BoundingBoxf3, Transform3d>& get_bounding_box_in_current_reference_system() const;
|
const std::pair<BoundingBoxf3, Transform3d>& get_bounding_box_in_current_reference_system() const;
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
#endif // ENABLE_WORLD_COORDINATE
|
#endif // ENABLE_WORLD_COORDINATE
|
||||||
|
|
||||||
void setup_cache();
|
void setup_cache();
|
||||||
@ -474,9 +470,7 @@ private:
|
|||||||
m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset();
|
m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset();
|
||||||
m_full_unscaled_instance_bounding_box.reset(); m_full_scaled_instance_bounding_box.reset();
|
m_full_unscaled_instance_bounding_box.reset(); m_full_scaled_instance_bounding_box.reset();
|
||||||
m_full_unscaled_instance_local_bounding_box.reset();
|
m_full_unscaled_instance_local_bounding_box.reset();
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
m_bounding_box_in_current_reference_system.reset();
|
m_bounding_box_in_current_reference_system.reset();
|
||||||
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); }
|
void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user