mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-26 07:59:30 +01:00
feat(editor): laying and editing the track as a beginner meets them: the points clicked and not laid yet named at the top of the panel with Lay (Enter) and Drop the points, Enter shown by the bar at the bottom while there are some, and a first Esc over them only warning, the second one dropping them; the readout by the cursor kept in the 3d view, on the other side of the cursor where the view ends, with only the first warning of a curve and how many more the panel lists; the grid, the labels and the lines drawn over the view no longer seen through the docks; the gizmo in the tracks hidden until Q, W or E or its buttons above the view bring it out, an arrow there hiding it again, so a selected track isn't moved by chance; the radius of the curves at the bends headed so in the panel, the laid line told in metres and pieces, the hints of the select tool and of a straight shifted around an obstacle translated. An empty scenery opens facing north, the top view with the north up as the compass and the orthophoto have it (on LK2 Warszawa Wschodnia left, Rembertow right). The tutorial tells the laying as it works now: the bends clicked and Enter, the curves made at them and orange where too sharp for the speed, Tab for a curve traced, the radius by Ctrl+wheel when joining, the gizmo by Q W E, the terrain model loaded and fitted from the panel of the tracks, signals by I; its texts wrap to a dock it's put in, new clips of laying and of the curves, recorded with the selftest badge drawing the mouse or the key in use; the empty scenery and the shortcuts say the same
This commit is contained in:
@@ -1499,6 +1499,9 @@ bool editor_mode::update()
|
||||
m_ortho_waiting = waiting;
|
||||
m_orthophoto.update(Camera.Pos);
|
||||
nmt_update();
|
||||
// what's drawn over the 3d view stays in it, the docks around it are see-through a little
|
||||
auto *background{ImGui::GetBackgroundDrawList(ImGui::GetMainViewport())};
|
||||
background->PushClipRect(ImVec2(editor_ui::view_min().x, editor_ui::view_min().y), ImVec2(editor_ui::view_max().x, editor_ui::view_max().y), true);
|
||||
draw_orthophoto();
|
||||
draw_nmt_pending();
|
||||
|
||||
@@ -1591,6 +1594,7 @@ bool editor_mode::update()
|
||||
// --- area fill: outline overlay while the mode is active (its settings are drawn in the node bank window) ---
|
||||
if (ui()->mode() == nodebank_panel::FILL)
|
||||
draw_area_fill_outline();
|
||||
background->PopClipRect();
|
||||
draw_ortho_compass();
|
||||
|
||||
render_new_scenery_popup();
|
||||
@@ -4950,7 +4954,7 @@ void tutorial_signal_sketch(ImDrawList &List, ImVec2 const Low, ImVec2 const Hig
|
||||
List.AddText(ImVec2(foot.x - height * 0.06f - ImGui::CalcTextSize("S1").x, foot.y - line), IM_COL32(255, 255, 255, 230), "S1");
|
||||
}
|
||||
gesture_mouse(List, ImVec2(cursor.x + 2.0f, cursor.y + 2.0f), std::round(height * 0.16f), "LMB");
|
||||
List.AddText(ImVec2(Low.x + 6.0f, Low.y + 4.0f), IM_COL32(230, 230, 230, 230), STR_C("H: by the track, drag along: the way the trains run"));
|
||||
List.AddText(ImVec2(Low.x + 6.0f, Low.y + 4.0f), IM_COL32(230, 230, 230, 230), STR_C("LMB by the track, drag along: the way the trains run"));
|
||||
return;
|
||||
}
|
||||
// the hectometre posts of the line, one after the other
|
||||
@@ -5217,22 +5221,21 @@ void editor_mode::render_first_steps()
|
||||
"lay",
|
||||
{{"F3", "The Tracks field of work"},
|
||||
{"L", "The lay tool"},
|
||||
{"LMB", "A click on the ground: the first point; the next click: a straight up to it"},
|
||||
{"LMB", "Each next click lays a piece on from the end of the last one"},
|
||||
{"Ctrl + wheel", "The radius of the curve, while laying on from an end"},
|
||||
{"Shift + wheel", "The shape: arc then straight, straight then arc, arc, straight"},
|
||||
{"Backspace", "Takes the last piece back"},
|
||||
{"Esc", "Ends laying"}},
|
||||
{{first_step::tracks, "Open the Tracks field of work"}, {first_step::lay, "Turn the lay tool on"}, {first_step::laid, "Lay a track"}},
|
||||
{"LMB", "A click on the ground or on a free end: where the track starts"},
|
||||
{"LMB", "Each next click: a bend of the line, the curve at it made by itself. The line shown isn't a track yet"},
|
||||
{"Enter", "Lays the track clicked; the clicks after it go on from its end"},
|
||||
{"Backspace", "Takes the last point back, then the last piece laid"},
|
||||
{"Esc", "Ends laying; the points not laid yet go only with the second Esc"}},
|
||||
{{first_step::tracks, "Open the Tracks field of work"}, {first_step::lay, "Turn the lay tool on"}, {first_step::laid, "Click a few points and lay them with Enter"}},
|
||||
trial::lay},
|
||||
{"Curves",
|
||||
"curves",
|
||||
{{"Ctrl + wheel", "The radius of the curve, while laying on from an end"},
|
||||
{"Shift + wheel", "The shape: arc then straight, straight then arc, arc, straight"},
|
||||
{{"LMB", "Click the bends of the line: each gets a curve as large as fits; one too sharp for the speed set in the panel has its label in orange"},
|
||||
{"Tab", "A curve seen on the photo: click points along its middle, the last two on the straight after it"},
|
||||
{"Alt", "Held: the direction turns in steps of 15 degrees, or to 1:9, 1:6.6... to a straight track it starts by or crosses"},
|
||||
{"0 1 2 3", "Type the length of the next piece, Enter lays it"},
|
||||
{"0 1 2 3", "Type the length of the next straight, Enter puts the point"},
|
||||
{"wheel", "Alone it zooms, as everywhere"}},
|
||||
{{first_step::wheel, "Change the radius with Ctrl+wheel"}, {first_step::shape, "Change the shape with Shift+wheel"}},
|
||||
{{first_step::bend, "Lay a track with a bend in it"}, {first_step::trace, "Switch to tracing a curve with Tab"}},
|
||||
trial::lay},
|
||||
{"Correcting a curve",
|
||||
nullptr,
|
||||
@@ -5250,7 +5253,7 @@ void editor_mode::render_first_steps()
|
||||
{"LMB", "Let go on another free end: a curve joins the two tracks"},
|
||||
{"Ctrl + wheel", "While over the other end: the radius of the joining curve"},
|
||||
{"Shift + wheel", "While over the other end: another way to join"}},
|
||||
{{first_step::join, "Join two free ends"}},
|
||||
{{first_step::join, "Join two free ends"}, {first_step::wheel, "Change the radius of the joining curve with Ctrl+wheel"}},
|
||||
trial::lay},
|
||||
{"Switches",
|
||||
"switch",
|
||||
@@ -5276,8 +5279,7 @@ void editor_mode::render_first_steps()
|
||||
{{"Esc", "The select tool"},
|
||||
{"LMB", "Click a track: it is selected, with its points"},
|
||||
{"LMB + move", "Drag a point: the end or the curve follows"},
|
||||
{"Q W E", "Move, turn or scale with the gizmo"},
|
||||
{"Gizmo", "Tool options, Gizmo, Off: the track won't move by chance"},
|
||||
{"Q W E", "The gizmo on the selected track: move, turn, lengthen. Hidden until then, so the track won't move by chance; the arrow above the view hides it again"},
|
||||
{"RMB", "A click on a track: what can be done with it"},
|
||||
{"Del", "Deletes the selected"},
|
||||
{"Ctrl + Z", "Takes the last change back; Ctrl+Y brings it back again"}},
|
||||
@@ -5297,11 +5299,12 @@ void editor_mode::render_first_steps()
|
||||
tutorial_route_sketch},
|
||||
{"Terrain from the terrain model",
|
||||
nullptr,
|
||||
{{"F5", "The Terrain field of work: the terrain model (NMT) is in its tool options"},
|
||||
{"1", "Location: where the scenery lies in PUWG 1992; a scenery begun from nothing asks for it with its first track"},
|
||||
{"2", "What gives way: the tracks go onto the terrain, or the terrain is drawn to the tracks"},
|
||||
{"3", "Load: the model comes from geoportal.gov.pl, the terrain is made along the tracks with the formation and the slopes"},
|
||||
{"Ctrl + Z", "Takes the changes of the tracks back"}},
|
||||
{{"L", "In a scenery begun from nothing the first L asks: the real terrain of the place, or the flat plane"},
|
||||
{"F5", "The Terrain field of work: the terrain model (NMT) is in its tool options"},
|
||||
{"1", "Location: where the scenery lies, a click on the map or the place typed"},
|
||||
{"2", "Load along the tracks, or around the camera: the model comes from geoportal.gov.pl"},
|
||||
{"3", "Tracks, select a track, Terrain in the inspector: draw the terrain to the track, or put the tracks onto the terrain"},
|
||||
{"Ctrl + Z", "Takes the changes back"}},
|
||||
{{first_step::terrain, "Open the Terrain field of work"}, {first_step::nmt, "Load terrain from the model"}},
|
||||
trial::terrain,
|
||||
tutorial_terrain_sketch},
|
||||
@@ -5336,13 +5339,14 @@ void editor_mode::render_first_steps()
|
||||
m_tutorial_since = ImGui::GetTime();
|
||||
}
|
||||
auto const scale{Global.ui_scale};
|
||||
auto const width{520.0f * scale};
|
||||
ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x * 0.5f, ImGui::GetIO().DisplaySize.y * 0.5f), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f));
|
||||
ImGui::SetNextWindowBgAlpha(1.0f);
|
||||
ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, 0.0f), ImVec2(FLT_MAX, ImGui::GetIO().DisplaySize.y - 60.0f));
|
||||
keep_on_screen("###tutorial");
|
||||
if (ImGui::Begin((std::string(STR_C("Tutorial")) + "###tutorial").c_str(), &m_first_steps_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize))
|
||||
{
|
||||
// floating it's as wide as the clips; docked it takes the width of its dock, the texts wrapped to it
|
||||
auto const width{ImGui::IsWindowDocked() ? std::max(160.0f * scale, ImGui::GetContentRegionAvail().x) : 520.0f * scale};
|
||||
ImGui::PushTextWrapPos(ImGui::GetCursorPosX() + width);
|
||||
ImGui::TextDisabled(STR_C("Lesson %d of %d"), m_tutorial_page + 1, static_cast<int>(lessons.size()));
|
||||
ImGui::SameLine();
|
||||
@@ -5545,10 +5549,10 @@ void editor_mode::render_shortcuts_window()
|
||||
{"F", "Fly to the selected"},
|
||||
{"O", "Top view, orthographic"}}},
|
||||
{"Gizmo",
|
||||
{{"Q / W / E", "Translate / rotate / scale"},
|
||||
{{"Q / W / E", "Translate / rotate / scale; in the tracks they bring the hidden gizmo out"},
|
||||
{"R", "Local space"},
|
||||
{"Ctrl held while dragging", "Snap to the step set in the gizmo settings"},
|
||||
{"Tool options, Gizmo, Off", "Hides the gizmo, so nothing moves by chance"}}},
|
||||
{"Tool options, Gizmo, Off", "Hides the gizmo, so nothing moves by chance; in the tracks it is hidden until Q, W or E"}}},
|
||||
{"Surroundings",
|
||||
{{"1 2 3 4 5", "Select, insert, brush, area fill, copy to bank"},
|
||||
{"LMB", "Select a model, or place one in the insert and brush modes"},
|
||||
@@ -5564,7 +5568,7 @@ void editor_mode::render_shortcuts_window()
|
||||
{{"Esc", "Select tool; cancels what's going on first"},
|
||||
{"L / T / U", "Lay track / switch / turntable"},
|
||||
{"G (C)", "Plan: a straight, its ends and the middle; a curve, its vertex and radius"},
|
||||
{"H / B", "Signals / objects along the track"},
|
||||
{"I / B", "Signalling / objects along the track"},
|
||||
{"P / V / J", "Profile / speed / joints"},
|
||||
{"Ctrl+F", "Find a track by its name"},
|
||||
{"Shift+LMB", "Add a track to the selection, drag: a box"},
|
||||
@@ -5573,13 +5577,14 @@ void editor_mode::render_shortcuts_window()
|
||||
{"L, LMB, LMB...", "Lay track: each click a bend of the straights, eased with a large curve; Enter lays them and goes on from the end"},
|
||||
{"Tab while laying", "The points clicked next go along the middle of a curve seen on the photo, the last two on the straight after it; Tab again: back to the bends"},
|
||||
{"Drag from a free end", "Lead a track out of it; onto another free end: join the two"},
|
||||
{"Ctrl+wheel", "Laying: radius"},
|
||||
{"Shift+wheel", "Laying: arc then straight, straight then arc, arc, straight; at a free end: another way to join"},
|
||||
{"Ctrl+wheel", "Dragging from a free end: radius"},
|
||||
{"Shift+wheel", "Dragging from a free end: arc then straight, straight then arc, arc, straight; over another free end: another way to join"},
|
||||
{"0-9 while laying", "Type the length of the next straight, Enter puts the point"},
|
||||
{"Alt held while laying", "The direction in steps of 15 degrees, or 1:9, 1:6.6... to a straight track; the first click with Alt goes onto the axis of the track"},
|
||||
{"N", "Parallel track: LMB on a track, then the side and the spacing"},
|
||||
{"Shift+LMB on a track in L", "The Parallel tool (N) with it"},
|
||||
{"Enter / Backspace", "Laying track: lay the points clicked / take back the last point, then the last piece laid"},
|
||||
{"Esc twice while laying", "Drop the points clicked and not laid yet"},
|
||||
{"Del", "Delete the selected tracks"}}},
|
||||
{"Plan of a curve",
|
||||
{{"G, LMB on a curve", "Its design: the vertex and the radius to drag in the view, the curvature in the panel"},
|
||||
@@ -5667,6 +5672,11 @@ void editor_mode::render_shortcuts_window()
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
bool editor_mode::gizmo_shown() const
|
||||
{
|
||||
return ui()->mode() == nodebank_panel::TRACK ? m_track_gizmo_on : m_gizmo_enabled;
|
||||
}
|
||||
|
||||
void editor_mode::render_gizmo_options()
|
||||
{
|
||||
if (ImGui::Button(Global.EditorOrtho ? STR_C("3D view (O)") : STR_C("Top view, orthographic (O)")))
|
||||
@@ -5686,18 +5696,19 @@ void editor_mode::render_gizmo_options()
|
||||
if (ui()->mode() == nodebank_panel::TRACK && m_track_tab != track_tab::path && m_track_tab != track_tab::turnout && m_track_tab != track_tab::turntable && m_track_tab != track_tab::srk &&
|
||||
m_track_tab != track_tab::lineside)
|
||||
return;
|
||||
int op{m_gizmo_enabled ? static_cast<int>(m_gizmo_op) : -1};
|
||||
auto &enabled{ui()->mode() == nodebank_panel::TRACK ? m_track_gizmo_on : m_gizmo_enabled};
|
||||
int op{enabled ? static_cast<int>(m_gizmo_op) : -1};
|
||||
if (segmented("gizmo", op,
|
||||
{{-1, STR_C("Off"), "The gizmo hidden: the selected things won't move by chance"},
|
||||
{static_cast<int>(gizmo_operation::translate), STR_C("Translate (Q)"), "Arrows which move the selected thing"},
|
||||
{static_cast<int>(gizmo_operation::rotate), STR_C("Rotate (W)"), "Rings which turn the selected thing"},
|
||||
{static_cast<int>(gizmo_operation::scale), STR_C("Scale (E)"), "Handles which scale the selected thing; a track is lengthened"}}))
|
||||
{
|
||||
m_gizmo_enabled = op >= 0;
|
||||
if (m_gizmo_enabled)
|
||||
enabled = op >= 0;
|
||||
if (enabled)
|
||||
m_gizmo_op = static_cast<gizmo_operation>(op);
|
||||
}
|
||||
if (!m_gizmo_enabled)
|
||||
if (!enabled)
|
||||
return;
|
||||
if (terrain_brush() || terrain_clicking())
|
||||
{
|
||||
@@ -5741,9 +5752,10 @@ void editor_mode::render_gizmo()
|
||||
}
|
||||
|
||||
// the transform gizmo is suppressed while editing terrain, so the brush/chunk tool owns the mouse
|
||||
if (!m_gizmo_enabled || terrain_brush() || terrain_clicking())
|
||||
if (!gizmo_shown() || terrain_brush() || terrain_clicking())
|
||||
{
|
||||
m_gizmo_using = false;
|
||||
m_track_gizmo_using = false;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -6190,7 +6202,8 @@ void editor_mode::enter()
|
||||
std::vector<char> found;
|
||||
auto const ground{ground_heights({glm::dvec3{0.0, 5000.0, 0.0}}, true, &found).front()};
|
||||
Camera.Pos = glm::dvec3{0.0, (found.front() != 0 ? ground : 0.0) + 60.0, 0.0};
|
||||
Camera.Angle = glm::vec3(glm::radians(-45.0f), 0.0f, 0.0f);
|
||||
// facing north, the top view with the north up as on a map: the yaw 0 looks along -z, to the south
|
||||
Camera.Angle = glm::vec3(glm::radians(-45.0f), glm::pi<float>(), 0.0f);
|
||||
Camera.m_owner = nullptr;
|
||||
FreeFlyModeFlag = true;
|
||||
if (false == Global.EditorOrtho)
|
||||
@@ -6366,9 +6379,10 @@ void editor_mode::on_key(int const Key, int const Scancode, int const Action, in
|
||||
switch (Key)
|
||||
{
|
||||
case GLFW_KEY_O: toggle_ortho(); break;
|
||||
case GLFW_KEY_Q: m_gizmo_op = gizmo_operation::translate; break;
|
||||
case GLFW_KEY_W: m_gizmo_op = gizmo_operation::rotate; break;
|
||||
case GLFW_KEY_E: m_gizmo_op = gizmo_operation::scale; break;
|
||||
// in the tracks they also bring the gizmo out, hidden until then
|
||||
case GLFW_KEY_Q: m_gizmo_op = gizmo_operation::translate; m_track_gizmo_on |= ui()->mode() == nodebank_panel::TRACK; break;
|
||||
case GLFW_KEY_W: m_gizmo_op = gizmo_operation::rotate; m_track_gizmo_on |= ui()->mode() == nodebank_panel::TRACK; break;
|
||||
case GLFW_KEY_E: m_gizmo_op = gizmo_operation::scale; m_track_gizmo_on |= ui()->mode() == nodebank_panel::TRACK; break;
|
||||
case GLFW_KEY_R: m_gizmo_local = !m_gizmo_local; break;
|
||||
case GLFW_KEY_B: handled = ui()->mode() != nodebank_panel::TRACK && bend_shortcut(); break;
|
||||
case GLFW_KEY_F1: m_shortcuts_open = !m_shortcuts_open; break;
|
||||
@@ -6523,7 +6537,7 @@ void editor_mode::on_key(int const Key, int const Scancode, int const Action, in
|
||||
else if (m_route.trace.active && route_active())
|
||||
route_trace_end(false);
|
||||
else if (m_lay.active && false == m_lay.points.empty())
|
||||
lay_cancel();
|
||||
lay_escape();
|
||||
else if (m_track_style.picking)
|
||||
m_track_style.picking = false;
|
||||
else if (track_busy())
|
||||
|
||||
@@ -810,6 +810,8 @@ class editor_mode : public application_mode, private editor_track::observer, pri
|
||||
void choose_work_area(work_area const Area);
|
||||
void render_workspaces();
|
||||
bool m_gizmo_enabled{true}; // master switch for the in-viewport gizmo
|
||||
bool m_track_gizmo_on{false}; // the gizmo in the tracks: off until Q, W or E, so a track isn't moved by chance
|
||||
bool gizmo_shown() const; // the switch of the field of work in use
|
||||
bool m_gizmo_using{false}; // tracks an ongoing drag, so a single undo snapshot is taken per drag
|
||||
bool m_gizmo_local{false}; // manipulate in the object's local space instead of world space
|
||||
gizmo_operation m_gizmo_op{gizmo_operation::translate}; // current transform mode (translate/rotate/scale)
|
||||
@@ -1479,6 +1481,7 @@ class editor_mode : public application_mode, private editor_track::observer, pri
|
||||
std::string status;
|
||||
double status_time{-100.0};
|
||||
std::string skew; // what Alt turned the straight to
|
||||
double escape_time{-100.0}; // when Esc was pressed over points not laid: the second Esc drops them
|
||||
struct step
|
||||
{
|
||||
editor_track::snap_target start;
|
||||
@@ -1494,6 +1497,8 @@ class editor_mode : public application_mode, private editor_track::observer, pri
|
||||
TTrack const *skew_reference(glm::dvec3 const &From, glm::dvec3 const &To, double const Reach) const;
|
||||
void lay_after_history(bool const Undo);
|
||||
void lay_back();
|
||||
void lay_escape();
|
||||
std::size_t lay_pending() const; // the points clicked and not laid yet
|
||||
void render_lay_ui();
|
||||
void render_lay_status();
|
||||
void lay_click();
|
||||
@@ -2323,6 +2328,8 @@ class editor_mode : public application_mode, private editor_track::observer, pri
|
||||
int wait{0};
|
||||
bool quitting{false};
|
||||
scripted_input input;
|
||||
std::string badge; // the mouse or the keys drawn over the view, for the clips of the tutorial
|
||||
glm::vec2 badge_at{0.0f}; // its bottom left corner, in the pixels of the window
|
||||
};
|
||||
selftest m_selftest;
|
||||
using selftest_result = editor_selftest_result;
|
||||
|
||||
@@ -1351,6 +1351,8 @@ void editor_mode::lay_switch_mode()
|
||||
{
|
||||
auto &tool{m_lay};
|
||||
tool.mode = tool.mode == lay_mode::straights ? lay_mode::curve : lay_mode::straights;
|
||||
if (tool.mode == lay_mode::curve)
|
||||
first_step_done(first_step::trace);
|
||||
tool.status = tool.mode == lay_mode::curve ? STR("Curve: click points along the middle of the track, the last two on the straight after the curve. Tab: back to the straights")
|
||||
: STR("Straights: each point clicked is a bend of the straights, eased with a large curve. Tab: a curve traced on the photo");
|
||||
tool.status_time = ImGui::GetTime();
|
||||
@@ -1436,9 +1438,11 @@ void editor_mode::lay_finish(editor_track::snap_target const &End)
|
||||
tool.history = m_history.size();
|
||||
push_track_snapshot({}, created);
|
||||
first_step_done(first_step::laid);
|
||||
if (plan.shape.valid && false == plan.shape.curves.empty())
|
||||
first_step_done(first_step::bend);
|
||||
if (End.track != nullptr)
|
||||
first_step_done(first_step::join);
|
||||
tool.status = format(STR_P("Laid %zu track, %.1f m, Ctrl+Z takes it back", "Laid %zu tracks, %.1f m, Ctrl+Z takes them back", static_cast<long long>(created.size())), created.size(), length);
|
||||
tool.status = format(STR_P("Laid %.1f m of track in %zu piece, Ctrl+Z takes it back", "Laid %.1f m of track in %zu pieces, Ctrl+Z takes it back", static_cast<long long>(created.size())), length, created.size());
|
||||
if (false == error.empty())
|
||||
tool.status += "\n" + error;
|
||||
if (eased.has_value() && eased->compound)
|
||||
@@ -1534,6 +1538,30 @@ void editor_mode::lay_cancel()
|
||||
tool.status.clear();
|
||||
}
|
||||
|
||||
std::size_t editor_mode::lay_pending() const
|
||||
{
|
||||
// the first point of a chain going on is the end of the track laid before it, not clicked
|
||||
auto const &tool{m_lay};
|
||||
return tool.chain.empty() ? tool.points.size() : tool.points.size() - std::min<std::size_t>(1, tool.points.size());
|
||||
}
|
||||
|
||||
void editor_mode::lay_escape()
|
||||
{
|
||||
auto &tool{m_lay};
|
||||
lay_trim();
|
||||
// the points clicked are no track yet and nothing brings them back: a slip of Esc only warns, the second one drops them
|
||||
auto const pending{lay_pending()};
|
||||
if (tool.points.size() < 2 || ImGui::GetTime() - tool.escape_time < 3.0)
|
||||
{
|
||||
lay_cancel();
|
||||
tool.escape_time = -100.0;
|
||||
return;
|
||||
}
|
||||
tool.escape_time = ImGui::GetTime();
|
||||
tool.status = format(STR_P("Esc again drops the point not laid, Enter lays it", "Esc again drops the %zu points not laid, Enter lays them", static_cast<long long>(pending)), pending);
|
||||
tool.status_time = tool.escape_time;
|
||||
}
|
||||
|
||||
void editor_mode::lay_after_history(bool const Undo)
|
||||
{
|
||||
auto &tool{m_lay};
|
||||
@@ -1677,6 +1705,26 @@ alignment::limits editor_mode::laying_norms() const
|
||||
void editor_mode::render_lay_ui()
|
||||
{
|
||||
auto &tool{m_lay};
|
||||
// the points clicked are no track until they're laid: said first, with the keys as buttons
|
||||
if (tool.points.size() > 1)
|
||||
{
|
||||
auto const pending{lay_pending()};
|
||||
ImGui::TextColored(ImVec4(1.0f, 0.83f, 0.3f, 1.0f), "%s", format(STR_P("Not laid yet: %zu point", "Not laid yet: %zu points", static_cast<long long>(pending)), pending).c_str());
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.18f, 0.45f, 0.22f, 1.0f));
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.24f, 0.56f, 0.28f, 1.0f));
|
||||
if (ImGui::Button(STR_C("Lay (Enter)")))
|
||||
{
|
||||
// the cursor is over the panel: no free end under it to join
|
||||
tool.mouse_snap = {};
|
||||
lay_enter();
|
||||
}
|
||||
ImGui::PopStyleColor(2);
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button(STR_C("Drop the points")))
|
||||
lay_cancel();
|
||||
item_tooltip("Esc twice does the same");
|
||||
ImGui::Separator();
|
||||
}
|
||||
if (int mode{tool.mode == lay_mode::curve ? 1 : 0};
|
||||
segmented("laymode", mode,
|
||||
{{0, STR_C("Straights Tab"), "Each point clicked is a bend of the straights: the bend eased with two transition curves meeting, with no cant, of a large radius; where they don't fit, an arc with the transitions and the cant of the norms, as large as fits"},
|
||||
@@ -1688,7 +1736,8 @@ void editor_mode::render_lay_ui()
|
||||
{
|
||||
double low{EditorSettings.corner_low()};
|
||||
double high{EditorSettings.corner_high()};
|
||||
auto changed{ImGui::DragScalar(STR_C("Bends: R from (m)"), ImGuiDataType_Double, &low, 10.0f, nullptr, nullptr, "%.0f")};
|
||||
ImGui::TextDisabled("%s", STR_C("Radius of the curves at the bends"));
|
||||
auto changed{ImGui::DragScalar(STR_C("from (m)"), ImGuiDataType_Double, &low, 10.0f, nullptr, nullptr, "%.0f")};
|
||||
item_tooltip("The radius the two transition curves of a bend meet at, at least; where they don't fit at it, an arc of the norms as large as fits");
|
||||
changed |= ImGui::DragScalar(STR_C("to (m)"), ImGuiDataType_Double, &high, 10.0f, nullptr, nullptr, "%.0f");
|
||||
item_tooltip("The radius tried first; a bend too slight for transitions long enough at the speed takes a larger one");
|
||||
@@ -1747,7 +1796,7 @@ void editor_mode::render_lay_ui()
|
||||
value_chips("speeds", tool.style.velocity, {40.0, 60.0, 80.0, 100.0, 120.0, 160.0}, "%.0f");
|
||||
tool.style.velocity = std::clamp(tool.style.velocity, 0.0, 400.0);
|
||||
ImGui::PopItemWidth();
|
||||
ImGui::Checkbox(STR_C("This speed also on from a track with its own"), &tool.own_speed);
|
||||
ImGui::Checkbox(STR_C("This speed also on from a track with a speed of its own"), &tool.own_speed);
|
||||
item_tooltip("Off: a track laid on from another one, or joined to it, is designed for the speed of that track and takes it.\nOn: it's designed for the speed above and the new tracks get it.\nWhile laying: Ctrl+Shift+wheel");
|
||||
if (auto const [from, to]{laying_ends()}; from != nullptr || to != nullptr)
|
||||
ImGui::TextDisabled("%s", design_speed_of(from, to).c_str());
|
||||
|
||||
@@ -14,6 +14,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "application/application.h"
|
||||
#include "application/editoruilayer.h"
|
||||
#include "application/editorprojection.h"
|
||||
#include "application/editorgestures.h"
|
||||
#include "imgui/imgui.h"
|
||||
|
||||
#include "simulation/simulation.h"
|
||||
#include "simulation/simulationtime.h"
|
||||
@@ -201,6 +203,17 @@ void editor_mode::selftest_step()
|
||||
if (frame > 33.0)
|
||||
++editor_selftest::frames_slow();
|
||||
}
|
||||
// the gesture of the clip being recorded, its bottom left corner where the clip has it
|
||||
if (false == test.badge.empty())
|
||||
{
|
||||
auto const words{gesture_picture(test.badge)};
|
||||
auto const height{std::round(ImGui::GetTextLineHeight() * 1.6f)};
|
||||
auto const pad{std::round(height * 0.25f)};
|
||||
ImVec2 const at{test.badge_at.x + pad, test.badge_at.y - pad - height};
|
||||
auto &list{*ImGui::GetForegroundDrawList(ImGui::GetMainViewport())};
|
||||
list.AddRectFilled(ImVec2(at.x - pad, at.y - pad), ImVec2(at.x + gesture_width(height, words) + pad, at.y + height + pad), IM_COL32(16, 20, 26, 225), pad);
|
||||
gesture_draw(list, at, height, words, IM_COL32(235, 235, 235, 255));
|
||||
}
|
||||
if (test.wait > 0)
|
||||
{
|
||||
--test.wait;
|
||||
|
||||
@@ -537,6 +537,8 @@ editor_mode::selftest_result editor_mode::selftest_join(std::string const &comma
|
||||
words >> operation;
|
||||
choose_work_area(work_area::tracks);
|
||||
m_gizmo_op = operation == "rotate" ? gizmo_operation::rotate : operation == "scale" ? gizmo_operation::scale : gizmo_operation::translate;
|
||||
// as the key of the operation does, the gizmo hidden in the tracks is brought out
|
||||
m_track_gizmo_on = true;
|
||||
int path{-1};
|
||||
std::string kind;
|
||||
words >> path >> kind;
|
||||
|
||||
@@ -37,6 +37,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
// undoall undoes every change in the history
|
||||
// trackhash logs the number of the tracks and a hash of their names and points to the millimetre
|
||||
// tutorial <page> opens the tutorial at the lesson, from 0; -1 closes it
|
||||
// badge [<x> <y> <gesture>] the mouse or the keys drawn with the bottom left corner at the point of the window, as
|
||||
// "LMB" or "Enter", for the clips of the tutorial; with nothing after it none
|
||||
// shortcuts [filter] opens the list of the shortcuts
|
||||
editor_mode::selftest_result editor_mode::selftest_monkey(std::string const &command, std::istringstream &words)
|
||||
{
|
||||
@@ -311,6 +313,14 @@ editor_mode::selftest_result editor_mode::selftest_monkey(std::string const &com
|
||||
m_tutorial_page = std::max(0, page);
|
||||
return selftest_result::handled;
|
||||
}
|
||||
if (command == "badge")
|
||||
{
|
||||
std::string gesture;
|
||||
words >> m_selftest.badge_at.x >> m_selftest.badge_at.y;
|
||||
std::getline(words >> std::ws, gesture);
|
||||
m_selftest.badge = gesture;
|
||||
return selftest_result::handled;
|
||||
}
|
||||
if (command == "shortcuts")
|
||||
{
|
||||
m_shortcuts_open = true;
|
||||
|
||||
@@ -1660,20 +1660,27 @@ std::vector<editor_mode::key_hint> editor_mode::track_key_hints(bool const All)
|
||||
auto const *tab{curve ? "back to the bends of straights" : "trace a curve on the photo"};
|
||||
if (m_lay.points.empty())
|
||||
hints = {{"LMB", "start, on the ground or at a free end"}, {"Tab", tab}, {"Drag from a free end", "lays the shape to the cursor"}, {"Shift+click a straight", "a parallel track (N)"}, {"Alt", "the direction in steps of 15 degrees, or 1:9, 1:6.6... to a straight track"}, {"Esc", "stop laying"}};
|
||||
else if (m_lay.points.size() > 1)
|
||||
{
|
||||
// the points clicked are no track until Enter: it comes right after the click, where the bar at the bottom shows it
|
||||
hints = {{"LMB", curve ? "a point along the middle of the curve, the last two on the straight after it" : "a bend of the straights, eased with a large curve"}, {"Enter", "lay the points clicked, then go on"},
|
||||
{"Backspace", "take back the point"}, {"LMB on a free end", "join and lay"}, {"Tab", tab}, {"Alt", "the direction in steps of 15 degrees, or 1:9, 1:6.6... to a straight track"},
|
||||
{"Esc", "twice: drop the points not laid"}};
|
||||
}
|
||||
else
|
||||
{
|
||||
hints = {{"LMB", curve ? "a point along the middle of the curve, the last two on the straight after it" : "a bend of the straights, eased with a large curve"}, {"LMB on a free end", "join and lay"}, {"Tab", tab}};
|
||||
if (m_lay.points.size() == 1 && m_lay.mouse_snap.track != nullptr)
|
||||
if (m_lay.mouse_snap.track != nullptr)
|
||||
hints.insert(hints.end(), {{"Ctrl+wheel", "radius"}, {"Shift+wheel", "another shape"}});
|
||||
hints.insert(hints.end(), {{"Alt", "the direction in steps of 15 degrees, or 1:9, 1:6.6... to a straight track"}, {"Enter", m_lay.points.size() > 1 ? "lay the points clicked, then go on" : "stop laying"},
|
||||
{"Backspace", m_lay.points.size() > 1 || m_lay.chain.empty() ? "take back the point" : "take back the last piece"}, {"Esc", "drop the points not laid"}});
|
||||
hints.insert(hints.end(), {{"Alt", "the direction in steps of 15 degrees, or 1:9, 1:6.6... to a straight track"}, {"Enter", "stop laying"},
|
||||
{"Backspace", m_lay.chain.empty() ? "take back the point" : "take back the last piece"}, {"Esc", "stop laying"}});
|
||||
}
|
||||
}
|
||||
else if (false == m_straights.detour.empty())
|
||||
{
|
||||
char const *const steps[] = {"leave the axis", "shifted", "start back", "back on the axis"};
|
||||
auto const step{std::min<std::size_t>(m_straights.detour.size(), 3)};
|
||||
hints = {{m_straights.tool == 2 ? "LMB" : "Shift+click", format("point %zu of 4: %s", step + 1, steps[step])}, {"Esc", "cancel"}};
|
||||
hints = {{m_straights.tool == 2 ? "LMB" : "Shift+click", format(STR_C("point %zu of 4: %s"), step + 1, STR_C(steps[step]))}, {"Esc", "cancel"}};
|
||||
}
|
||||
else if (m_extend.active)
|
||||
hints = {{"Drag", "lays the shape to the cursor, to a free end: joins it"}, {"Ctrl+wheel", "radius"}, {"Shift+wheel", "another shape"}, {"Release", "build"}, {"Esc", "cancel"}};
|
||||
@@ -1795,12 +1802,27 @@ std::vector<editor_mode::key_hint> editor_mode::track_key_hints(bool const All)
|
||||
hints = {{"Drag a point", "moves it, an end dropped on a free end joins it"}, {"Gizmo", action}, {"Q W E", "gizmo: move, turn, lengthen"}, {"Shift+LMB", "adds a track to the selection, drag: a box"}, {"L", "new track, also from a free end"}, {"Esc", "deselects"}, {"Del", "deletes the track"}};
|
||||
gizmo = true;
|
||||
}
|
||||
// the gizmo hidden has no handles to drag: Q, W and E bring it out
|
||||
if (gizmo && false == m_track_gizmo_on)
|
||||
{
|
||||
auto const named = [](char const *Key) { return [Key](key_hint const &Hint) { return std::string_view{Hint.key} == Key; }; };
|
||||
auto const handles{std::find_if(hints.begin(), hints.end(), named("Gizmo"))};
|
||||
if (auto const keys{std::find_if(hints.begin(), hints.end(), named("Q W E"))}; keys != hints.end())
|
||||
{
|
||||
keys->action = "bring out the gizmo: move, turn, lengthen";
|
||||
if (handles != hints.end())
|
||||
hints.erase(handles);
|
||||
}
|
||||
else if (handles != hints.end())
|
||||
*handles = {"Q W E", "bring out the gizmo: move, turn, lengthen"};
|
||||
gizmo = false;
|
||||
}
|
||||
if (auto const *meaning{typed_meaning()}; meaning != nullptr)
|
||||
hints.insert(hints.begin() + std::min<std::size_t>(1, hints.size()), {"0-9", meaning});
|
||||
if (All)
|
||||
{
|
||||
if (gizmo && m_gizmo_snap > 0.0f)
|
||||
hints.push_back({"Ctrl", format("gizmo snaps by %.2f m", m_gizmo_snap)});
|
||||
hints.push_back({"Ctrl", format(STR_C("gizmo snaps by %.2f m"), m_gizmo_snap)});
|
||||
hints.push_back({"K", "split the path under the cursor, a break of the grade at the height of the ground"});
|
||||
hints.push_back({"O", "top view"});
|
||||
hints.push_back({"Esc", "back to Select"});
|
||||
@@ -1808,7 +1830,7 @@ std::vector<editor_mode::key_hint> editor_mode::track_key_hints(bool const All)
|
||||
hints.push_back({"Hold the wheel", "pans the view"});
|
||||
hints.push_back({"Ctrl+Z", "undo"});
|
||||
hints.push_back({"Ctrl+Y", "redo"});
|
||||
hints.push_back({"L T G C B P V J I", "modes: lay, switch, straight, curve, objects, profile, speed, joints, infra"});
|
||||
hints.push_back({"L T G N I B P V J", "tools: lay, switch, plan, parallel, signalling, objects, profile, speed, joints"});
|
||||
}
|
||||
for (auto &hint : hints)
|
||||
{
|
||||
@@ -1865,6 +1887,14 @@ std::string editor_mode::track_readout() const
|
||||
if (m_lay.active)
|
||||
{
|
||||
auto const &lay{m_lay};
|
||||
// of a list of warnings only the first one by the cursor, the panel lists them all
|
||||
auto const first_of = [](std::string const &Lines) {
|
||||
auto const end{Lines.find('\n')};
|
||||
if (end == std::string::npos)
|
||||
return Lines;
|
||||
auto const more{static_cast<std::size_t>(std::count(Lines.begin() + end, Lines.end(), '\n'))};
|
||||
return Lines.substr(0, end) + "\n" + format(STR_P("and %zu more, in the panel", "and %zu more, in the panel", static_cast<long long>(more)), more);
|
||||
};
|
||||
std::string text;
|
||||
if (lay.points.empty())
|
||||
text = lay.mouse_snap.track != nullptr ? format(STR_C("starts at the end of %s"), name(lay.mouse_snap.track).c_str()) : std::string{STR_C("start")};
|
||||
@@ -1920,14 +1950,19 @@ std::string editor_mode::track_readout() const
|
||||
if (false == lay.points.empty() && lay.mouse_snap.track != nullptr)
|
||||
text += "\n" + format(STR_C("joins %s"), name(lay.mouse_snap.track).c_str());
|
||||
if (false == lay.preview_error.empty())
|
||||
text += "\n" + lay.preview_error;
|
||||
text += "\n" + first_of(lay.preview_error);
|
||||
if (lay.points.size() == 1 && lay.mouse_snap.track != nullptr)
|
||||
text += "\n" + track_shaping(lay.start.track != nullptr);
|
||||
text += "\n" + std::string{lay.mode == lay_mode::curve ? STR_C("Curve traced, Tab: the bends of straights") : STR_C("Bends of straights, Tab: a curve traced")};
|
||||
// the bends are laid by default, the bar at the bottom tells of Tab: only the curve traced is named
|
||||
if (lay.mode == lay_mode::curve)
|
||||
text += "\n" + std::string{STR_C("Curve traced, Tab: the bends of straights")};
|
||||
if (ImGui::GetIO().KeyAlt && false == lay.points.empty())
|
||||
text += "\n" + (lay.skew.empty() ? format(STR_C("azimuth %.0f deg"), azimuth(lay.points.back(), lay.mouse)) : lay.skew);
|
||||
if (false == lay.status.empty() && ImGui::GetTime() - lay.status_time < 4.0)
|
||||
text += "\n" + lay.status;
|
||||
// the warning of the first Esc leads, where it's read first
|
||||
if (ImGui::GetTime() - lay.escape_time < 3.0)
|
||||
text = lay.status + "\n" + text;
|
||||
else if (false == lay.status.empty() && ImGui::GetTime() - lay.status_time < 4.0)
|
||||
text += "\n" + first_of(lay.status);
|
||||
return text;
|
||||
}
|
||||
auto const &state{m_straights};
|
||||
@@ -2064,8 +2099,8 @@ void editor_mode::draw_empty_scenery_hint()
|
||||
std::vector<std::pair<char const *, char const *>> rows;
|
||||
if (m_track_tab == track_tab::path)
|
||||
rows.emplace_back("L", "the lay tool");
|
||||
rows.emplace_back("LMB", "on the ground: the first point, then each next one lays a piece");
|
||||
rows.emplace_back("Ctrl+wheel", "the radius of the curve while laying");
|
||||
rows.emplace_back("LMB", "on the ground: the first point, then the bends of the line, the curves at them made by themselves");
|
||||
rows.emplace_back("Enter", "lays the track clicked");
|
||||
rows.emplace_back("F1", "all the shortcuts, and the tutorial");
|
||||
auto const width{std::min(high.x - low.x - 2.0f * pad, std::round(font * 30.0f))};
|
||||
auto const column{std::round(picture * 5.0f)};
|
||||
@@ -2163,9 +2198,16 @@ void editor_mode::draw_track_hints()
|
||||
return;
|
||||
auto *foreground{ImGui::GetForegroundDrawList(ImGui::GetMainViewport())};
|
||||
auto const size{ImGui::CalcTextSize(readout.c_str())};
|
||||
// right below the cursor, or on its other side where the view ends: it doesn't cover the panels by the view
|
||||
auto const low{editor_ui::view_min()};
|
||||
auto const high{editor_ui::view_max()};
|
||||
ImVec2 at{io.MousePos.x + 20.0f, io.MousePos.y + 20.0f};
|
||||
at.x = std::min(at.x, io.DisplaySize.x - size.x - 10.0f);
|
||||
at.y = std::min(at.y, io.DisplaySize.y - size.y - 10.0f);
|
||||
if (at.x + size.x + 10.0f > high.x)
|
||||
at.x = io.MousePos.x - 20.0f - size.x;
|
||||
if (at.y + size.y + 10.0f > high.y)
|
||||
at.y = io.MousePos.y - 20.0f - size.y;
|
||||
at.x = std::max(at.x, low.x + 10.0f);
|
||||
at.y = std::max(at.y, low.y + 10.0f);
|
||||
foreground->AddRectFilled(ImVec2(at.x - 6.0f, at.y - 4.0f), ImVec2(at.x + size.x + 6.0f, at.y + size.y + 4.0f), IM_COL32(0, 0, 0, 190), 4.0f);
|
||||
foreground->AddRect(ImVec2(at.x - 6.0f, at.y - 4.0f), ImVec2(at.x + size.x + 6.0f, at.y + size.y + 4.0f), overlay_color::marked, 4.0f);
|
||||
foreground->AddText(at, IM_COL32(255, 255, 255, 255), readout.c_str());
|
||||
|
||||
@@ -412,24 +412,35 @@ void editor_mode::render_toolbar_tools()
|
||||
void editor_mode::render_viewport_gizmo()
|
||||
{
|
||||
// the gizmo moves the models and the tracks; on the terrain the mouse is the brush's
|
||||
if (false == m_gizmo_enabled || current_work_area() == work_area::terrain || (ui()->mode() == nodebank_panel::TRACK && track_plan_tab()))
|
||||
// in the tracks the row stays with the gizmo hidden, so it can be brought out with a click
|
||||
auto const tracks{ui()->mode() == nodebank_panel::TRACK};
|
||||
if ((false == tracks && false == m_gizmo_enabled) || current_work_area() == work_area::terrain || (tracks && track_plan_tab()))
|
||||
return;
|
||||
auto const tooltip{STR_C("What the handles of the gizmo on the selection do when dragged; Ctrl held snaps the values")};
|
||||
std::array<tool_button, 4> const buttons{{
|
||||
{icon::translate, STR_C("Translate"), "Q", tooltip, m_gizmo_op == gizmo_operation::translate, [this]() { m_gizmo_op = gizmo_operation::translate; }},
|
||||
{icon::rotate, STR_C("Rotate"), "W", tooltip, m_gizmo_op == gizmo_operation::rotate, [this]() { m_gizmo_op = gizmo_operation::rotate; }},
|
||||
{icon::scale, STR_C("Scale"), "E", tooltip, m_gizmo_op == gizmo_operation::scale, [this]() { m_gizmo_op = gizmo_operation::scale; }},
|
||||
// the gizmo always scales along the axes of the model
|
||||
{icon::local_space, STR_C("Local space"), "R", STR_C("The handles along the axes of the selected model instead of the axes of the world"), m_gizmo_local || m_gizmo_op == gizmo_operation::scale,
|
||||
[this]() { m_gizmo_local = !m_gizmo_local; }, true, m_gizmo_op != gizmo_operation::scale},
|
||||
}};
|
||||
auto const on{gizmo_shown()};
|
||||
auto const choose = [this](gizmo_operation const Operation) {
|
||||
m_gizmo_op = Operation;
|
||||
if (ui()->mode() == nodebank_panel::TRACK)
|
||||
m_track_gizmo_on = true;
|
||||
};
|
||||
std::vector<tool_button> buttons;
|
||||
if (tracks)
|
||||
buttons.push_back({icon::select, STR_C("No gizmo"), nullptr, STR_C("The gizmo hidden: a track is changed by dragging its points, and won't move by chance"), false == on, [this]() { m_track_gizmo_on = false; }});
|
||||
buttons.push_back({icon::translate, STR_C("Translate"), "Q", tooltip, on && m_gizmo_op == gizmo_operation::translate, [choose]() { choose(gizmo_operation::translate); }, tracks});
|
||||
buttons.push_back({icon::rotate, STR_C("Rotate"), "W", tooltip, on && m_gizmo_op == gizmo_operation::rotate, [choose]() { choose(gizmo_operation::rotate); }});
|
||||
buttons.push_back({icon::scale, STR_C("Scale"), "E", tooltip, on && m_gizmo_op == gizmo_operation::scale, [choose]() { choose(gizmo_operation::scale); }});
|
||||
// the gizmo always scales along the axes of the model
|
||||
buttons.push_back({icon::local_space, STR_C("Local space"), "R", STR_C("The handles along the axes of the selected model instead of the axes of the world"), on && (m_gizmo_local || m_gizmo_op == gizmo_operation::scale),
|
||||
[this]() { m_gizmo_local = !m_gizmo_local; }, true, on && m_gizmo_op != gizmo_operation::scale});
|
||||
// in a row at the top, in the middle
|
||||
auto const side{button_side()};
|
||||
auto const gap{2.0f * scale()};
|
||||
auto const groupgap{8.0f * scale()};
|
||||
auto const margin{8.0f * scale()};
|
||||
auto const pad{3.0f * scale()};
|
||||
auto const width{4.0f * side + 2.0f * gap + groupgap};
|
||||
float width{0.0f};
|
||||
for (auto const &button : buttons)
|
||||
width += side + (&button == &buttons.front() ? 0.0f : button.group ? groupgap : gap);
|
||||
ImVec2 const origin{std::round((editor_ui::view_min().x + editor_ui::view_max().x - width) * 0.5f), editor_ui::view_min().y + margin};
|
||||
if (begin_overlay("##viewportgizmo", ImVec2(origin.x - pad, origin.y - pad), ImVec2(width + 2.0f * pad, side + 2.0f * pad)))
|
||||
{
|
||||
|
||||
@@ -34,7 +34,7 @@ enum class editor_selftest_result
|
||||
again
|
||||
};
|
||||
|
||||
enum class editor_first_step { tracks, lay, laid, wheel, join, turnout, undo, save, drive, look, top, select, shape, profile, profile_point, profile_apply, terrain, nmt, plan, plan_band, plan_apply, signal, posts, count };
|
||||
enum class editor_first_step { tracks, lay, laid, wheel, join, turnout, undo, save, drive, look, top, select, shape, profile, profile_point, profile_apply, terrain, nmt, plan, plan_band, plan_apply, signal, posts, bend, trace, count };
|
||||
|
||||
enum class editor_track_tab { straights, route, path, turnout, profile, speed, joints, infra, lay, lineside, turntable, parallel, srk, kilometrage };
|
||||
|
||||
|
||||
@@ -490,9 +490,6 @@ msgstr "powrót do Wyboru"
|
||||
msgid "move the selected switch"
|
||||
msgstr "przesuwa zaznaczony rozjazd"
|
||||
|
||||
msgid "modes: lay, switch, straight, curve, profile, speed, infra"
|
||||
msgstr "tryby: układanie, rozjazd, prosta, łuk, profil, prędkość, infrastruktura"
|
||||
|
||||
msgid "Select"
|
||||
msgstr "Zaznaczanie"
|
||||
|
||||
@@ -1833,9 +1830,6 @@ msgstr "łączy końce, wyrównuje je"
|
||||
msgid "kink"
|
||||
msgstr "załamanie"
|
||||
|
||||
msgid "modes: lay, switch, straight, curve, profile, speed, joints, infra"
|
||||
msgstr "tryby: układanie, rozjazd, prosta, łuk, profil, prędkość, styki, infrastruktura"
|
||||
|
||||
msgid "show the place"
|
||||
msgstr "pokazuje miejsce"
|
||||
|
||||
@@ -2088,9 +2082,6 @@ msgstr "układa"
|
||||
msgid "the line the objects go along"
|
||||
msgstr "linia, wzdłuż której idą obiekty"
|
||||
|
||||
msgid "modes: lay, switch, straight, curve, objects, profile, speed, joints, infra"
|
||||
msgstr "tryby: układanie, rozjazd, prosta, łuk, obiekty, profil, prędkość, styki, infrastruktura"
|
||||
|
||||
msgid "Fouling points"
|
||||
msgstr "Ukresy W17"
|
||||
|
||||
@@ -4068,8 +4059,8 @@ msgstr "Zaznaczanie, Wstawianie, Pędzel, Wypełnianie obszaru, Kopiuj do banku"
|
||||
msgid "Select: add a point, or take it out"
|
||||
msgstr "Zaznaczanie: dodaj punkt do zaznaczenia albo go z niego zdejmij"
|
||||
|
||||
msgid "Signals / objects along the track"
|
||||
msgstr "Sygnalizatory / obiekty wzdłuż toru"
|
||||
msgid "Signalling / objects along the track"
|
||||
msgstr "SRK / obiekty wzdłuż toru"
|
||||
|
||||
msgid "Snap to the step set in the gizmo settings"
|
||||
msgstr "Przyciąganie do kroku z ustawień gizma"
|
||||
@@ -4113,9 +4104,6 @@ msgstr "Ta lista skrótów"
|
||||
msgid "Top view, orthographic"
|
||||
msgstr "Widok z góry"
|
||||
|
||||
msgid "Translate / rotate / scale"
|
||||
msgstr "Przesuń / Obróć / Skaluj"
|
||||
|
||||
msgid "Undo"
|
||||
msgstr "Cofnij"
|
||||
|
||||
@@ -4530,12 +4518,6 @@ msgstr "L, LPM, LPM..."
|
||||
msgid "Lead a track out of it; onto another free end: join the two"
|
||||
msgstr "Wyprowadza z niego tor; na inny wolny koniec: łączy oba"
|
||||
|
||||
msgid "Laying: radius"
|
||||
msgstr "Układanie: promień"
|
||||
|
||||
msgid "Laying: arc then straight, straight then arc, arc, straight; at a free end: another way to join"
|
||||
msgstr "Układanie: łuk i prosta, prosta i łuk, łuk, prosta; na wolnym końcu: inny sposób połączenia"
|
||||
|
||||
msgid "0-9 while laying"
|
||||
msgstr "0-9 w trakcie układania"
|
||||
|
||||
@@ -5334,51 +5316,21 @@ msgstr "Dział Tory"
|
||||
msgid "The lay tool"
|
||||
msgstr "Narzędzie Układanie"
|
||||
|
||||
msgid "A click on the ground: the first point; the next click: a straight up to it"
|
||||
msgstr "Klik na ziemi: pierwszy punkt; następny klik: prosta do niego"
|
||||
|
||||
msgid "Each next click lays a piece on from the end of the last one"
|
||||
msgstr "Każdy kolejny klik układa kawałek dalej, od końca poprzedniego"
|
||||
|
||||
msgid "Takes the last piece back"
|
||||
msgstr "Cofa ostatni kawałek"
|
||||
|
||||
msgid "Ends laying"
|
||||
msgstr "Kończy układanie"
|
||||
|
||||
msgid "Open the Tracks field of work"
|
||||
msgstr "Otwórz dział Tory"
|
||||
|
||||
msgid "Turn the lay tool on"
|
||||
msgstr "Włącz układanie"
|
||||
|
||||
msgid "Lay a track"
|
||||
msgstr "Ułóż tor"
|
||||
|
||||
msgid "Curves"
|
||||
msgstr "Łuki"
|
||||
|
||||
msgid "The radius of the curve, while laying on from an end"
|
||||
msgstr "Promień łuku, gdy układasz dalej od końca toru"
|
||||
|
||||
msgid "The shape: arc then straight, straight then arc, arc, straight"
|
||||
msgstr "Kształt: łuk i prosta, prosta i łuk, sam łuk, prosta"
|
||||
|
||||
msgid "Held: the direction turns in steps of 15 degrees, or to 1:9, 1:6.6... to a straight track it starts by or crosses"
|
||||
msgstr "Trzymany: kierunek zmienia się co 15 stopni albo na 1:9, 1:6,6… do prostego toru, przy którym się zaczyna albo który przecina"
|
||||
|
||||
msgid "Type the length of the next piece, Enter lays it"
|
||||
msgstr "Wpisz długość następnego kawałka, Enter go układa"
|
||||
|
||||
msgid "Alone it zooms, as everywhere"
|
||||
msgstr "Samo kółko przybliża, jak wszędzie"
|
||||
|
||||
msgid "Change the radius with Ctrl+wheel"
|
||||
msgstr "Zmień promień: Ctrl+kółko"
|
||||
|
||||
msgid "Change the shape with Shift+wheel"
|
||||
msgstr "Zmień kształt: Shift+kółko"
|
||||
|
||||
msgid "Joining tracks"
|
||||
msgstr "Łączenie torów"
|
||||
|
||||
@@ -5415,9 +5367,6 @@ msgstr "Kliknij tor: zostaje zaznaczony, widać jego punkty"
|
||||
msgid "Drag a point: the end or the curve follows"
|
||||
msgstr "Przeciągnij punkt: koniec albo łuk idzie za nim"
|
||||
|
||||
msgid "Move, turn or scale with the gizmo"
|
||||
msgstr "Przesuwanie, obracanie, skalowanie gizmem"
|
||||
|
||||
msgid "A click on a track: what can be done with it"
|
||||
msgstr "Klik na torze: co można z nim zrobić"
|
||||
|
||||
@@ -6023,9 +5972,6 @@ msgstr "Narzędzie Rozjazd; na górze: co stawiasz"
|
||||
msgid "Click a track: the switch goes into it"
|
||||
msgstr "Kliknij tor: rozjazd wejdzie w niego"
|
||||
|
||||
msgid "Tool options, Gizmo, Off: the track won't move by chance"
|
||||
msgstr "Opcje narzędzia, Gizmo, Wył.: tor nie przesunie się przypadkiem"
|
||||
|
||||
msgid "Press on it and drag: along the direction, sideways the side"
|
||||
msgstr "Wciśnij na nim i przeciągnij: wzdłuż toru zmienia kierunek, w bok stronę"
|
||||
|
||||
@@ -7043,18 +6989,6 @@ msgstr "Teren z modelu terenu"
|
||||
msgid "The Terrain field of work: the terrain model (NMT) is in its tool options"
|
||||
msgstr "Dział Teren: numeryczny model terenu (NMT) jest w jego opcjach narzędzia"
|
||||
|
||||
msgid "Location: where the scenery lies in PUWG 1992; a scenery begun from nothing asks for it with its first track"
|
||||
msgstr "Położenie: gdzie na mapie leży sceneria; nowa sceneria pyta o nie przy pierwszym torze"
|
||||
|
||||
msgid "What gives way: the tracks go onto the terrain, or the terrain is drawn to the tracks"
|
||||
msgstr "Co dopasować: tory kładą się na teren albo teren dociąga się do torów"
|
||||
|
||||
msgid "Load: the model comes from geoportal.gov.pl, the terrain is made along the tracks with the formation and the slopes"
|
||||
msgstr "Wczytaj: model przychodzi z geoportal.gov.pl, teren powstaje wzdłuż torów razem z torowiskiem i skarpami"
|
||||
|
||||
msgid "Takes the changes of the tracks back"
|
||||
msgstr "Cofa zmiany torów"
|
||||
|
||||
msgid "Open the Terrain field of work"
|
||||
msgstr "Otwórz dział Teren"
|
||||
|
||||
@@ -7349,12 +7283,6 @@ msgstr "Sceneria nie ma jeszcze torów"
|
||||
msgid "the lay tool"
|
||||
msgstr "narzędzie układania"
|
||||
|
||||
msgid "on the ground: the first point, then each next one lays a piece"
|
||||
msgstr "na terenie: pierwszy punkt, każdy następny układa kawałek"
|
||||
|
||||
msgid "the radius of the curve while laying"
|
||||
msgstr "promień łuku przy układaniu"
|
||||
|
||||
msgid "all the shortcuts, and the tutorial"
|
||||
msgstr "wszystkie skróty i samouczek"
|
||||
|
||||
@@ -7490,9 +7418,6 @@ msgstr "Stawia pociąg na torze i od razu daje kabinę"
|
||||
msgid "Tool options, Gizmo, Off"
|
||||
msgstr "Opcje narzędzia, Gizmo, Wył."
|
||||
|
||||
msgid "Hides the gizmo, so nothing moves by chance"
|
||||
msgstr "Ukrywa gizmo, żeby nic nie przesunęło się przypadkiem"
|
||||
|
||||
msgid "the grade line of its whole line"
|
||||
msgstr "niweleta całej jego linii"
|
||||
|
||||
@@ -7547,9 +7472,6 @@ msgstr "Narzędzie Skład"
|
||||
msgid "Twelve short lessons with clips and drawings: the camera, laying track, curves, correcting a curve, joining, switches, signals and posts, fixing, the grade line, terrain, older sceneries, saving and driving"
|
||||
msgstr "Dwanaście krótkich lekcji z filmikami i rysunkami: kamera, układanie toru, łuki, poprawianie łuku, łączenie, rozjazdy, sygnalizatory i słupki, poprawki, niweleta, teren, starsze scenerie, zapis i jazda"
|
||||
|
||||
msgid "H: by the track, drag along: the way the trains run"
|
||||
msgstr "H: przy torze, przeciągnij wzdłuż: kierunek pociągów"
|
||||
|
||||
msgid "B: the hectometre posts of the whole line at once"
|
||||
msgstr "B: słupki hektometrowe całej linii naraz"
|
||||
|
||||
@@ -8606,11 +8528,11 @@ msgstr[0] "Usunięty %zu tor, Ctrl+Z go przywraca"
|
||||
msgstr[1] "Usunięte %zu tory, Ctrl+Z je przywraca"
|
||||
msgstr[2] "Usuniętych %zu torów, Ctrl+Z je przywraca"
|
||||
|
||||
msgid "Laid %zu track, %.1f m, Ctrl+Z takes it back"
|
||||
msgid_plural "Laid %zu tracks, %.1f m, Ctrl+Z takes them back"
|
||||
msgstr[0] "Ułożony %zu tor, %.1f m, Ctrl+Z cofa"
|
||||
msgstr[1] "Ułożone %zu tory, razem %.1f m, Ctrl+Z cofa"
|
||||
msgstr[2] "Ułożonych %zu torów, razem %.1f m, Ctrl+Z cofa"
|
||||
msgid "Laid %.1f m of track in %zu piece, Ctrl+Z takes it back"
|
||||
msgid_plural "Laid %.1f m of track in %zu pieces, Ctrl+Z takes it back"
|
||||
msgstr[0] "Ułożono %.1f m toru (%zu odcinek), Ctrl+Z cofa"
|
||||
msgstr[1] "Ułożono %.1f m toru (%zu odcinki), Ctrl+Z cofa"
|
||||
msgstr[2] "Ułożono %.1f m toru (%zu odcinków), Ctrl+Z cofa"
|
||||
|
||||
msgid "The geometry allows any speed up to %.0f km/h"
|
||||
msgstr "Geometria pozwala na dowolną prędkość do %.0f km/h"
|
||||
@@ -10304,8 +10226,8 @@ msgstr "prędkość projektowa %.0f km/h, ustawiona do kładzenia"
|
||||
msgid ", Ctrl+Shift+wheel: speed"
|
||||
msgstr ", Ctrl+Shift+kółko: prędkość"
|
||||
|
||||
msgid "This speed also on from a track with its own"
|
||||
msgstr "Ta prędkość także od toru z własną"
|
||||
msgid "This speed also on from a track with a speed of its own"
|
||||
msgstr "Ta prędkość także przy torze z własną prędkością"
|
||||
|
||||
msgid "Off: a track laid on from another one, or joined to it, takes the speed of that track.\nOn: the new tracks get the speed above"
|
||||
msgstr "Wyłączone: tor kładziony od innego toru albo dołączany do niego bierze prędkość tamtego toru.\nWłączone: nowe tory dostają prędkość z pola powyżej"
|
||||
@@ -11813,8 +11735,11 @@ msgstr "Każdy kliknięty punkt to załamanie prostych: wyokrąglone dwiema styc
|
||||
msgid "Click points along the middle of a curve seen on the photo, the last two on the straight after it: the curve, compound or with a straight in it, is fitted to them. It comes from the straight before it, of the points clicked before or of the free end"
|
||||
msgstr "Klikaj punkty po środku łuku widocznego na zdjęciu, dwa ostatnie na prostej za nim: łuk, także koszowy albo z prostą w środku, zostanie do nich dopasowany. Wychodzi z prostej przed nim, wyznaczonej punktami klikniętymi wcześniej albo wolnym końcem"
|
||||
|
||||
msgid "Bends: R from (m)"
|
||||
msgstr "Załamania: R od (m)"
|
||||
msgid "Radius of the curves at the bends"
|
||||
msgstr "Promień łuków na załamaniach"
|
||||
|
||||
msgid "from (m)"
|
||||
msgstr "od (m)"
|
||||
|
||||
msgid "to (m)"
|
||||
msgstr "do (m)"
|
||||
@@ -11858,9 +11783,6 @@ msgstr "%zu punktów, odchyłka %.0f cm, najwięcej %.0f cm"
|
||||
msgid "Curve traced, Tab: the bends of straights"
|
||||
msgstr "Łuk odrysowywany, Tab: załamania prostych"
|
||||
|
||||
msgid "Bends of straights, Tab: a curve traced"
|
||||
msgstr "Załamania prostych, Tab: łuk odrysowywany"
|
||||
|
||||
msgid "back to the bends of straights"
|
||||
msgstr "z powrotem załamania prostych"
|
||||
|
||||
@@ -11876,9 +11798,6 @@ msgstr "załamanie prostych, wyokrąglone dużym łukiem"
|
||||
msgid "lay the points clicked, then go on"
|
||||
msgstr "kładzie kliknięte punkty i prowadzi dalej"
|
||||
|
||||
msgid "drop the points not laid"
|
||||
msgstr "porzuca niepołożone punkty"
|
||||
|
||||
msgid "Lay track: each click a bend of the straights, eased with a large curve; Enter lays them and goes on from the end"
|
||||
msgstr "Układanie toru: każdy klik to załamanie prostych, wyokrąglone dużym łukiem; Enter je kładzie i prowadzi tor dalej od końca"
|
||||
|
||||
@@ -12086,3 +12005,141 @@ msgstr "km %s - %s, %.2f mm/m"
|
||||
|
||||
msgid "ramp %.0f m, %.0f mm"
|
||||
msgstr "rampa %.0f m, %.0f mm"
|
||||
|
||||
|
||||
# scenery editor: laying and editing the track, as a beginner meets them
|
||||
|
||||
msgid "No gizmo"
|
||||
msgstr "Bez gizma"
|
||||
|
||||
msgid "The gizmo hidden: a track is changed by dragging its points, and won't move by chance"
|
||||
msgstr "Gizmo ukryte: tor zmienia się przeciąganiem jego punktów i nie przesunie się przypadkiem"
|
||||
|
||||
msgid "bring out the gizmo: move, turn, lengthen"
|
||||
msgstr "pokazuje gizmo: przesuń, obróć, wydłuż"
|
||||
|
||||
msgid "gizmo snaps by %.2f m"
|
||||
msgstr "gizmo przeskakuje co %.2f m"
|
||||
|
||||
msgid "point %zu of 4: %s"
|
||||
msgstr "punkt %zu z 4: %s"
|
||||
|
||||
msgid "start back"
|
||||
msgstr "początek powrotu"
|
||||
|
||||
msgid "back on the axis"
|
||||
msgstr "z powrotem na osi"
|
||||
|
||||
msgid "moves it, an end dropped on a free end joins it"
|
||||
msgstr "przesuwa go; koniec upuszczony na wolny koniec łączy się z nim"
|
||||
|
||||
msgid "and %zu more, in the panel"
|
||||
msgid_plural "and %zu more, in the panel"
|
||||
msgstr[0] "i jeszcze %zu, w panelu"
|
||||
msgstr[1] "i jeszcze %zu, w panelu"
|
||||
msgstr[2] "i jeszcze %zu, w panelu"
|
||||
|
||||
msgid "on the ground: the first point, then the bends of the line, the curves at them made by themselves"
|
||||
msgstr "na terenie: pierwszy punkt, potem załamania linii; łuki na nich powstają same"
|
||||
|
||||
msgid "lays the track clicked"
|
||||
msgstr "układa wyklikany tor"
|
||||
|
||||
msgid "tools: lay, switch, plan, parallel, signalling, objects, profile, speed, joints"
|
||||
msgstr "narzędzia: układanie, rozjazd, plan, równoległy, SRK, obiekty, profil, prędkość, styki"
|
||||
|
||||
msgid "Esc again drops the point not laid, Enter lays it"
|
||||
msgid_plural "Esc again drops the %zu points not laid, Enter lays them"
|
||||
msgstr[0] "Esc jeszcze raz porzuca nieułożony punkt, Enter go układa"
|
||||
msgstr[1] "Esc jeszcze raz porzuca %zu nieułożone punkty, Enter je układa"
|
||||
msgstr[2] "Esc jeszcze raz porzuca %zu nieułożonych punktów, Enter je układa"
|
||||
|
||||
msgid "twice: drop the points not laid"
|
||||
msgstr "dwa razy: porzuca nieułożone punkty"
|
||||
|
||||
msgid "Not laid yet: %zu point"
|
||||
msgid_plural "Not laid yet: %zu points"
|
||||
msgstr[0] "Jeszcze nieułożony: %zu punkt"
|
||||
msgstr[1] "Jeszcze nieułożone: %zu punkty"
|
||||
msgstr[2] "Jeszcze nieułożonych: %zu punktów"
|
||||
|
||||
msgid "Lay (Enter)"
|
||||
msgstr "Ułóż (Enter)"
|
||||
|
||||
msgid "Drop the points"
|
||||
msgstr "Porzuć punkty"
|
||||
|
||||
msgid "Esc twice does the same"
|
||||
msgstr "To samo robi dwa razy Esc"
|
||||
|
||||
msgid "A click on the ground or on a free end: where the track starts"
|
||||
msgstr "Klik na terenie albo na wolnym końcu: tu zaczyna się tor"
|
||||
|
||||
msgid "Each next click: a bend of the line, the curve at it made by itself. The line shown isn't a track yet"
|
||||
msgstr "Każdy następny klik: załamanie linii, łuk na nim powstaje sam. Pokazana linia nie jest jeszcze torem"
|
||||
|
||||
msgid "Lays the track clicked; the clicks after it go on from its end"
|
||||
msgstr "Układa wyklikany tor; kolejne kliki idą dalej od jego końca"
|
||||
|
||||
msgid "Takes the last point back, then the last piece laid"
|
||||
msgstr "Cofa ostatni punkt, potem ostatni ułożony odcinek"
|
||||
|
||||
msgid "Ends laying; the points not laid yet go only with the second Esc"
|
||||
msgstr "Kończy układanie; nieułożone punkty znikają dopiero po drugim Esc"
|
||||
|
||||
msgid "Click a few points and lay them with Enter"
|
||||
msgstr "Wyklikaj kilka punktów i ułóż je Enterem"
|
||||
|
||||
msgid "Click the bends of the line: each gets a curve as large as fits; one too sharp for the speed set in the panel has its label in orange"
|
||||
msgstr "Klikaj załamania linii: każde dostaje łuk tak duży, jak się zmieści; łuk za ostry dla prędkości ustawionej w panelu ma pomarańczowy opis"
|
||||
|
||||
msgid "A curve seen on the photo: click points along its middle, the last two on the straight after it"
|
||||
msgstr "Łuk widoczny na zdjęciu: klikaj punkty wzdłuż jego środka, dwa ostatnie na prostej za nim"
|
||||
|
||||
msgid "Lay a track with a bend in it"
|
||||
msgstr "Ułóż tor z załamaniem"
|
||||
|
||||
msgid "Switch to tracing a curve with Tab"
|
||||
msgstr "Przełącz klawiszem Tab na odrysowywanie łuku"
|
||||
|
||||
msgid "Change the radius of the joining curve with Ctrl+wheel"
|
||||
msgstr "Zmień promień łuku łączącego Ctrl+kółkiem"
|
||||
|
||||
msgid "The gizmo on the selected track: move, turn, lengthen. Hidden until then, so the track won't move by chance; the arrow above the view hides it again"
|
||||
msgstr "Gizmo na zaznaczonym torze: przesuń, obróć, wydłuż. Do tego czasu ukryte, więc tor nie przesunie się przypadkiem; strzałka nad widokiem chowa je z powrotem"
|
||||
|
||||
msgid "In a scenery begun from nothing the first L asks: the real terrain of the place, or the flat plane"
|
||||
msgstr "W scenerii zaczętej od zera pierwsze L pyta: prawdziwy teren tego miejsca czy płaska płaszczyzna"
|
||||
|
||||
msgid "Location: where the scenery lies, a click on the map or the place typed"
|
||||
msgstr "Położenie: gdzie leży sceneria, klik na mapie albo wpisane miejsce"
|
||||
|
||||
msgid "Load along the tracks, or around the camera: the model comes from geoportal.gov.pl"
|
||||
msgstr "Wczytaj wzdłuż torów albo wokół kamery: model pochodzi z geoportal.gov.pl"
|
||||
|
||||
msgid "Tracks, select a track, Terrain in the inspector: draw the terrain to the track, or put the tracks onto the terrain"
|
||||
msgstr "Tory, zaznacz tor, Teren w inspektorze: dociągnij teren do toru albo połóż tory na terenie"
|
||||
|
||||
msgid "Takes the changes back"
|
||||
msgstr "Cofa zmiany"
|
||||
|
||||
msgid "LMB by the track, drag along: the way the trains run"
|
||||
msgstr "LPM przy torze, przeciągnij wzdłuż: kierunek jazdy pociągów"
|
||||
|
||||
msgid "Translate / rotate / scale; in the tracks they bring the hidden gizmo out"
|
||||
msgstr "Przesuń / obróć / skaluj; w torach pokazują ukryte gizmo"
|
||||
|
||||
msgid "Hides the gizmo, so nothing moves by chance; in the tracks it is hidden until Q, W or E"
|
||||
msgstr "Chowa gizmo, żeby nic nie przesunęło się przypadkiem; w torach jest ukryte aż do Q, W albo E"
|
||||
|
||||
msgid "Dragging from a free end: radius"
|
||||
msgstr "Przeciąganie z wolnego końca: promień"
|
||||
|
||||
msgid "Dragging from a free end: arc then straight, straight then arc, arc, straight; over another free end: another way to join"
|
||||
msgstr "Przeciąganie z wolnego końca: łuk i prosta, prosta i łuk, łuk, prosta; nad innym wolnym końcem: inny sposób połączenia"
|
||||
|
||||
msgid "Esc twice while laying"
|
||||
msgstr "Esc dwa razy przy układaniu"
|
||||
|
||||
msgid "Drop the points clicked and not laid yet"
|
||||
msgstr "Porzuca kliknięte, jeszcze nieułożone punkty"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 299 KiB After Width: | Height: | Size: 787 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 466 KiB After Width: | Height: | Size: 565 KiB |
Reference in New Issue
Block a user