X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fsignal.cpp;h=0139b1fbdaa9cf73ff6a3b25cdaff0b7f63eb984;hb=1c072afdb1866ba397ee8e6155f5f68c6c7ab4da;hp=72cf235193e6a9c537e67a003ede7a221b8c7673;hpb=2910db1364914c0ab98a0f80250cc39137821577;p=r2c2.git diff --git a/source/libr2c2/signal.cpp b/source/libr2c2/signal.cpp index 72cf235..0139b1f 100644 --- a/source/libr2c2/signal.cpp +++ b/source/libr2c2/signal.cpp @@ -1,4 +1,5 @@ #include "blockiter.h" +#include "catalogue.h" #include "driver.h" #include "layout.h" #include "signal.h" @@ -50,75 +51,82 @@ void Signal::set_address(unsigned a) } void Signal::set_position(const Vector &p) +{ + position = p; + + update_location(); +} + +void Signal::update_location() { const set &tracks = layout.get_tracks(); + float limit = layout.get_catalogue().get_gauge()*2; float dist = -1; for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) if(!(*i)->get_type().is_turnout()) { - TrackPoint n = (*i)->get_nearest_point(p); - float d = distance(p, n.pos); + Snap sn; + sn.position = position; + sn.rotation = rotation; + (*i)->snap(sn, limit, SNAP_SEGMENT); + float d = distance(position, sn.position); if(dget_block(); + if(!track) + return; unsigned n_endpoints = track->get_type().get_endpoints().size(); for(unsigned j=0; jget_endpoint_direction(j)-rotation; - while(a<-M_PI/2) - a += M_PI*2; - while(a>M_PI*3/2) - a -= M_PI*2; - if(a>=M_PI/2) + Angle a = wrap_with_base(track->get_snap_node(j).rotation-rotation, -Angle::quarter_turn()); + if(a>=Angle::quarter_turn()) { BlockIter biter = TrackIter(track, j).block_iter(); - entry = biter.entry(); + if(biter) + { + block = &track->get_block(); + entry = biter.entry(); + } } } } -void Signal::set_rotation(float r) +void Signal::set_rotation(const Angle &r) { - float a = rotation-r; - while(a>M_PI*3/2) - a -= M_PI*2; - while(a<-M_PI/2) - a += M_PI*2; - if(a>=M_PI/2) - { - rotation += M_PI; - if(rotation>M_PI*2) - rotation -= M_PI*2; - } + rotation = r; - normalize_location(); + update_location(); } -bool Signal::collide_ray(const Vector &start, const Vector &ray) const +unsigned Signal::get_n_snap_nodes() const { - // XXX Totally hardcoded stuff, should be replaced with a geometry system - Vector center = position; - center.x += sin(rotation)*0.035; - center.y -= cos(rotation)*0.035; - Vector d(center.x-start.x, center.y-start.y); - float x = (d.x*ray.x+d.y*ray.y)/(ray.x*ray.x+ray.y*ray.y); - Vector nearest(start.x+ray.x*x-center.x, start.y+ray.y*x-center.y, start.z+ray.z*x-center.z); - if(nearest.z<0|| nearest.z>0.12) - return false; - return nearest.x*nearest.x+nearest.y*nearest.y<0.0001; + return 1; +} + +Snap Signal::get_snap_node(unsigned i) const +{ + if(i>=1) + throw out_of_range("Signal::get_snap_node"); + + Snap sn; + sn.position = position; + sn.rotation = rotation; + return sn; +} + +SnapType Signal::get_default_snap_type_to(const Object &other) const +{ + if(dynamic_cast(&other)) + return SNAP_SEGMENT; + + return NO_SNAP; } void Signal::tick(const Time::TimeDelta &) @@ -198,7 +206,7 @@ void Signal::reset() void Signal::save(list &st) const { st.push_back((DataFile::Statement("position"), position.x, position.y, position.z)); - st.push_back((DataFile::Statement("rotation"), rotation)); + st.push_back((DataFile::Statement("rotation"), rotation.radians())); if(address) st.push_back((DataFile::Statement("address"), address)); } @@ -224,7 +232,7 @@ void Signal::Loader::position(float x, float y, float z) void Signal::Loader::rotation(float d) { - obj.set_rotation(d); + obj.set_rotation(Angle::from_radians(d)); } } // namespace R2C2