diff --git a/world/RailCrossings.cpp b/world/RailCrossings.cpp index 001a5b60..412a1ddc 100644 --- a/world/RailCrossings.cpp +++ b/world/RailCrossings.cpp @@ -710,6 +710,9 @@ track_rails::switch_blade const &TTrack::blade( int const Path ) const { glm::dvec3 point, tangent; ours.at( 0.0, point, tangent ); auto otherat { nearest_distance( theirs, point ) }; + glm::dvec3 start, along; + theirs.at( otherat, start, along ); + auto const tangential { std::abs( glm::cross( glm::normalize( glm::dvec3 { tangent.x, 0.0, tangent.z } ), glm::normalize( glm::dvec3 { along.x, 0.0, along.z } ) ).y ) < blade_tangent }; for( int i = 0; i <= count; ++i ) { auto const distance { length * i / count }; ours.at( distance, point, tangent ); @@ -734,6 +737,9 @@ track_rails::switch_blade const &TTrack::blade( int const Path ) const { } return -1.0; }; result.tip = reach( blade_point ); + if( auto const nose { reach( blade_nose ) }; tangential && nose >= 0.0 ) { + result.tip = std::max( result.tip, nose - blade_planed ); + } result.full = reach( size.head + blade_gap ); auto const clear { reach( size.head + blade_clearance ) }; auto const foot { reach( size.high + blade_gap ) }; diff --git a/world/RailLayout.h b/world/RailLayout.h index 5597cdea..0cc4f740 100644 --- a/world/RailLayout.h +++ b/world/RailLayout.h @@ -38,6 +38,9 @@ double constexpr check_flangeway { 0.041 }; double constexpr blade_throw { 0.160 }; double constexpr blade_clearance { 0.058 }; double constexpr blade_point { 0.003 }; +double constexpr blade_nose { 0.005 }; +double constexpr blade_planed { 0.125 }; +double constexpr blade_tangent { 0.00175 }; double constexpr blade_gap { 0.0005 }; double constexpr blade_lowered { 0.050 }; double constexpr blade_spacing { 0.5 };