mirror of https://github.com/OpenTTD/OpenTTD
(svn r10334) -Fix [FS#937]: with smooth scrolling enabled, the viewport destination was not clamped to the map
parent
36945fd628
commit
217765fc0b
|
@ -1361,6 +1361,30 @@ void DrawWindowViewport(const Window *w)
|
||||||
dpi->top -= w->top;
|
dpi->top -= w->top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ClampViewportToMap(const ViewPort *vp, int &x, int &y)
|
||||||
|
{
|
||||||
|
/* Centre of the viewport is hot spot */
|
||||||
|
x += vp->virtual_width / 2;
|
||||||
|
y += vp->virtual_height / 2;
|
||||||
|
|
||||||
|
/* Convert viewport coordinates to map coordinates
|
||||||
|
* Calculation is scaled by 4 to avoid rounding errors */
|
||||||
|
int vx = -x + y * 2;
|
||||||
|
int vy = x + y * 2;
|
||||||
|
|
||||||
|
/* clamp to size of map */
|
||||||
|
vx = clamp(vx, 0, MapMaxX() * TILE_SIZE * 4);
|
||||||
|
vy = clamp(vy, 0, MapMaxY() * TILE_SIZE * 4);
|
||||||
|
|
||||||
|
/* Convert map coordinates to viewport coordinates */
|
||||||
|
x = (-vx + vy) / 2;
|
||||||
|
y = ( vx + vy) / 4;
|
||||||
|
|
||||||
|
/* Remove centreing */
|
||||||
|
x -= vp->virtual_width / 2;
|
||||||
|
y -= vp->virtual_height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
void UpdateViewportPosition(Window *w)
|
void UpdateViewportPosition(Window *w)
|
||||||
{
|
{
|
||||||
const ViewPort *vp = w->viewport;
|
const ViewPort *vp = w->viewport;
|
||||||
|
@ -1371,47 +1395,25 @@ void UpdateViewportPosition(Window *w)
|
||||||
|
|
||||||
SetViewportPosition(w, pt.x, pt.y);
|
SetViewportPosition(w, pt.x, pt.y);
|
||||||
} else {
|
} else {
|
||||||
int x;
|
/* Ensure the destination location is within the map */
|
||||||
int y;
|
ClampViewportToMap(vp, WP(w, vp_d).dest_scrollpos_x, WP(w, vp_d).dest_scrollpos_y);
|
||||||
int vx;
|
|
||||||
int vy;
|
|
||||||
|
|
||||||
/* Center of the viewport is hot spot */
|
int delta_x = WP(w, vp_d).dest_scrollpos_x - WP(w, vp_d).scrollpos_x;
|
||||||
x = WP(w,vp_d).scrollpos_x + vp->virtual_width / 2;
|
int delta_y = WP(w, vp_d).dest_scrollpos_y - WP(w, vp_d).scrollpos_y;
|
||||||
y = WP(w,vp_d).scrollpos_y + vp->virtual_height / 2;
|
|
||||||
|
|
||||||
int dest_x = WP(w,vp_d).dest_scrollpos_x + vp->virtual_width / 2;
|
|
||||||
int dest_y = WP(w,vp_d).dest_scrollpos_y + vp->virtual_height / 2;
|
|
||||||
|
|
||||||
int delta_x = dest_x - x;
|
|
||||||
int delta_y = dest_y - y;
|
|
||||||
|
|
||||||
if (delta_x != 0 || delta_y != 0) {
|
if (delta_x != 0 || delta_y != 0) {
|
||||||
if (_patches.smooth_scroll) {
|
if (_patches.smooth_scroll) {
|
||||||
int max_scroll = ScaleByMapSize1D(512);
|
int max_scroll = ScaleByMapSize1D(512);
|
||||||
/* Not at our desired positon yet... */
|
/* Not at our desired positon yet... */
|
||||||
x += clamp(delta_x / 8, -max_scroll, max_scroll);
|
WP(w, vp_d).scrollpos_x += clamp(delta_x / 4, -max_scroll, max_scroll);
|
||||||
y += clamp(delta_y / 8, -max_scroll, max_scroll);
|
WP(w, vp_d).scrollpos_y += clamp(delta_y / 4, -max_scroll, max_scroll);
|
||||||
} else {
|
} else {
|
||||||
x = dest_x;
|
WP(w, vp_d).scrollpos_x = WP(w, vp_d).dest_scrollpos_x;
|
||||||
y = dest_y;
|
WP(w, vp_d).scrollpos_y = WP(w, vp_d).dest_scrollpos_y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert viewport coordinates to map coordinates
|
ClampViewportToMap(vp, WP(w, vp_d).scrollpos_x, WP(w, vp_d).scrollpos_y);
|
||||||
* Calculation is scaled by 4 to avoid rounding errors */
|
|
||||||
vx = -x + y * 2;
|
|
||||||
vy = x + y * 2;
|
|
||||||
/* clamp to size of map */
|
|
||||||
vx = clamp(vx, 0 * 4, MapMaxX() * TILE_SIZE * 4);
|
|
||||||
vy = clamp(vy, 0 * 4, MapMaxY() * TILE_SIZE * 4);
|
|
||||||
/* Convert map coordinates to viewport coordinates */
|
|
||||||
x = (-vx + vy) / 2;
|
|
||||||
y = ( vx + vy) / 4;
|
|
||||||
/* Set position */
|
|
||||||
WP(w, vp_d).scrollpos_x = x - vp->virtual_width / 2;
|
|
||||||
WP(w, vp_d).scrollpos_y = y - vp->virtual_height / 2;
|
|
||||||
|
|
||||||
SetViewportPosition(w, WP(w, vp_d).scrollpos_x, WP(w, vp_d).scrollpos_y);
|
SetViewportPosition(w, WP(w, vp_d).scrollpos_x, WP(w, vp_d).scrollpos_y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue