SLA gizmo - making sure the cone direction is correctly undone/redone

This commit is contained in:
Lukas Matena 2019-07-29 15:08:59 +02:00
parent eeef3b42df
commit 07608a80cd
2 changed files with 25 additions and 31 deletions

View file

@ -64,7 +64,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
return;
}
if (m_model_object != model_object) {
if (m_model_object != model_object || m_model_object_id != model_object->id()) {
m_model_object = model_object;
m_print_object_idx = -1;
}
@ -105,7 +105,8 @@ void GLGizmoSlaSupports::on_render() const
// If current m_model_object does not match selection, ask GLCanvas3D to turn us off
if (m_state == On
&& (m_model_object != selection.get_model()->objects[selection.get_object_idx()]
|| m_active_instance != selection.get_instance_idx())) {
|| m_active_instance != selection.get_instance_idx()
|| m_model_object_id != m_model_object->id())) {
m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS));
return;
}
@ -390,7 +391,7 @@ bool GLGizmoSlaSupports::is_point_clipped(const Vec3d& point) const
bool GLGizmoSlaSupports::is_mesh_update_necessary() const
{
return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty())
&& ((m_model_object->id() != m_current_mesh_object_id) || m_its == nullptr);
&& ((m_model_object->id() != m_model_object_id) || m_its == nullptr);
}
@ -407,7 +408,7 @@ void GLGizmoSlaSupports::update_mesh()
m_its = &m_mesh->its;
// If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it.
if (m_current_mesh_object_id != m_model_object->id() || (m_AABB.m_left == NULL && m_AABB.m_right == NULL))
if (m_model_object_id != m_model_object->id() || (m_AABB.m_left == NULL && m_AABB.m_right == NULL))
{
m_AABB.deinit();
m_AABB.init(
@ -415,7 +416,7 @@ void GLGizmoSlaSupports::update_mesh()
MapMatrixXiUnaligned(m_its->indices.front().data(), m_its->indices.size(), 3));
}
m_current_mesh_object_id = m_model_object->id();
m_model_object_id = m_model_object->id();
disable_editing_mode();
}
@ -1080,25 +1081,14 @@ void GLGizmoSlaSupports::on_set_state()
{
// m_model_object pointer can be invalid (for instance because of undo/redo action),
// we should recover it from the object id
const ModelObject* old_model_object = m_model_object;
m_model_object = nullptr;
for (const auto mo : wxGetApp().model().objects) {
if (mo->id() == m_current_mesh_object_id) {
if (mo->id() == m_model_object_id) {
m_model_object = mo;
break;
}
}
// If ModelObject pointer really changed, invalidate mesh and do everything
// as if the gizmo was switched from Off state
/*if (m_model_object == nullptr || old_model_object != m_model_object) {
m_mesh = nullptr;
m_its = nullptr;
if (m_state == On)
m_old_state = Off;
}*/
if (m_state == On && m_old_state != On) { // the gizmo was just turned on
if (is_mesh_update_necessary())
update_mesh();
@ -1150,23 +1140,27 @@ void GLGizmoSlaSupports::on_start_dragging()
if (m_hover_id != -1) {
select_point(NoPoints);
select_point(m_hover_id);
m_dragged_point_initial_pos = m_editing_cache[m_hover_id].support_point.pos;
m_point_before_drag = m_editing_cache[m_hover_id];
}
else
m_point_before_drag = CacheEntry();
}
void GLGizmoSlaSupports::on_stop_dragging()
{
Vec3f backup = m_editing_cache[m_hover_id].support_point.pos;
if (m_hover_id != -1) {
CacheEntry backup = m_editing_cache[m_hover_id];
if (backup != Vec3f::Zero() // some point was touched
&& backup != m_dragged_point_initial_pos) // and it was moved, not just selected
{
m_editing_cache[m_hover_id].support_point.pos = m_dragged_point_initial_pos;
wxGetApp().plater()->take_snapshot(_(L("Move support point")));
m_editing_cache[m_hover_id].support_point.pos = backup;
m_dragged_point_initial_pos = Vec3f::Zero();
if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched
&& backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected
{
m_editing_cache[m_hover_id] = m_point_before_drag;
wxGetApp().plater()->take_snapshot(_(L("Move support point")));
m_editing_cache[m_hover_id] = backup;
}
}
m_point_before_drag = CacheEntry();
}
@ -1175,7 +1169,7 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar)
{
ar(m_clipping_plane_distance,
m_clipping_plane_normal,
m_current_mesh_object_id,
m_model_object_id,
m_new_point_head_diameter,
m_normal_cache,
m_editing_cache
@ -1188,7 +1182,7 @@ void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const
{
ar(m_clipping_plane_distance,
m_clipping_plane_normal,
m_current_mesh_object_id,
m_model_object_id,
m_new_point_head_diameter,
m_normal_cache,
m_editing_cache

View file

@ -28,7 +28,7 @@ class GLGizmoSlaSupports : public GLGizmoBase
{
private:
ModelObject* m_model_object = nullptr;
ObjectID m_current_mesh_object_id = 0;
ObjectID m_model_object_id = 0;
int m_active_instance = -1;
float m_active_instance_bb_radius; // to cache the bb
mutable float m_z_shift = 0.f;
@ -105,8 +105,8 @@ private:
bool m_editing_mode = false; // Is editing mode active?
bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes).
float m_new_point_head_diameter; // Size of a new point.
Vec3f m_dragged_point_initial_pos = Vec3f::Zero(); //undo/redo
float m_old_point_head_diameter = 0.f; // undo/redo
CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited
float m_old_point_head_diameter = 0.; // the same
float m_minimal_point_distance = 20.f;
mutable std::vector<CacheEntry> m_editing_cache; // a support point and whether it is currently selected
std::vector<sla::SupportPoint> m_normal_cache; // to restore after discarding changes or undo/redo