X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fvehicle.h;h=b522b429125f1fecc3a65d92526c4f643a7da847;hb=abed4a255060d5a233ec0ac2dd60af9132e29201;hp=94ae2b1683e648cc8f07cb9edfc1ff56d107ecdf;hpb=107a7f787d406f1f664c4986557f9a896e0845ea;p=r2c2.git diff --git a/source/libr2c2/vehicle.h b/source/libr2c2/vehicle.h index 94ae2b1..b522b42 100644 --- a/source/libr2c2/vehicle.h +++ b/source/libr2c2/vehicle.h @@ -3,7 +3,8 @@ #include "geometry.h" #include "object.h" -#include "trackiter.h" +#include "trackoffsetiter.h" +#include "vehicleplacement.h" #include "vehicletype.h" namespace R2C2 { @@ -22,15 +23,6 @@ public: class Vehicle: public Object { public: - enum PlaceMode - { - CENTER, - FRONT_AXLE, - FRONT_BUFFER, - BACK_AXLE, - BACK_BUFFER - }; - struct Axle { const VehicleType::Axle *type; @@ -43,7 +35,7 @@ public: { const VehicleType::Bogie *type; Angle direction; - std::vector axles; + std::vector axles; Bogie(const VehicleType::Bogie &); }; @@ -58,23 +50,13 @@ public: }; private: - struct TrackPosition - { - TrackIter track; - float offs; - - TrackPosition(); - TrackPosition(const TrackIter &, float); - void advance(float); - TrackPoint get_point() const; - }; - const VehicleType &type; Train *train; Vehicle *next; Vehicle *prev; - TrackPosition track_pos; + VehiclePlacement placement; std::vector axles; + std::vector fixed_axles; std::vector bogies; std::vector rods; unsigned front_sensor; @@ -100,35 +82,33 @@ public: 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 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 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(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; + 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 &, float * = 0) const; }; } // namespace R2C2