(svn r1063) Improve scrolling limits a bit. You now can scroll further away from the map at the NW and NE edge.
authortron
Mon, 13 Dec 2004 18:33:47 +0000
changeset 632 0e71f12b846b
parent 631 4da54d38331f
child 633 d127d8a74ad0
(svn r1063) Improve scrolling limits a bit. You now can scroll further away from the map at the NW and NE edge.
Hopefully this new code is also a bit more comprehensible than the old. (;
viewport.c
--- a/viewport.c	Mon Dec 13 18:32:49 2004 +0000
+++ b/viewport.c	Mon Dec 13 18:33:47 2004 +0000
@@ -1276,28 +1276,39 @@
 		pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos);
 		SetViewportPosition(w, pt.x, pt.y);
 	} else {
+#if !defined(NEW_ROTATION)
+		int x;
+		int y;
+		int vx;
+		int vy;
+
+		// Center of the viewport is hot spot
+		x = WP(w,vp_d).scrollpos_x + vp->virtual_width / 2;
+		y = WP(w,vp_d).scrollpos_y + vp->virtual_height / 2;
+		// Convert viewport coordinates to map coordinates
+		// 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, TILE_X_MAX * 16 * 4);
+		vy = clamp(vy, 0 * 4, TILE_Y_MAX * 16 * 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;
+#else
 		int x,y,t;
 		int err;
 
 		x = WP(w,vp_d).scrollpos_x >> 2;
 		y = WP(w,vp_d).scrollpos_y >> 1;
 
-#if !defined(NEW_ROTATION)
-		t = x;
-		x = y - t;
-		y = y + t;
-
-		// check if inside bounds?
-		t = (-130) << vp->zoom;
-		err = 0;
-		if (y < t || y > (t += TILE_Y_MAX*16-1)) { y = t; err++; }
-		if (x < (t=0) || x > (t=TILE_X_MAX*16-1) ) { x = t; err++; }
-#else
 		t = x;
 		x = x + y;
 		y = x - y;
 		err= 0;
-#endif
 
 		if (err != 0) {
 			/* coordinate remap */
@@ -1306,6 +1317,8 @@
 			WP(w,vp_d).scrollpos_x = pt.x & t;
 			WP(w,vp_d).scrollpos_y = pt.y & t;
 		}
+#endif
+
 		SetViewportPosition(w, WP(w,vp_d).scrollpos_x, WP(w,vp_d).scrollpos_y);
 	}
 }