#define LIBR2C2_VEHICLE_H_
#include "geometry.h"
+#include "object.h"
+#include "trackiter.h"
#include "vehicletype.h"
namespace R2C2 {
class Layout;
-class Track;
-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
struct Axle
{
const VehicleType::Axle *type;
- float angle;
+ Angle angle;
Axle(const VehicleType::Axle &);
};
struct Bogie
{
const VehicleType::Bogie *type;
- float direction;
+ Angle direction;
std::vector<Axle> axles;
Bogie(const VehicleType::Bogie &);
{
const VehicleType::Rod *type;
Vector position;
- float angle;
+ 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;
Vehicle *next;
Vehicle *prev;
TrackPosition track_pos;
- Vector position;
- float direction;
std::vector<Axle> axles;
std::vector<Bogie> bogies;
std::vector<Rod> rods;
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 attach_back(Vehicle &);
void attach_front(Vehicle &);
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 &) { }
+ 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 Vector &get_position() const { return position; }
- float get_direction() const { return direction; }
const Axle &get_fixed_axle(unsigned) const;
const Bogie &get_bogie(unsigned) const;
const Axle &get_bogie_axle(unsigned, unsigned) const;
void adjust_for_distance(TrackPosition &, TrackPosition &, 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;
+
+public:
+ virtual unsigned get_n_link_slots() const;
+ virtual Vehicle *get_link(unsigned) const;
+ virtual int get_link_slot(const Object &) const;
};
} // namespace R2C2