1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-12 02:28:11 +02:00

Merge pull request #2683 from Laserlicht/zoom_dead_area

dead area for zooming
This commit is contained in:
Nordsoft91 2023-08-28 17:09:15 +04:00 committed by GitHub
commit 6394a77270
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 4 deletions

View File

@ -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)

View File

@ -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);