From ee17596a2c01015475096fdb2078c81bb9c41952 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 24 Jul 2010 13:38:09 +0100 Subject: [PATCH] Change CrossoverTrack to use Point to store origin --- include/Maths.hpp | 14 +++++++++++++- include/OpenGLHelper.hpp | 1 + src/CrossoverTrack.cpp | 38 ++++++++++++++++++++------------------ src/GenTrack.cpp | 5 +++-- src/Map.cpp | 29 ++++++++++++++++++++++++++++- src/SlopeTrack.cpp | 5 ++++- src/StraightTrack.cpp | 7 +++++-- 7 files changed, 74 insertions(+), 25 deletions(-) diff --git a/include/Maths.hpp b/include/Maths.hpp index 29ea33c..82b0817 100644 --- a/include/Maths.hpp +++ b/include/Maths.hpp @@ -1,5 +1,5 @@ // -// Copyright (C) 2009 Nick Gasson +// Copyright (C) 2009-2010 Nick Gasson // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -186,12 +186,24 @@ struct Point { return Point(x + rhs.x, y + rhs.y); } + Point operator-(const Point& rhs) const + { + return Point(x - rhs.x, y - rhs.y); + } + Point& operator+=(const Point& rhs) { x += rhs.x; y += rhs.y; return *this; } + + Point& operator-=(const Point& rhs) + { + x -= rhs.x; + y -= rhs.y; + return *this; + } Point operator-() const { diff --git a/include/OpenGLHelper.hpp b/include/OpenGLHelper.hpp index 73104c5..b1e535c 100644 --- a/include/OpenGLHelper.hpp +++ b/include/OpenGLHelper.hpp @@ -72,6 +72,7 @@ namespace gl { { glNormal3f(v.x, v.y, v.z); } + } #endif diff --git a/src/CrossoverTrack.cpp b/src/CrossoverTrack.cpp index 8663066..f9ff3ce 100644 --- a/src/CrossoverTrack.cpp +++ b/src/CrossoverTrack.cpp @@ -35,7 +35,7 @@ class CrossoverTrack : public ITrackSegment, private StraightTrackHelper, private SleeperHelper { public: - CrossoverTrack() : myX(0), myY(0), height(0.0f) {} + CrossoverTrack() : height(0.0f) {} ~CrossoverTrack() {} void set_origin(int x, int y, float h); @@ -63,7 +63,7 @@ public: private: void transform(const track::TravelToken& a_token, float delta) const; - int myX, myY; + Point origin; float height; }; @@ -72,9 +72,9 @@ void CrossoverTrack::merge(IMeshBufferPtr buf) const // Render the y-going rails and sleepers { Vector off = make_vector( - static_cast(myX), + static_cast(origin.x), height, - static_cast(myY)); + static_cast(origin.y)); merge_straight_rail(buf, off, 0.0f); @@ -89,9 +89,9 @@ void CrossoverTrack::merge(IMeshBufferPtr buf) const // Render the x-going rails and sleepers { Vector off = make_vector( - static_cast(myX), + static_cast(origin.x), height, - static_cast(myY)); + static_cast(origin.y)); merge_straight_rail(buf, off, 90.0f); @@ -106,8 +106,7 @@ void CrossoverTrack::merge(IMeshBufferPtr buf) const void CrossoverTrack::set_origin(int x, int y, float h ) { - myX = x; - myY = y; + origin = make_point(x, y); height = h; } @@ -150,9 +149,9 @@ void CrossoverTrack::transform(const track::TravelToken& a_token, const double x_trans = dir == axis::X ? delta : 0; const double y_trans = dir == axis::Y ? delta : 0; - glTranslated(static_cast(myX) + x_trans, + glTranslated(static_cast(origin.x) + x_trans, height, - static_cast(myY) + y_trans); + static_cast(origin.y) + y_trans); if (dir == axis::Y) glRotated(-90.0, 0.0, 1.0, 0.0); @@ -173,13 +172,13 @@ track::Connection CrossoverTrack::next_position(const track::TravelToken& a_token) const { if (a_token.direction == axis::X) - return make_pair(make_point(myX + 1, myY), axis::X); + return make_pair(origin + make_point(1, 0), axis::X); else if (a_token.direction == -axis::X) - return make_pair(make_point(myX - 1, myY), -axis::X); + return make_pair(origin - make_point(1, 0), -axis::X); else if (a_token.direction == axis::Y) - return make_pair(make_point(myX, myY + 1), axis::Y); + return make_pair(origin + make_point(0, 1), axis::Y); else if (a_token.direction == -axis::Y) - return make_pair(make_point(myX, myY - 1), -axis::Y); + return make_pair(origin - make_point(0, 1), -axis::Y); else throw runtime_error ("Invalid direction on crossover: " + lexical_cast(a_token.direction)); @@ -187,18 +186,21 @@ CrossoverTrack::next_position(const track::TravelToken& a_token) const void CrossoverTrack::get_endpoints(vector >& a_list) const { - a_list.push_back(make_point(myX, myY)); + a_list.push_back(origin); } void CrossoverTrack::get_covers2(vector >& output) const -{ - +{ + output.push_back(origin + make_point(0, 0)); + output.push_back(origin + make_point(0, 1)); + output.push_back(origin + make_point(1, 1)); + output.push_back(origin + make_point(1, 0)); } ITrackSegmentPtr CrossoverTrack::merge_exit(Point where, track::Direction dir) { - if (where == make_point(myX, myY) + if (where == origin && is_valid_direction(dir)) return shared_from_this(); diff --git a/src/GenTrack.cpp b/src/GenTrack.cpp index b02fc4e..e52567e 100644 --- a/src/GenTrack.cpp +++ b/src/GenTrack.cpp @@ -21,6 +21,7 @@ #include "OpenGLHelper.hpp" #include "ILogger.hpp" #include "Matrix.hpp" +#include "SolveCubic.hpp" #include @@ -221,12 +222,12 @@ void GenTrack::get_endpoints(vector >& output) const void GenTrack::get_covers(vector >& output) const { - + } void GenTrack::get_covers2(vector >& output) const { - + float t = solve_cubic( } ITrackSegmentPtr GenTrack::merge_exit(Point where, track::Direction dir) diff --git a/src/Map.cpp b/src/Map.cpp index 4d46e8a..9f80069 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -95,6 +95,7 @@ public: bool is_valid_track(const Point& a_point) const; void render(IGraphicsPtr a_context) const; void highlight_tile(Point point, Colour colour) const; + void highlight_vertex(Point point, Colour colour) const; void reset_map(int a_width, int a_depth); void erase_tile(int x, int y); bool empty_tile(Point tile) const; @@ -419,6 +420,23 @@ void Map::reset_map(int a_width, int a_depth) quad_tree = make_quad_tree(shared_from_this(), my_width, my_depth); } +void Map::highlight_vertex(Point point, Colour colour) const +{ + assert(point.x >= 0 && point.x < my_width + && point.y >= 0 && point.y < my_depth); + + int index = point.x + (point.y * (my_width + 1)); + + gl::colour(colour); + glPointSize(5.0f); + + glBegin(GL_POINTS); + glVertex3f(static_cast(point.x) - 0.5f, + height_map[index].pos.y + 0.01f, + static_cast(point.y) - 0.5f); + glEnd(); +} + void Map::highlight_tile(Point point, Colour colour) const { highlighted_tiles.push_back(make_tuple(point, colour)); @@ -785,7 +803,7 @@ void Map::render_pick_sector(Point bot_left, Point top_right) // Render a small part of the map as directed by the quad tree void Map::render_sector(IGraphicsPtr a_context, int id, - Point bot_left, Point top_right) + Point bot_left, Point top_right) { if (in_pick_mode) { render_pick_sector(bot_left, top_right); @@ -848,6 +866,15 @@ void Map::render_sector(IGraphicsPtr a_context, int id, bind(&Map::highlight_tile, this, placeholders::_1, make_colour(0.4f, 0.7f, 0.1f))); #endif + +#if 1 + // Draw vertices covered by track + vector > vertices; + tile.track->get()->get_covers2(vertices); + for_each(vertices.begin(), vertices.end(), + bind(&Map::highlight_vertex, this, placeholders::_1, + make_colour(1.0f, 0.0f, 0.0f))); +#endif // Draw track highlights tile.track->get()->render(); diff --git a/src/SlopeTrack.cpp b/src/SlopeTrack.cpp index aaa8a3b..17b43e2 100644 --- a/src/SlopeTrack.cpp +++ b/src/SlopeTrack.cpp @@ -264,7 +264,10 @@ void SlopeTrack::get_endpoints(vector >& output) const void SlopeTrack::get_covers2(vector >& output) const { - + output.push_back(origin + make_point(0, 0)); + output.push_back(origin + make_point(0, 1)); + output.push_back(origin + make_point(1, 1)); + output.push_back(origin + make_point(1, 0)); } ITrackSegmentPtr SlopeTrack::merge_exit(Point where, track::Direction dir) diff --git a/src/StraightTrack.cpp b/src/StraightTrack.cpp index db1eb97..66ef30e 100644 --- a/src/StraightTrack.cpp +++ b/src/StraightTrack.cpp @@ -184,9 +184,12 @@ void StraightTrack::get_endpoints(vector >& a_list) const a_list.push_back(origin); } -void StraightTrack::get_covers2(vector >& a_list) const +void StraightTrack::get_covers2(vector >& output) const { - + output.push_back(origin + make_point(0, 0)); + output.push_back(origin + make_point(0, 1)); + output.push_back(origin + make_point(1, 1)); + output.push_back(origin + make_point(1, 0)); } void StraightTrack::ensure_valid_direction(const Direction& a_direction) const -- 2.39.2