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

move bended model alongside track

This commit is contained in:
maj00r
2026-10-08 22:44:41 +02:00
parent c3dc7511e1
commit aa03cb3235
2 changed files with 48 additions and 10 deletions

View File

@@ -1656,6 +1656,12 @@ void editor_mode::render_bend()
state.height = overhead + kRailTop;
changed = true;
}
double along{sweep->distance_at(bend_fixed(*sweep, state.point))};
if (ImGui::InputDouble(STR_C("along the track (m)"), &along, 0.1, 1.0, "%.2f"))
{
bend_stretch(*sweep, along, stretch, state.point, state);
changed = true;
}
double length{stretch};
if (ImGui::InputDouble(STR_C("length (m)"), &length, 0.5, 5.0, "%.2f") && length > 0.1)
{
@@ -1708,6 +1714,7 @@ void editor_mode::render_bend()
ImGui::SetTooltip("%s", STR_C("Puts the edge facing the track at the distance chosen from its axis, set back by the widening of the gauge in the curves.\n"
"Stands on the plane of the rail heads carried on to its edge: lower on the inner side of a canted curve,\n"
"higher on the outer one; on the inner side also set back by the cant times the height of the edge / 1.5"));
ImGui::TextDisabled("%s", STR_C("In the view: drag the blue cross along the track and aside; Shift: height; Ctrl: only along"));
if (changed)
bend_edit(state);
if (ImGui::Button(STR_C("Done")))
@@ -1876,7 +1883,7 @@ bool editor_mode::bend_drag_start(int const Mods)
if (false == projection.project(marker, screen))
return false;
auto const &mouse{ImGui::GetIO().MousePos};
if ((mouse.x - screen.x) * (mouse.x - screen.x) + (mouse.y - screen.y) * (mouse.y - screen.y) > 14.0f * 14.0f)
if ((mouse.x - screen.x) * (mouse.x - screen.x) + (mouse.y - screen.y) * (mouse.y - screen.y) > 18.0f * 18.0f)
return false;
tool.dragging = (Mods & GLFW_MOD_SHIFT) != 0 ? 2 : (Mods & GLFW_MOD_CONTROL) != 0 ? 3 : 1;
tool.drag_state = sweep->definition();
@@ -1912,8 +1919,8 @@ void editor_mode::bend_drag_update()
}
if (tool.over_marker)
{
tool.label = STR("Drag: offset from the track");
tool.details = STR("Shift: height Ctrl: along the track");
tool.label = STR("Drag: along the track and aside");
tool.details = STR("Shift: height Ctrl: only along the track");
}
else if (ui()->mode() == nodebank_panel::MODIFY && m_input.mouse.button(GLFW_MOUSE_BUTTON_RIGHT) != GLFW_PRESS)
{
@@ -1957,6 +1964,26 @@ void editor_mode::bend_drag_update()
auto const step{0.01};
auto const snap = [&](double const Value) { return std::round(Value / step) * step; };
auto state{tool.drag_state};
auto const slide = [&](double const Shift) {
auto const span{(tool.drag_state.to < 0.0 ? sweep->length() : tool.drag_state.to) - tool.drag_state.from};
auto from{tool.drag_state.from + Shift};
auto to{from + span};
if (span > 0.1 && span <= sweep->length() + 1e-6)
{
if (from < 0.0)
{
to -= from;
from = 0.0;
}
if (to > sweep->length())
{
from = std::max(0.0, sweep->length() - span);
to = from + span;
}
}
state.from = from;
state.to = to;
};
if (tool.dragging == 2)
{
glm::dvec3 origin, direction;
@@ -1979,22 +2006,18 @@ void editor_mode::bend_drag_update()
return;
double lateral;
auto const station{sweep->project(point, lateral)};
auto const shift{snap(station - tool.drag_station)};
slide(shift);
if (tool.dragging == 1)
{
auto const at{sweep->frame_at(station)};
state.lateral = snap(lateral - sweep->setback(at));
if (std::abs(state.lateral) < step)
state.lateral = std::copysign(step, tool.drag_state.lateral);
tool.drag_label = format(STR_C("%.2f m from the track axis"), std::abs(state.lateral));
tool.drag_label = format(STR_C("%.2f m from the track, %+.2f m along"), std::abs(state.lateral), shift);
}
else
{
auto const shift{snap(station - tool.drag_station)};
state.from = tool.drag_state.from + shift;
if (tool.drag_state.to >= 0.0)
state.to = tool.drag_state.to + shift;
tool.drag_label = format(STR_C("%+.2f m along the track"), shift);
}
}
if (false == (state == sweep->definition()))
sweep->define(state);

View File

@@ -3638,6 +3638,9 @@ msgstr "od osi toru (m, + w prawo)"
msgid "over the rail head (m)"
msgstr "nad główką szyny (m)"
msgid "along the track (m)"
msgstr "wzdłuż toru (m)"
msgid "length (m)"
msgstr "długość (m)"
@@ -3686,6 +3689,18 @@ msgstr "Zapisz i otwórz"
msgid "In the view: drag the blue cross sideways to set the offset, with Shift up and down, with Ctrl along the track"
msgstr "W widoku: przeciągnij niebieski celownik w bok, żeby ustawić odsunięcie, z Shift w górę i w dół, z Ctrl wzdłuż toru"
msgid "In the view: drag the blue cross along the track and aside; Shift: height; Ctrl: only along"
msgstr "W widoku: przeciągnij niebieski celownik wzdłuż toru i w bok; Shift: wysokość; Ctrl: tylko wzdłuż"
msgid "Drag: along the track and aside"
msgstr "Przeciągnij: wzdłuż toru i w bok"
msgid "Shift: height Ctrl: only along the track"
msgstr "Shift: wysokość Ctrl: tylko wzdłuż toru"
msgid "%.2f m from the track, %+.2f m along"
msgstr "%.2f m od toru, %+.2f m wzdłuż"
msgid "Drag: offset from the track; Shift: height; Ctrl: along the track"
msgstr "Przeciągnij: odsunięcie od toru; Shift: wysokość; Ctrl: wzdłuż toru"