mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 02:49:19 +02:00
feat(editor): track editor driven by what the cursor is over: the outline and a label show what a click or a drag does, snapping to free ends on the screen, handles and ends dragged directly, no rotation gizmo; laying from a free end the same in every mode, straight with Shift, the curve of a switch going on past its diverging end; height 0 where there's no terrain; placed switch leaves the switch mode, double slips listed apart, a drive of the switch placed with it by the //$e switch description of its template; compound curves of any number of radii; dragged end of a straight fits the curve beside it; name of a path, followed by the memory cells and the includes taking it; turntable placed from a template described as one, tracks led out of it and the tracks around fitted to it, its positions written to the include; infrastructure bound to the path whose events read its memory cell; terrain made where the route has none and shaped to the formation under the ballast; models along the track over the selected path and on along the joined ones while dragged, rarely used settings folded; vehicles and trainsets placed on any path, switches included, facing the way the arrow shows; joined paths spread into the selection; New scenery in the File menu starts the editor again with the wizard; ortho zoom towards the cursor; scripted self tests; Polish translation
This commit is contained in:
@@ -62,10 +62,22 @@ class editor_track
|
||||
glm::vec3 sleeper_offset{0.f};
|
||||
float sleeper_ballast{0.f};
|
||||
std::array<std::vector<std::pair<std::string, basic_event *>>, 6> events;
|
||||
std::string name;
|
||||
};
|
||||
static state capture(TTrack const &Track);
|
||||
static void apply(TTrack &Track, state const &State);
|
||||
|
||||
static bool name_valid(TTrack const &Track, std::string &Name, std::string &Reason, TTrack **Owner = nullptr);
|
||||
struct name_uses
|
||||
{
|
||||
int cells{0};
|
||||
int includes{0};
|
||||
std::vector<std::string> events;
|
||||
std::vector<std::string> loose;
|
||||
};
|
||||
static name_uses uses_of_name(TTrack const &Track);
|
||||
static void rename(TTrack &Track, std::string const &Name);
|
||||
|
||||
// lists of the events of the path, in the order of event_keyword(): event0, event1, event2, eventall0, eventall1, eventall2
|
||||
static std::vector<std::pair<std::string, basic_event *>> &events(TTrack &Track, int const Index);
|
||||
static char const *event_keyword(int const Index);
|
||||
@@ -116,6 +128,8 @@ class editor_track
|
||||
static snap_target find_snap_target(TTrack const &Track, glm::dvec3 const &Position, double const Radius, std::vector<TTrack const *> const &Exclude);
|
||||
// nearest end of a path of the category which nothing else joins; Self may be null
|
||||
static snap_target find_free_end(TTrack const *Self, int const Category, glm::dvec3 const &Position, double const Radius, std::vector<TTrack const *> const &Exclude);
|
||||
// all of them within the radius, nearest first
|
||||
static std::vector<snap_target> free_ends(TTrack const *Self, int const Category, glm::dvec3 const &Position, double const Radius, std::vector<TTrack const *> const &Exclude);
|
||||
static void snap_point(TTrack &Track, point_ref const &Point, snap_target const &Target, bool const Aligntangent);
|
||||
|
||||
struct chain
|
||||
@@ -183,9 +197,13 @@ class editor_track
|
||||
double transition_out{0.0};
|
||||
double cant{0.0};
|
||||
bool compound{false};
|
||||
double radius2{0.0};
|
||||
double transition_middle{0.0};
|
||||
double split{0.5};
|
||||
struct arc_part
|
||||
{
|
||||
double radius{0.0};
|
||||
double turn{0.0};
|
||||
double transition{0.0};
|
||||
};
|
||||
std::vector<arc_part> arcs;
|
||||
};
|
||||
static bool find_curve(TTrack &Track, straight_tolerance const &Tolerance, double const Gauge, curve &Curve);
|
||||
// curve made of the given paths, each with the flag of being run from its start
|
||||
@@ -292,6 +310,7 @@ class editor_track
|
||||
static glm::dvec3 point_at(TTrack const &Track, double const T);
|
||||
static std::vector<segment_data> place_switch(switch_template const &Template, glm::dvec3 const &Origin, glm::dvec2 const &Direction, int const Side, double const Grade);
|
||||
static TTrack *create_switch(switch_template const &Template, std::vector<segment_data> const &Paths, TTrack const &Style, std::string const &Name = {});
|
||||
static TTrack *create_turntable(segment_data const &Path, TTrack const *Style, std::string const &Name);
|
||||
static void move_straights(std::vector<straight> const &Lines, std::vector<std::pair<glm::dvec3, glm::dvec3>> const &Ends);
|
||||
static std::vector<TTrack *> relay(chain const &Chain, std::vector<segment_data> const &Pieces);
|
||||
static void retire(TTrack &Track);
|
||||
|
||||
Reference in New Issue
Block a user