mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Merge pull request #2683 from Laserlicht/zoom_dead_area
dead area for zooming
This commit is contained in:
		| @@ -20,6 +20,7 @@ | ||||
| #include "../adventureMap/AdventureMapInterface.h" | ||||
| #include "../gui/CGuiHandler.h" | ||||
| #include "../gui/WindowHandler.h" | ||||
| #include "../eventsSDL/InputHandler.h" | ||||
|  | ||||
| #include "../../lib/CConfigHandler.h" | ||||
| #include "../../lib/mapObjects/CGHeroInstance.h" | ||||
| @@ -90,13 +91,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 +113,22 @@ 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; | ||||
| 		 | ||||
| 		bool isInDeadZone = targetTileSize != actualZoom || actualZoom == Point(defaultTileSize, defaultTileSize); | ||||
|  | ||||
| 		if(!wasInDeadZone && isInDeadZone) | ||||
| 			GH.input().hapticFeedback(); | ||||
|  | ||||
| 		wasInDeadZone = isInDeadZone; | ||||
|  | ||||
| 		setTileSize(actualZoom); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| MapViewController::MapViewController(std::shared_ptr<MapViewModel> model, std::shared_ptr<MapViewCache> view) | ||||
|   | ||||
| @@ -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,11 @@ class MapViewController : public IMapObjectObserver | ||||
| 	std::shared_ptr<MapRendererPuzzleMapContext> puzzleMapContext; | ||||
|  | ||||
| private: | ||||
| 	const int defaultTileSize = 32; | ||||
| 	const int zoomTileDeadArea = 5; | ||||
| 	Point targetTileSize = Point(32, 32); | ||||
| 	bool wasInDeadZone = true; | ||||
|  | ||||
| 	bool isEventInstant(const CGObjectInstance * obj); | ||||
| 	bool isEventVisible(const CGObjectInstance * obj); | ||||
| 	bool isEventVisible(const CGHeroInstance * obj, const int3 & from, const int3 & dest); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user