From 47246c8155860848653540977d9c229e4ed2046a Mon Sep 17 00:00:00 2001 From: historic_bruno Date: Sun, 21 Nov 2010 04:59:59 +0000 Subject: [PATCH] Fixes #572. Changed MoveCameraToTarget so that for minimap scrolling it will ignore changes in Y position, to maintain previous zoom level as expected (constraint keeps the new view from being inappropriate) This was SVN commit r8676. --- source/graphics/GameView.cpp | 9 +++++++-- source/graphics/GameView.h | 2 +- source/gui/MiniMap.cpp | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/source/graphics/GameView.cpp b/source/graphics/GameView.cpp index 838bdfec5b..3bb2f24bdd 100644 --- a/source/graphics/GameView.cpp +++ b/source/graphics/GameView.cpp @@ -826,7 +826,7 @@ void CGameView::Update(float DeltaTime) m->ViewCamera.UpdateFrustum(); } -void CGameView::MoveCameraTarget(const CVector3D& target) +void CGameView::MoveCameraTarget(const CVector3D& target, bool minimap) { // Maintain the same orientation and level of zoom, if we can // (do this by working out the point the camera is looking at, saving @@ -841,8 +841,13 @@ void CGameView::MoveCameraTarget(const CVector3D& target) CVector3D pivot = targetCam.GetFocus(); CVector3D delta = target - pivot; + + //If minimap movement, maintain previous zoom level by not changing Y position + // - this prevents strange behavior when moving across changes in terrain height + if (!minimap) + m->PosY.SetValueSmoothly(delta.Y + m->PosY.GetValue()); + m->PosX.SetValueSmoothly(delta.X + m->PosX.GetValue()); - m->PosY.SetValueSmoothly(delta.Y + m->PosY.GetValue()); m->PosZ.SetValueSmoothly(delta.Z + m->PosZ.GetValue()); ClampDistance(m, false); diff --git a/source/graphics/GameView.h b/source/graphics/GameView.h index 5d159f654d..201b2cd6a3 100644 --- a/source/graphics/GameView.h +++ b/source/graphics/GameView.h @@ -83,7 +83,7 @@ public: InReaction HandleEvent(const SDL_Event_* ev); - void MoveCameraTarget(const CVector3D& target); + void MoveCameraTarget(const CVector3D& target, bool minimap = false); void ResetCameraTarget(const CVector3D& target); void ResetCameraAngleZoom(); void CameraFollow(entity_id_t entity, bool firstPerson); diff --git a/source/gui/MiniMap.cpp b/source/gui/MiniMap.cpp index 326c64053b..03bcd9b1c6 100644 --- a/source/gui/MiniMap.cpp +++ b/source/gui/MiniMap.cpp @@ -153,7 +153,7 @@ void CMiniMap::SetCameraPos() CVector3D target; GetMouseWorldCoordinates(target.X, target.Z); target.Y = terrain->GetExactGroundLevel(target.X, target.Z); - g_Game->GetView()->MoveCameraTarget(target); + g_Game->GetView()->MoveCameraTarget(target, true); } float CMiniMap::GetAngle()