#include "geometry.h"
#include "object.h"
#include "trackoffsetiter.h"
+#include "vehicleplacement.h"
#include "vehicletype.h"
namespace R2C2 {
class Vehicle: public Object
{
public:
- enum PlaceMode
- {
- CENTER,
- FRONT_AXLE,
- FRONT_BUFFER,
- BACK_AXLE,
- BACK_BUFFER
- };
-
struct Axle
{
const VehicleType::Axle *type;
{
const VehicleType::Bogie *type;
Angle direction;
- std::vector<Axle> axles;
+ std::vector<Axle *> axles;
Bogie(const VehicleType::Bogie &);
};
Train *train;
Vehicle *next;
Vehicle *prev;
- TrackOffsetIter track;
+ VehiclePlacement placement;
std::vector<Axle> axles;
+ std::vector<Axle *> fixed_axles;
std::vector<Bogie> bogies;
std::vector<Rod> rods;
unsigned front_sensor;
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 place(const TrackOffsetIter &, VehiclePlacement::Anchor = VehiclePlacement::CENTER);
void unplace();
void advance(float);
- 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 VehiclePlacement &get_placement() const { return placement; }
+ bool is_placed() const { return placement.is_placed(); }
+ const Axle &get_axle(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(int);
void update_position_from(const Vehicle &);
void propagate_position();
void propagate_forward();
void propagate_backward();
- void check_sensor(float, unsigned &);
+ void check_sensor(const TrackOffsetIter &, unsigned &, bool);
void turn_axles(float);
void update_rods();
-
- void adjust_for_distance(TrackOffsetIter &, TrackOffsetIter &, float, float = 0.5) const;
- OrientedPoint get_point(const Vector &, const Vector &, float = 0.5) const;
- OrientedPoint get_point(const TrackOffsetIter &, float, float = 0.5) const;
+ float resolve_rod_constraint(Rod &, const VehicleType::RodConstraint &);
public:
virtual unsigned get_n_link_slots() const;
virtual Vehicle *get_link(unsigned) const;
virtual int get_link_slot(const Object &) const;
+
+ virtual bool collide_ray(const Ray &) const;
};
} // namespace R2C2