summaryrefslogtreecommitdiff
path: root/src/viewport_kdtree.h
diff options
context:
space:
mode:
authorNiels Martin Hansen <nielsm@indvikleren.dk>2019-02-22 17:57:28 +0100
committerNiels Martin Hansen <nielsm@indvikleren.dk>2019-03-09 20:27:11 +0100
commite8d397e4ee71fa9aa952a16fc2f8431dfff57f7c (patch)
tree0a7a80605221db6fc524e4995628bcc024d66aed /src/viewport_kdtree.h
parentd84b67e54d663a62a0a90ddf3fcc7c3f728826af (diff)
downloadopenttd-e8d397e4ee71fa9aa952a16fc2f8431dfff57f7c.tar.xz
Codechange: Make a merged k-d tree index of all viewport signs
Diffstat (limited to 'src/viewport_kdtree.h')
-rw-r--r--src/viewport_kdtree.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/viewport_kdtree.h b/src/viewport_kdtree.h
new file mode 100644
index 000000000..93344a5e6
--- /dev/null
+++ b/src/viewport_kdtree.h
@@ -0,0 +1,83 @@
+/*
+* This file is part of OpenTTD.
+* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/** @file town_kdtree.h Declarations for accessing the k-d tree of towns */
+
+#ifndef VIEWPORT_KDTREE_H
+#define VIEWPORT_KDTREE_H
+
+#include "core/kdtree.hpp"
+#include "viewport_type.h"
+#include "station_base.h"
+#include "town_type.h"
+#include "signs_base.h"
+
+struct ViewportSignKdtreeItem {
+ enum ItemType : uint16 {
+ VKI_STATION,
+ VKI_WAYPOINT,
+ VKI_TOWN,
+ VKI_SIGN,
+ };
+ ItemType type;
+ union {
+ StationID station;
+ TownID town;
+ SignID sign;
+ } id;
+ int32 center;
+ int32 top;
+
+ bool operator== (const ViewportSignKdtreeItem &other) const
+ {
+ if (this->type != other.type) return false;
+ switch (this->type) {
+ case VKI_STATION:
+ case VKI_WAYPOINT:
+ return this->id.station == other.id.station;
+ case VKI_TOWN:
+ return this->id.town == other.id.town;
+ case VKI_SIGN:
+ return this->id.sign == other.id.sign;
+ default:
+ NOT_REACHED();
+ }
+ }
+
+ bool operator< (const ViewportSignKdtreeItem &other) const
+ {
+ if (this->type != other.type) return this->type < other.type;
+ switch (this->type) {
+ case VKI_STATION:
+ case VKI_WAYPOINT:
+ return this->id.station < other.id.station;
+ case VKI_TOWN:
+ return this->id.town < other.id.town;
+ case VKI_SIGN:
+ return this->id.sign < other.id.sign;
+ default:
+ NOT_REACHED();
+ }
+ }
+
+ static ViewportSignKdtreeItem MakeStation(StationID id);
+ static ViewportSignKdtreeItem MakeWaypoint(StationID id);
+ static ViewportSignKdtreeItem MakeTown(TownID id);
+ static ViewportSignKdtreeItem MakeSign(SignID id);
+};
+
+inline int32 Kdtree_ViewportSignXYFunc(const ViewportSignKdtreeItem &item, int dim)
+{
+ return (dim == 0) ? item.center : item.top;
+}
+
+typedef Kdtree<ViewportSignKdtreeItem, decltype(&Kdtree_ViewportSignXYFunc), int32, int32> ViewportSignKdtree;
+extern ViewportSignKdtree _viewport_sign_kdtree;
+
+void RebuildViewportKdtree();
+
+#endif