Browse Source

dead area for zoom

Michael 2 years ago
parent
commit
f16b93c391
2 changed files with 15 additions and 4 deletions
  1. 10 3
      client/mapView/MapViewController.cpp
  2. 5 1
      client/mapView/MapViewController.h

+ 10 - 3
client/mapView/MapViewController.cpp

@@ -90,13 +90,13 @@ void MapViewController::modifyTileSize(int stepsChange)
 	// we want to zoom in/out in fixed 10% steps, to allow player to return back to exactly 100% zoom just by scrolling
 	// so, zooming in for 5 steps will put game at 1.1^5 = 1.61 scale
 	// try to determine current zooming level and change it by requested number of steps
-	double currentZoomFactor = model->getSingleTileSize().x / 32.0;
+	double currentZoomFactor = targetTileSize.x / static_cast<double>(defaultTileSize);
 	double currentZoomSteps = std::round(std::log(currentZoomFactor) / std::log(1.01));
 	double newZoomSteps = stepsChange != 0 ? currentZoomSteps + stepsChange : stepsChange;
 	double newZoomFactor = std::pow(1.01, newZoomSteps);
 
-	Point currentZoom = model->getSingleTileSize();
-	Point desiredZoom = Point(32,32) * newZoomFactor;
+	Point currentZoom = targetTileSize;
+	Point desiredZoom = Point(defaultTileSize,defaultTileSize) * newZoomFactor;
 
 	if (desiredZoom == currentZoom && stepsChange < 0)
 		desiredZoom -= Point(1,1);
@@ -112,7 +112,14 @@ void MapViewController::modifyTileSize(int stepsChange)
 	};
 
 	if (actualZoom != currentZoom)
+	{
+		targetTileSize = actualZoom;
+		if(actualZoom.x >= defaultTileSize - zoomTileDeadArea && actualZoom.x <= defaultTileSize + zoomTileDeadArea)
+			actualZoom.x = defaultTileSize;
+		if(actualZoom.y >= defaultTileSize - zoomTileDeadArea && actualZoom.y <= defaultTileSize + zoomTileDeadArea)
+			actualZoom.y = defaultTileSize;
 		setTileSize(actualZoom);
+	}
 }
 
 MapViewController::MapViewController(std::shared_ptr<MapViewModel> model, std::shared_ptr<MapViewCache> view)

+ 5 - 1
client/mapView/MapViewController.h

@@ -10,9 +10,9 @@
 #pragma once
 
 #include "IMapRendererObserver.h"
+#include "../../lib/Point.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
-class Point;
 struct ObjectPosInfo;
 VCMI_LIB_NAMESPACE_END
 
@@ -50,6 +50,10 @@ class MapViewController : public IMapObjectObserver
 	std::shared_ptr<MapRendererPuzzleMapContext> puzzleMapContext;
 
 private:
+	const int defaultTileSize = 32;
+	const int zoomTileDeadArea = 4;
+	Point targetTileSize = Point(32, 32);
+
 	bool isEventInstant(const CGObjectInstance * obj);
 	bool isEventVisible(const CGObjectInstance * obj);
 	bool isEventVisible(const CGHeroInstance * obj, const int3 & from, const int3 & dest);