]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.h
Introduce a tilt (vertical angle) property to Object
[r2c2.git] / source / libr2c2 / vehicle.h
index ec33edea0db503763c005ed717b3523186703fd5..94ae2b1683e648cc8f07cb9edfc1ff56d107ecdf 100644 (file)
@@ -1,22 +1,25 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #ifndef LIBR2C2_VEHICLE_H_
 #define LIBR2C2_VEHICLE_H_
 
 #include "geometry.h"
+#include "object.h"
+#include "trackiter.h"
+#include "vehicletype.h"
 
 namespace R2C2 {
 
 class Layout;
-class Track;
-class VehicleType;
+class Train;
 
-class Vehicle
+class attachment_error: public std::logic_error
+{
+public:
+       attachment_error(const std::string &w): std::logic_error(w) { }
+       virtual ~attachment_error() throw() { }
+};
+
+
+class Vehicle: public Object
 {
 public:
        enum PlaceMode
@@ -28,27 +31,52 @@ public:
                BACK_BUFFER
        };
 
+       struct Axle
+       {
+               const VehicleType::Axle *type;
+               Angle angle;
+
+               Axle(const VehicleType::Axle &);
+       };
+
+       struct Bogie
+       {
+               const VehicleType::Bogie *type;
+               Angle direction;
+               std::vector<Axle> axles;
+
+               Bogie(const VehicleType::Bogie &);
+       };
+
+       struct Rod
+       {
+               const VehicleType::Rod *type;
+               Vector position;
+               Angle angle;
+
+               Rod(const VehicleType::Rod &);
+       };
+
 private:
        struct TrackPosition
        {
-               Track *track;
-               unsigned ep;
+               TrackIter track;
                float offs;
 
                TrackPosition();
-               TrackPosition(Track *, unsigned, float);
+               TrackPosition(const TrackIter &, float);
                void advance(float);
                TrackPoint get_point() const;
        };
 
-       Layout &layout;
        const VehicleType &type;
+       Train *train;
        Vehicle *next;
        Vehicle *prev;
        TrackPosition track_pos;
-       Point position;
-       float direction;
-       std::vector<float> bogie_dirs;
+       std::vector<Axle> axles;
+       std::vector<Bogie> bogies;
+       std::vector<Rod> rods;
        unsigned front_sensor;
        unsigned back_sensor;
 
@@ -56,8 +84,11 @@ public:
        Vehicle(Layout &, const VehicleType &);
        ~Vehicle();
 
-       const VehicleType &get_type() const { return type; }
+       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();
@@ -65,15 +96,21 @@ public:
        Vehicle *get_next() const { return next; }
        Vehicle *get_previous() const { return prev; }
 
-       void place(Track &, unsigned, float, PlaceMode = CENTER);
+       // TODO implement these - should call place() with suitable parameters
+       virtual void set_position(const Vector &) { }
+       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; }
+       const TrackIter &get_track_iter() const { return track_pos.track; }
+       Track *get_track() const { return track_pos.track.track(); }
+       unsigned get_entry() const { return track_pos.track.entry(); }
        float get_offset() const { return track_pos.offs; }
-       const Point &get_position() const { return position; }
-       float get_direction() const { return direction; }
-       float get_bogie_direction(unsigned) const;
+       const Axle &get_fixed_axle(unsigned) const;
+       const Bogie &get_bogie(unsigned) const;
+       const Axle &get_bogie_axle(unsigned, unsigned) const;
+       const Rod &get_rod(unsigned) const;
 private:
        void update_position();
        void update_position_from(const Vehicle &);
@@ -81,10 +118,17 @@ private:
        void propagate_forward();
        void propagate_backward();
        void check_sensor(float, unsigned &);
+       void turn_axles(float);
+       void update_rods();
 
        void adjust_for_distance(TrackPosition &, TrackPosition &, float, float = 0.5) const;
-       TrackPoint get_point(const Point &, const Point &, 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;
+
+public:
+       virtual unsigned get_n_link_slots() const;
+       virtual Vehicle *get_link(unsigned) const;
+       virtual int get_link_slot(const Object &) const;
 };
 
 } // namespace R2C2