]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/vehicle.h
BasicLoader is now called ObjectLoader
[r2c2.git] / source / libr2c2 / vehicle.h
index ec33edea0db503763c005ed717b3523186703fd5..8990a5b538d68c0f144b2404db636229ec6f9f00 100644 (file)
@@ -1,20 +1,21 @@
-/* $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 "vehicletype.h"
 
 namespace R2C2 {
 
 class Layout;
 class Track;
-class VehicleType;
+
+class attachment_error: public std::logic_error
+{
+public:
+       attachment_error(const std::string &w): std::logic_error(w) { }
+       virtual ~attachment_error() throw() { }
+};
+
 
 class Vehicle
 {
@@ -28,6 +29,32 @@ public:
                BACK_BUFFER
        };
 
+       struct Axle
+       {
+               const VehicleType::Axle *type;
+               float angle;
+
+               Axle(const VehicleType::Axle &);
+       };
+
+       struct Bogie
+       {
+               const VehicleType::Bogie *type;
+               float direction;
+               std::vector<Axle> axles;
+
+               Bogie(const VehicleType::Bogie &);
+       };
+
+       struct Rod
+       {
+               const VehicleType::Rod *type;
+               Vector position;
+               float angle;
+
+               Rod(const VehicleType::Rod &);
+       };
+
 private:
        struct TrackPosition
        {
@@ -46,9 +73,11 @@ private:
        Vehicle *next;
        Vehicle *prev;
        TrackPosition track_pos;
-       Point position;
+       Vector 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;
 
@@ -71,9 +100,12 @@ public:
        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 Point &get_position() const { return position; }
+       const Vector &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,9 +113,11 @@ 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;
 };