X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicle.h;h=b522b429125f1fecc3a65d92526c4f643a7da847;hb=abed4a255060d5a233ec0ac2dd60af9132e29201;hp=2e91962842f2d319153ea4e8a2592f9f7af2275b;hpb=37af7970d9cefcf40ae58ca06ca8469f56b0cc13;p=r2c2.git diff --git a/source/libr2c2/vehicle.h b/source/libr2c2/vehicle.h index 2e91962..b522b42 100644 --- a/source/libr2c2/vehicle.h +++ b/source/libr2c2/vehicle.h @@ -1,63 +1,63 @@ -/* $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 "trackoffsetiter.h" +#include "vehicleplacement.h" +#include "vehicletype.h" namespace R2C2 { class Layout; -class Track; -class VehicleType; +class Train; + +class attachment_error: public std::logic_error +{ +public: + attachment_error(const std::string &w): std::logic_error(w) { } + virtual ~attachment_error() throw() { } +}; + -class Vehicle +class Vehicle: public Object { public: - enum PlaceMode + struct Axle { - CENTER, - FRONT_AXLE, - FRONT_BUFFER, - BACK_AXLE, - BACK_BUFFER + const VehicleType::Axle *type; + Angle angle; + + Axle(const VehicleType::Axle &); }; -private: - struct TrackPosition + struct Bogie { - Track *track; - unsigned ep; - float offs; - - TrackPosition(); - TrackPosition(Track *, unsigned, float); - void advance(float); - TrackPoint get_point() const; + const VehicleType::Bogie *type; + Angle direction; + std::vector axles; + + Bogie(const VehicleType::Bogie &); }; struct Rod { - Point position; - float angle; + const VehicleType::Rod *type; + Vector position; + Angle angle; - Rod(); + Rod(const VehicleType::Rod &); }; - Layout &layout; +private: const VehicleType &type; + Train *train; Vehicle *next; Vehicle *prev; - TrackPosition track_pos; - Point position; - float direction; - std::vector bogie_dirs; - std::vector > axle_angles; + VehiclePlacement placement; + std::vector axles; + std::vector fixed_axles; + std::vector bogies; std::vector rods; unsigned front_sensor; unsigned back_sensor; @@ -66,8 +66,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(); @@ -75,32 +78,37 @@ 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 TrackOffsetIter &, VehiclePlacement::Anchor = VehiclePlacement::CENTER); void unplace(); void advance(float); - 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; } - 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 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(); + 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; - 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 TrackPosition &, float, float = 0.5) const; + virtual bool collide_ray(const Ray &, float * = 0) const; }; } // namespace R2C2