X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Flibr2c2%2Fvehicle.h;h=5095a2812a9d02c587748d58b49de8292d4fd96b;hb=0443ca05cbd306487131f5f5bd3b91181ae4a733;hp=54054bb50e325cb1babf87408fbbf637999a3ca4;hpb=2910db1364914c0ab98a0f80250cc39137821577;p=r2c2.git diff --git a/source/libr2c2/vehicle.h b/source/libr2c2/vehicle.h index 54054bb..5095a28 100644 --- a/source/libr2c2/vehicle.h +++ b/source/libr2c2/vehicle.h @@ -3,12 +3,13 @@ #include "geometry.h" #include "object.h" +#include "trackoffsetiter.h" #include "vehicletype.h" namespace R2C2 { class Layout; -class Track; +class Train; class attachment_error: public std::logic_error { @@ -33,7 +34,7 @@ public: struct Axle { const VehicleType::Axle *type; - float angle; + Angle angle; Axle(const VehicleType::Axle &); }; @@ -41,7 +42,7 @@ public: struct Bogie { const VehicleType::Bogie *type; - float direction; + Angle direction; std::vector axles; Bogie(const VehicleType::Bogie &); @@ -51,28 +52,17 @@ public: { const VehicleType::Rod *type; Vector position; - float angle; + Angle angle; Rod(const VehicleType::Rod &); }; private: - struct TrackPosition - { - Track *track; - unsigned ep; - float offs; - - TrackPosition(); - TrackPosition(Track *, unsigned, float); - void advance(float); - TrackPoint get_point() const; - }; - const VehicleType &type; + Train *train; Vehicle *next; Vehicle *prev; - TrackPosition track_pos; + TrackOffsetIter track; std::vector axles; std::vector bogies; std::vector rods; @@ -86,6 +76,8 @@ public: virtual Vehicle *clone(Layout * = 0) const; virtual const VehicleType &get_type() const { return type; } + void set_train(Train *); + Train *get_train() const { return train; } void attach_back(Vehicle &); void attach_front(Vehicle &); void detach_back(); @@ -95,13 +87,15 @@ public: // TODO implement these - should call place() with suitable parameters virtual void set_position(const Vector &) { } - virtual void set_rotation(float) { } - void place(Track &, unsigned, float, PlaceMode = CENTER); + virtual void set_rotation(const Angle &) { } + virtual void set_tilt(const Angle &) { } + void place(const TrackIter &, float, PlaceMode = CENTER); void unplace(); void advance(float); - Track *get_track() const { return track_pos.track; } - unsigned get_entry() const { return track_pos.ep; } - float get_offset() const { return track_pos.offs; } + const TrackOffsetIter &get_track_iter() const { return track; } + Track *get_track() const { return track.track(); } + unsigned get_entry() const { return track.entry(); } + float get_offset() const { return track.offset(); } const Axle &get_fixed_axle(unsigned) const; const Bogie &get_bogie(unsigned) const; const Axle &get_bogie_axle(unsigned, unsigned) const; @@ -116,12 +110,14 @@ private: void turn_axles(float); void update_rods(); - void adjust_for_distance(TrackPosition &, TrackPosition &, float, float = 0.5) const; + void adjust_for_distance(TrackOffsetIter &, TrackOffsetIter &, float, float = 0.5) const; TrackPoint get_point(const Vector &, const Vector &, float = 0.5) const; - TrackPoint get_point(const TrackPosition &, float, float = 0.5) const; + TrackPoint get_point(const TrackOffsetIter &, float, float = 0.5) const; public: - virtual bool collide_ray(const Vector &, const Vector &) const { return false; } + virtual unsigned get_n_link_slots() const; + virtual Vehicle *get_link(unsigned) const; + virtual int get_link_slot(const Object &) const; }; } // namespace R2C2