mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 06:19:19 +02:00
refactor(editor): track observer instead of the function hooks
This commit is contained in:
@@ -122,15 +122,12 @@ bool adjoining_direction(TTrack const *Neighbour, glm::dvec3 const &Joint, bool
|
||||
|
||||
}
|
||||
|
||||
std::function<void(TTrack const &)> editor_track::on_capture;
|
||||
std::function<void(std::vector<TTrack *> const &)> editor_track::on_commit;
|
||||
std::function<void(TTrack &)> editor_track::on_retire;
|
||||
std::function<void(TTrack &, TTrack &, segment_data const &)> editor_track::on_split;
|
||||
editor_track::observer *editor_track::s_observer{nullptr};
|
||||
|
||||
editor_track::state editor_track::capture(TTrack const &Track)
|
||||
{
|
||||
if (on_capture)
|
||||
on_capture(Track);
|
||||
if (s_observer != nullptr)
|
||||
s_observer->track_captured(Track);
|
||||
state result;
|
||||
result.paths = Track.m_paths;
|
||||
result.velocity = Track.fVelocity;
|
||||
@@ -240,8 +237,8 @@ void editor_track::commit(std::vector<TTrack *> const &Tracks)
|
||||
for (auto *track : affected)
|
||||
for (auto *vehicle : track->Dynamics)
|
||||
vehicle->Move(0.000001);
|
||||
if (on_commit)
|
||||
on_commit(Tracks);
|
||||
if (s_observer != nullptr)
|
||||
s_observer->tracks_committed(Tracks);
|
||||
}
|
||||
|
||||
void editor_track::commit_parameters(TTrack &Track)
|
||||
@@ -2219,8 +2216,8 @@ TTrack *editor_track::split_path(TTrack &Track, double const T)
|
||||
second.rolls[0] = roll;
|
||||
auto *created{create_path(Track, second)};
|
||||
Track.m_paths.front() = first;
|
||||
if (on_split)
|
||||
on_split(Track, *created, first);
|
||||
if (s_observer != nullptr)
|
||||
s_observer->track_split(Track, *created, first);
|
||||
commit({&Track, created});
|
||||
return created;
|
||||
}
|
||||
@@ -2257,8 +2254,8 @@ void editor_track::retire(TTrack &Track)
|
||||
update_transition(*neighbour);
|
||||
rebuild_geometry(*neighbour);
|
||||
}
|
||||
if (on_retire)
|
||||
on_retire(Track);
|
||||
if (s_observer != nullptr)
|
||||
s_observer->track_retired(Track);
|
||||
}
|
||||
|
||||
void editor_track::rebuild_geometry(TTrack &Track)
|
||||
|
||||
@@ -232,14 +232,21 @@ class editor_track
|
||||
static void velocity(TTrack &Track, double const Velocity);
|
||||
static void damage(TTrack &Track, int const Damage);
|
||||
|
||||
// let the objects which belong to the paths follow their changes
|
||||
static std::function<void(TTrack const &)> on_capture;
|
||||
static std::function<void(std::vector<TTrack *> const &)> on_commit;
|
||||
static std::function<void(TTrack &)> on_retire;
|
||||
// called before the commit; the first argument keeps the beginning of the path, given in the last one
|
||||
static std::function<void(TTrack &, TTrack &, segment_data const &)> on_split;
|
||||
// told about the changes of the paths, to let the objects which belong to them follow
|
||||
class observer
|
||||
{
|
||||
public:
|
||||
virtual ~observer() = default;
|
||||
virtual void track_captured(TTrack const &Track) = 0;
|
||||
virtual void tracks_committed(std::vector<TTrack *> const &Tracks) = 0;
|
||||
virtual void track_retired(TTrack &Track) = 0;
|
||||
// called before the commit; Original keeps the beginning of the path, given in First
|
||||
virtual void track_split(TTrack &Original, TTrack &Created, segment_data const &First) = 0;
|
||||
};
|
||||
static void observe(observer *Observer) { s_observer = Observer; }
|
||||
|
||||
private:
|
||||
static observer *s_observer;
|
||||
static void disconnect(TTrack &Track);
|
||||
static void join(TTrack &Track);
|
||||
static void connect(TTrack &Track, bool const Prevside, TTrack *Other, int const Endpointid);
|
||||
|
||||
Reference in New Issue
Block a user