]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.h
Create another track iterator class that holds an offset as well
[r2c2.git] / source / libr2c2 / vehicle.h
index 54054bb50e325cb1babf87408fbbf637999a3ca4..5095a2812a9d02c587748d58b49de8292d4fd96b 100644 (file)
@@ -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<Axle> 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<Axle> axles;
        std::vector<Bogie> bogies;
        std::vector<Rod> 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