summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoralberth <alberth@openttd.org>2010-02-06 13:14:40 +0000
committeralberth <alberth@openttd.org>2010-02-06 13:14:40 +0000
commit21589daea9d55878d029b641374caff10561fff3 (patch)
treec2a224b0c02116ad990b8256b84a001f3c6ca068 /src
parentdb6e077c8af7ffa2e224628811ff1e1af23cd049 (diff)
downloadopenttd-21589daea9d55878d029b641374caff10561fff3.tar.xz
(svn r19040) -Codechange: Introduce inverse function of RemapCoords.
Diffstat (limited to 'src')
-rw-r--r--src/landscape.h14
-rw-r--r--src/smallmap_gui.cpp46
2 files changed, 33 insertions, 27 deletions
diff --git a/src/landscape.h b/src/landscape.h
index d439f9171..d505d6834 100644
--- a/src/landscape.h
+++ b/src/landscape.h
@@ -70,6 +70,20 @@ static inline Point RemapCoords2(int x, int y)
return RemapCoords(x, y, GetSlopeZ(x, y));
}
+/**
+ * Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
+ * Function assumes <tt>z == 0</tt>. For other values of \p z, add \p z to \a y before the call.
+ * @param x X coordinate of the 2D coordinate.
+ * @param y Y coordinate of the 2D coordinate.
+ * @return X and Y components of equivalent world or tile coordinate.
+ * @note Inverse of #RemapCoords function. Smaller values may get rounded.
+ */
+static inline Point InverseRemapCoords(int x, int y)
+{
+ Point pt = {(y * 2 - x) >> 2, (y * 2 + x) >> 2};
+ return pt;
+}
+
uint ApplyFoundationToSlope(Foundation f, Slope *s);
void DrawFoundation(TileInfo *ti, Foundation f);
bool HasFoundationNW(TileIndex tile, Slope slope_here, uint z_here);
diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp
index cb2acda6c..259169073 100644
--- a/src/smallmap_gui.cpp
+++ b/src/smallmap_gui.cpp
@@ -699,15 +699,12 @@ class SmallMapWindow : public Window {
/* Find main viewport. */
const ViewPort *vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
- int tx = ((vp->virtual_top << 1) - vp->virtual_left) >> 6;
- int ty = ((vp->virtual_top << 1) + vp->virtual_left) >> 6;
- Point tl = this->RemapTile(tx, ty);
-
- tx = (((vp->virtual_top + vp->virtual_height) << 1) - (vp->virtual_left + vp->virtual_width)) >> 6;
- ty = (((vp->virtual_top + vp->virtual_height) << 1) + (vp->virtual_left + vp->virtual_width)) >> 6;
- Point br = this->RemapTile(tx, ty);
-
+ Point tile = InverseRemapCoords(vp->virtual_left, vp->virtual_top);
+ Point tl = this->RemapTile(tile.x >> 4, tile.y >> 4);
tl.x -= this->subscroll;
+
+ tile = InverseRemapCoords(vp->virtual_left + vp->virtual_width, vp->virtual_top + vp->virtual_height);
+ Point br = this->RemapTile(tile.x >> 4, tile.y >> 4);
br.x -= this->subscroll;
SmallMapWindow::DrawVertMapIndicator(tl.x, tl.y, br.y);
@@ -1110,24 +1107,24 @@ public:
void SetNewScroll(int sx, int sy, int sub)
{
const NWidgetBase *wi = this->GetWidget<NWidgetBase>(SM_WIDGET_MAP);
- int hx = wi->current_x / 2;
- int hy = wi->current_y / 2;
- int hvx = (hx * -4 + hy * 8) * this->zoom;
- int hvy = (hx * 4 + hy * 8) * this->zoom;
- if (sx < -hvx) {
- sx = -hvx;
+ Point hv = InverseRemapCoords(wi->current_x * TILE_SIZE / 2, wi->current_y * TILE_SIZE / 2);
+ hv.x *= this->zoom;
+ hv.y *= this->zoom;
+
+ if (sx < -hv.x) {
+ sx = -hv.x;
sub = 0;
}
- if (sx > (int)MapMaxX() * TILE_SIZE - hvx) {
- sx = MapMaxX() * TILE_SIZE - hvx;
+ if (sx > (int)MapMaxX() * TILE_SIZE - hv.x) {
+ sx = MapMaxX() * TILE_SIZE - hv.x;
sub = 0;
}
- if (sy < -hvy) {
- sy = -hvy;
+ if (sy < -hv.y) {
+ sy = -hv.y;
sub = 0;
}
- if (sy > (int)MapMaxY() * TILE_SIZE - hvy) {
- sy = MapMaxY() * TILE_SIZE - hvy;
+ if (sy > (int)MapMaxY() * TILE_SIZE - hv.y) {
+ sy = MapMaxY() * TILE_SIZE - hv.y;
sub = 0;
}
@@ -1151,18 +1148,13 @@ public:
void SmallMapCenterOnCurrentPos()
{
const ViewPort *vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
-
- int x = vp->virtual_left + vp->virtual_width / 2;
- int y = vp->virtual_top + vp->virtual_height / 2;
-
- int tx = (y * 2 - x) >> 2;
- int ty = (y * 2 + x) >> 2;
+ Point pt = InverseRemapCoords(vp->virtual_left + vp->virtual_width / 2, vp->virtual_top + vp->virtual_height / 2);
int sub;
const NWidgetBase *wid = this->GetWidget<NWidgetBase>(SM_WIDGET_MAP);
Point tile = this->PixelToTile(wid->current_x / 2, wid->current_y / 2, &sub);
- this->SetNewScroll(tx - tile.x * TILE_SIZE, ty - tile.y * TILE_SIZE, sub);
+ this->SetNewScroll(pt.x - tile.x * TILE_SIZE, pt.y - tile.y * TILE_SIZE, sub);
this->SetDirty();
}
};