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

feat(editor): a switch path can be a chain of pieces: the attributes pieces1 and pieces2 keep the parts of each path after the classic bezier, which stays as the approximation older versions read and log the attributes as unknown; the simulation drives, draws and maps a path along its pieces by distance, pieces that don't join the ends of the path are reported and the bezier used; the catalogue Rz switches get the diverging path as the arc of their radius and the straight after it, moving, rotating and mirroring a switch carry the pieces, reshaping a path by hand drops them; self-test commands switchpieces and switchbreak

This commit is contained in:
maj00r
2026-10-12 18:32:23 +02:00
parent 46d41549c9
commit ea341af27a
8 changed files with 329 additions and 60 deletions

View File

@@ -1035,12 +1035,13 @@ void editor_mode::render_turnout_ui()
auto &local{own.local[i]};
local = track->m_paths[i];
auto const tolocal = [&](glm::dvec3 const &Vector) { return glm::dvec3{glm::dot(plan_of(Vector), normal) * side, Vector.y, glm::dot(plan_of(Vector), axis)}; };
local.points[segment_data::point::start] = tolocal(track->m_paths[i].points[segment_data::point::start] - origin);
local.points[segment_data::point::end] = tolocal(track->m_paths[i].points[segment_data::point::end] - origin);
local.points[segment_data::point::control1] = tolocal(track->m_paths[i].points[segment_data::point::control1]);
local.points[segment_data::point::control2] = tolocal(track->m_paths[i].points[segment_data::point::control2]);
local.transform([&](glm::dvec3 const &Point) { return tolocal(Point - origin); }, tolocal);
if (side < 0)
{
local.rolls = {-local.rolls[0], -local.rolls[1]};
for (auto &piece : local.pieces)
piece.rolls = {-piece.rolls[0], -piece.rolls[1]};
}
}
replace(own, -side);
}
@@ -6069,12 +6070,13 @@ bool editor_mode::plan_crossover(crossover_plan &Plan) const
auto &local{shape.local[i]};
local = path;
auto const tolocal = [&](glm::dvec3 const &Vector) { return glm::dvec3{glm::dot(plan_of(Vector), perpendicular) * side, Vector.y, glm::dot(plan_of(Vector), axis)}; };
local.points[segment_data::point::start] = tolocal(path.points[segment_data::point::start] - origin);
local.points[segment_data::point::end] = tolocal(path.points[segment_data::point::end] - origin);
local.points[segment_data::point::control1] = tolocal(path.points[segment_data::point::control1]);
local.points[segment_data::point::control2] = tolocal(path.points[segment_data::point::control2]);
local.transform([&](glm::dvec3 const &Point) { return tolocal(Point - origin); }, tolocal);
if (side < 0.0)
{
local.rolls = {-local.rolls[0], -local.rolls[1]};
for (auto &piece : local.pieces)
piece.rolls = {-piece.rolls[0], -piece.rolls[1]};
}
}
Plan.shape = shape;
auto const station{line.start + glm::dvec3{line.direction.x, line.grade, line.direction.y} * Plan.along};