SLA gizmo and undo/redo: 'autogenerated points' state is now correctly undone/redone

This commit is contained in:
Lukas Matena 2019-07-22 13:25:17 +02:00
parent 0a5f8aa2e8
commit 0ae46b0635
2 changed files with 30 additions and 12 deletions

View file

@ -82,7 +82,9 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
editing_mode_reload_cache(); editing_mode_reload_cache();
} }
if (m_editing_mode_cache.empty() && m_model_object->sla_points_status != sla::PointsStatus::UserModified) if (m_editing_mode_cache.empty()
&& m_model_object->sla_points_status != sla::PointsStatus::UserModified
&& m_model_object->sla_points_status != sla::PointsStatus::None)
get_data_from_backend(); get_data_from_backend();
if (m_state == On) { if (m_state == On) {
@ -1122,9 +1124,13 @@ void GLGizmoSlaSupports::on_start_dragging()
void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar)
{ {
if (m_editing_mode)
editing_mode_discard_changes();
ar(m_clipping_plane_distance, ar(m_clipping_plane_distance,
m_clipping_plane_normal, m_clipping_plane_normal,
m_current_mesh_object_id m_current_mesh_object_id,
m_editing_mode_cache
); );
} }
@ -1134,7 +1140,8 @@ void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const
{ {
ar(m_clipping_plane_distance, ar(m_clipping_plane_distance,
m_clipping_plane_normal, m_clipping_plane_normal,
m_current_mesh_object_id m_current_mesh_object_id,
m_editing_mode_cache
); );
} }
@ -1177,16 +1184,16 @@ void GLGizmoSlaSupports::editing_mode_discard_changes()
// If the points were autogenerated, they may not be on the ModelObject yet. // If the points were autogenerated, they may not be on the ModelObject yet.
// Because the user probably messed with the cache, we will get the data // Because the user probably messed with the cache, we will get the data
// from the backend again. // from the backend again.
/*if (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated) {
if (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated)
get_data_from_backend(); get_data_from_backend();
else { }
m_editing_mode_cache.clear(); else
for (const sla::SupportPoint& point : m_model_object->sla_support_points) editing_mode_reload_cache();*/
m_editing_mode_cache.emplace_back(point, false);
} m_editing_mode_cache = m_old_cache;
m_editing_mode = false;
m_unsaved_changes = false; m_editing_mode = false;
m_unsaved_changes = false;
} }
@ -1196,7 +1203,13 @@ void GLGizmoSlaSupports::editing_mode_apply_changes()
// If there are no changes, don't touch the front-end. The data in the cache could have been // If there are no changes, don't touch the front-end. The data in the cache could have been
// taken from the backend and copying them to ModelObject would needlessly invalidate them. // taken from the backend and copying them to ModelObject would needlessly invalidate them.
if (m_unsaved_changes) { if (m_unsaved_changes) {
// In order to make the undo/redo snapshot, we must first temporarily restore
// the editing cache to the state before the edits were made.
std::vector<CacheEntry> backup = m_editing_mode_cache;
m_editing_mode_cache = m_old_cache;
wxGetApp().plater()->take_snapshot(_(L("Support points edit"))); wxGetApp().plater()->take_snapshot(_(L("Support points edit")));
m_editing_mode_cache = std::move(backup);
m_model_object->sla_points_status = sla::PointsStatus::UserModified; m_model_object->sla_points_status = sla::PointsStatus::UserModified;
m_model_object->sla_support_points.clear(); m_model_object->sla_support_points.clear();
for (const CacheEntry& cache_entry : m_editing_mode_cache) for (const CacheEntry& cache_entry : m_editing_mode_cache)
@ -1216,6 +1229,7 @@ void GLGizmoSlaSupports::editing_mode_apply_changes()
void GLGizmoSlaSupports::editing_mode_reload_cache() void GLGizmoSlaSupports::editing_mode_reload_cache()
{ {
m_editing_mode_cache.clear(); m_editing_mode_cache.clear();
for (const sla::SupportPoint& point : m_model_object->sla_support_points) for (const sla::SupportPoint& point : m_model_object->sla_support_points)
m_editing_mode_cache.emplace_back(point, false); m_editing_mode_cache.emplace_back(point, false);
@ -1271,6 +1285,8 @@ void GLGizmoSlaSupports::switch_to_editing_mode()
editing_mode_reload_cache(); editing_mode_reload_cache();
m_unsaved_changes = false; m_unsaved_changes = false;
m_editing_mode = true; m_editing_mode = true;
m_old_cache = m_editing_mode_cache;
select_point(NoPoints);
} }

View file

@ -98,6 +98,8 @@ private:
float m_new_point_head_diameter; // Size of a new point. float m_new_point_head_diameter; // Size of a new point.
float m_minimal_point_distance = 20.f; float m_minimal_point_distance = 20.f;
mutable std::vector<CacheEntry> m_editing_mode_cache; // a support point and whether it is currently selected mutable std::vector<CacheEntry> m_editing_mode_cache; // a support point and whether it is currently selected
std::vector<CacheEntry> m_old_cache; // to restore after discarding changes or undo/redo
float m_clipping_plane_distance = 0.f; float m_clipping_plane_distance = 0.f;
mutable float m_old_clipping_plane_distance = 0.f; mutable float m_old_clipping_plane_distance = 0.f;
mutable Vec3d m_old_clipping_plane_normal; mutable Vec3d m_old_clipping_plane_normal;