17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-26 04:29:29 +01:00

fix(editor): a track bent by its second control vector is drawn bent: the straightening of a straight with control vectors (world/Track.cpp) checked the first vector twice, so with it left along the straight the second one, dragged with the gizmo, changed the data but not the track drawn; now a straight only where both vectors lie along it or aren't given. A track bent by hand into an S between two points dragged is labelled with its length (L 77 m), not with a radius of many kilometres read off it; the "K: split here" by the cursor isn't shown while a point is dragged; Ctrl+Z takes away the warning by the cursor of what it took back (the paths that left the kept design). The tutorial clips of editing recorded again: selecting and fixing without the gizmo (a joint dragged, the warning read, Ctrl+Z), and the new one of editing with the gizmo (Q, a control vector dragged bending the track, W, E)

This commit is contained in:
maj00r
2026-10-25 12:57:23 +01:00
parent a312fd9935
commit 79a8c13586
7 changed files with 15 additions and 5 deletions

View File

@@ -965,6 +965,8 @@ void editor_mode::restore_terrain(EditorSnapshot &Snapshot)
void editor_mode::undo_last()
{
first_step_done(first_step::undo);
// the warning by the cursor told of the step taken back now: "Ctrl+Z takes it back" is done
ui()->drop_refusal();
// a change of the terrain made a moment ago is a step of its own before it's taken back
m_history_busy = true;
terrain_history_step();

View File

@@ -2267,7 +2267,8 @@ void editor_mode::draw_build_overlay() const
projection.line(drawlist, origin + glm::dvec3{i * cell, 0.0, j * cell}, origin + glm::dvec3{(i + 1) * cell, 0.0, j * cell}, colour, 1.0f);
}
}
if (m_track_tab == track_tab::path && false == m_lay.active && false == m_track_gizmo_using)
// none while a point is dragged: there is nothing to split then
if (m_track_tab == track_tab::path && false == m_lay.active && false == m_track_gizmo_using && false == m_point_drag.active && false == m_handle_drag.active)
if (auto const spot{split_spot()}; spot.track != nullptr)
{
ImVec2 at;

View File

@@ -452,9 +452,12 @@ void editor_mode::draw_track_labels() const
labels.push_back({2, -length, middle, format(STR_C("straight %.0f m"), length), IM_COL32(200, 215, 230, 225)});
continue;
}
// a track bent by hand, as an S between two points dragged, has no radius to read: its length alone
editor_track::curve shape;
if (editor_track::analyse_curve(run, m_route.design.norms.gauge, shape) && shape.radius >= 0.5)
if (editor_track::analyse_curve(run, m_route.design.norms.gauge, shape) && shape.radius >= 0.5 && shape.radius <= 50000.0)
labels.push_back({1, shape.radius, middle, curve_text(shape), IM_COL32(235, 235, 235, 240)});
else
labels.push_back({2, -length, middle, format("L %.0f m", length), IM_COL32(235, 235, 235, 240)});
}
std::sort(labels.begin(), labels.end(), [](track_label const &A, track_label const &B) { return A.rank != B.rank ? A.rank < B.rank : A.order < B.order; });
// each label where it reads best: beside its track if it's free there, else moved out to the nearest room, a line leading back

View File

@@ -169,6 +169,8 @@ class editor_ui : public ui_layer
void set_status(std::string const &Status, bool const Error = false);
// a warning after an operation done: added to its status, shown by the cursor for a while
void set_notice(std::string const &Notice);
// the refusal or warning by the cursor taken away before its time, when what it tells of was taken back
void drop_refusal() { m_refusal.clear(); }
private:
// methods

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

View File

@@ -836,9 +836,11 @@ void TTrack::init_segments( bool const Initial ) {
}
// length2 is better than length for comparing because it does not require sqrt function
if( glm::length2((p1 + p1 + p2) / 3.0 - p1 - cp1) < sq(0.02)
|| glm::length2((p1 + p2 + p2) / 3.0 - p2 + cp1) < sq(0.02) ) {
// "prostowanie" prostych z kontrolnymi, dokładność 2cm
// "prostowanie" prostych z kontrolnymi, dokładność 2cm: a straight only where both control vectors lie along it, or aren't
// given; one of them moved off it, the other one left where a straight has it, makes a curve
auto const startalong { cp1 == glm::dvec3() || glm::length2( ( p1 + p1 + p2 ) / 3.0 - p1 - cp1 ) < sq( 0.02 ) };
auto const endalong { cp2 == glm::dvec3() || glm::length2( ( p1 + p2 + p2 ) / 3.0 - p2 - cp2 ) < sq( 0.02 ) };
if( startalong && endalong ) {
cp1 = cp2 = glm::dvec3(0, 0, 0);
}