-/* $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
{
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
{
TrackPoint get_point() const;
};
- struct Rod
- {
- Point position;
- float angle;
-
- Rod();
- };
-
Layout &layout;
const VehicleType &type;
Vehicle *next;
Vehicle *prev;
TrackPosition track_pos;
- Point position;
+ Vector position;
float direction;
- std::vector<float> bogie_dirs;
- std::vector<std::vector<float> > axle_angles;
+ std::vector<Axle> axles;
+ std::vector<Bogie> bogies;
std::vector<Rod> rods;
unsigned front_sensor;
unsigned back_sensor;
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_axle_angle(unsigned) const;
- float get_bogie_direction(unsigned) const;
- float get_bogie_axle_angle(unsigned, unsigned) const;
- const Point &get_rod_position(unsigned) const;
- float get_rod_angle(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 &);
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;
};