summaryrefslogtreecommitdiff
path: root/src/viewport_type.h
diff options
context:
space:
mode:
authorNiels Martin Hansen <nielsm@indvikleren.dk>2019-12-01 23:17:33 +0100
committerGitHub <noreply@github.com>2019-12-01 23:17:33 +0100
commit9900af38f58c84a90bd1a3830b9acd08438c46c5 (patch)
treede630b1f7e806d1b4c1639031111151292863951 /src/viewport_type.h
parentf91c701ffebe098f05b237642dd37002181f1a7f (diff)
downloadopenttd-9900af38f58c84a90bd1a3830b9acd08438c46c5.tar.xz
Fix #7847: Use ViewportSign coordinates for sign Kdtree coordinates (#7849)
Ensure the same coordinates are used for station/town/player signs regardless of how the landscape changes below it after the coordinates were first determined. By keeping track of whether each ViewportSign is valid for Kdtree use (and only ever registering the viewport sign when the object is valid) a lot of code can be simplified and become more robust at the same time.
Diffstat (limited to 'src/viewport_type.h')
-rw-r--r--src/viewport_type.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/viewport_type.h b/src/viewport_type.h
index 2d986493e..f6a9ce4ae 100644
--- a/src/viewport_type.h
+++ b/src/viewport_type.h
@@ -53,6 +53,26 @@ struct ViewportSign {
void MarkDirty(ZoomLevel maxzoom = ZOOM_LVL_MAX) const;
};
+/** Specialised ViewportSign that tracks whether it is valid for entering into a Kdtree */
+struct TrackedViewportSign : ViewportSign {
+ bool kdtree_valid; ///< Are the sign data valid for use with the _viewport_sign_kdtree?
+
+ /**
+ * Update the position of the viewport sign.
+ * Note that this function hides the base class function.
+ */
+ void UpdatePosition(int center, int top, StringID str, StringID str_small = STR_NULL)
+ {
+ this->kdtree_valid = true;
+ this->ViewportSign::UpdatePosition(center, top, str, str_small);
+ }
+
+
+ TrackedViewportSign() : kdtree_valid{ false }
+ {
+ }
+};
+
/**
* Directions of zooming.
* @see DoZoomInOutWindow