From 30fbd79ca2dcc62ea4fb3b99e041eb802c82ac94 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 24 Jul 2010 22:06:46 +0100 Subject: [PATCH] Load CurvedTrack as GenTrack --- maps/gen_track/gen_track.xml | 8 ++++++++ src/GenTrack.cpp | 7 +++---- src/Map.cpp | 38 ++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/maps/gen_track/gen_track.xml b/maps/gen_track/gen_track.xml index be8453f..2e269d0 100644 --- a/maps/gen_track/gen_track.xml +++ b/maps/gen_track/gen_track.xml @@ -34,5 +34,13 @@ + + + + + + diff --git a/src/GenTrack.cpp b/src/GenTrack.cpp index d09b0ed..cb9fe43 100644 --- a/src/GenTrack.cpp +++ b/src/GenTrack.cpp @@ -21,7 +21,6 @@ #include "OpenGLHelper.hpp" #include "ILogger.hpp" #include "Matrix.hpp" -#include "SolveCubic.hpp" #include @@ -108,7 +107,7 @@ GenTrack::GenTrack(Vector delta, const float entry_extend = extend_from_center(entry_dir); const float exit_extend = extend_from_center(exit_dir); - + Vector p1 = entry_dir_norm * -entry_extend; Vector p2 = entry_dir_norm * pinch_length; Vector p3 = delta_f - (exit_dir_norm * pinch_length); @@ -132,9 +131,9 @@ float GenTrack::extend_from_center(track::Direction dir) const const float x_sq = static_cast(dir.x * dir.x); const float y_sq = static_cast(dir.z * dir.z); - if (dir.x == dir.z) + if (abs(dir.x) == abs(dir.z)) return sqrtf(2.0f) * 0.5f; - else if (dir.x < dir.z) + else if (abs(dir.x) < abs(dir.z)) return sqrtf(x_sq / y_sq + 1) * 0.5f; else return sqrtf(y_sq / x_sq + 1) * 0.5f; diff --git a/src/Map.cpp b/src/Map.cpp index 9f80069..c1edd32 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -1754,8 +1754,46 @@ void MapLoader::handle_curved_track(const AttributeSet& attrs) attrs.get("finish-angle", finish_angle); attrs.get("radius", radius); +#if 1 + ITrackSegmentPtr track; + const int off = radius - 1; + Vector delta = make_vector(radius - 1, radius - 1, 0); + + switch (start_angle) { + case 0: + track = make_gen_track(make_vector(off, -off, 0), + make_vector(1, 0, 0), + make_vector(0, 0, -1)); + break; + case 90: + track = make_gen_track(make_vector(-off, -off, 0), + make_vector(0, 0, -1), + make_vector(-1, 0, 0)); + break; + case 180: + track = make_gen_track(make_vector(-off, off, 0), + make_vector(-1, 0, 0), + make_vector(0, 0, 1)); + break; + case 270: + track = make_gen_track(make_vector(off, off, 0), + make_vector(0, 0, 1), + make_vector(1, 0, 0)); + break; + + default: + throw runtime_error("Invalid curved-track angle" + + boost::lexical_cast(start_angle)); + } + + my_map->set_track_at(tile, track); + +#else + // Legacy CurvedTrack my_map->set_track_at(tile, make_curved_track(start_angle, finish_angle, radius)); + +#endif } void MapLoader::handle_crossover_track(const AttributeSet& attrs) -- 2.39.2