mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 05:09:20 +02:00
refactor(editor): anchor on the nearest place of a path
This commit is contained in:
@@ -567,10 +567,7 @@ std::optional<infra::binding> read_binding(std::string const &Text, scene::layer
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto const &point{points[std::min<std::size_t>(i, points.size() - 1)]};
|
auto const &point{points[std::min<std::size_t>(i, points.size() - 1)]};
|
||||||
double s;
|
binding.anchors.push_back(infra::make_anchor(*track, path, point));
|
||||||
bool interior;
|
|
||||||
infra::project((*track)->m_paths[path], point, s, interior);
|
|
||||||
binding.anchors.push_back(infra::make_anchor({*track, path, s}, point));
|
|
||||||
}
|
}
|
||||||
if (false == found || binding.anchors.size() != points.size())
|
if (false == found || binding.anchors.size() != points.size())
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
@@ -938,10 +935,7 @@ void editor_mode::track_captured(TTrack const &Track)
|
|||||||
auto placed{anchor};
|
auto placed{anchor};
|
||||||
if (glm::distance(infra::place(placed), points[i]) <= 0.01)
|
if (glm::distance(infra::place(placed), points[i]) <= 0.01)
|
||||||
continue;
|
continue;
|
||||||
double s;
|
anchor = infra::make_anchor(anchor.at.track, anchor.at.path, points[i]);
|
||||||
bool interior;
|
|
||||||
infra::project(path, points[i], s, interior);
|
|
||||||
anchor = infra::make_anchor({anchor.at.track, anchor.at.path, s}, points[i]);
|
|
||||||
}
|
}
|
||||||
if (binding.turns && yaw.has_value() && binding.anchors.front().at.track == &Track)
|
if (binding.turns && yaw.has_value() && binding.anchors.front().at.track == &Track)
|
||||||
binding.yaw = turn_of(binding, *yaw);
|
binding.yaw = turn_of(binding, *yaw);
|
||||||
@@ -1189,10 +1183,7 @@ void editor_mode::infra_rebase()
|
|||||||
binding.lost = true;
|
binding.lost = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
double s;
|
anchor = infra::make_anchor(anchor.at.track, anchor.at.path, points[i]);
|
||||||
bool interior;
|
|
||||||
infra::project(anchor.at.track->m_paths[anchor.at.path], points[i], s, interior);
|
|
||||||
anchor = infra::make_anchor({anchor.at.track, anchor.at.path, s}, points[i]);
|
|
||||||
}
|
}
|
||||||
if (binding.turns && yaw.has_value())
|
if (binding.turns && yaw.has_value())
|
||||||
binding.yaw = turn_of(binding, *yaw);
|
binding.yaw = turn_of(binding, *yaw);
|
||||||
|
|||||||
@@ -222,6 +222,14 @@ double heading(glm::dvec2 const &Forward)
|
|||||||
return glm::degrees(std::atan2(Forward.x, Forward.y));
|
return glm::degrees(std::atan2(Forward.x, Forward.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
anchor make_anchor(TTrack *Track, int const Path, glm::dvec3 const &Point)
|
||||||
|
{
|
||||||
|
double s;
|
||||||
|
bool interior;
|
||||||
|
project(Track->m_paths[Path], Point, s, interior);
|
||||||
|
return make_anchor({Track, Path, s}, Point);
|
||||||
|
}
|
||||||
|
|
||||||
anchor make_anchor(station const &At, glm::dvec3 const &Point)
|
anchor make_anchor(station const &At, glm::dvec3 const &Point)
|
||||||
{
|
{
|
||||||
anchor result;
|
anchor result;
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ struct anchor
|
|||||||
double length{0.0};
|
double length{0.0};
|
||||||
};
|
};
|
||||||
anchor make_anchor(station const &At, glm::dvec3 const &Point);
|
anchor make_anchor(station const &At, glm::dvec3 const &Point);
|
||||||
|
// anchor at the place of the path nearest to the point
|
||||||
|
anchor make_anchor(TTrack *Track, int const Path, glm::dvec3 const &Point);
|
||||||
// location for the current geometry of the path
|
// location for the current geometry of the path
|
||||||
glm::dvec3 place(anchor &Anchor);
|
glm::dvec3 place(anchor &Anchor);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user