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:
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user