From 1f4430f3d094cc3e028c5daceecb4c36aac8e468 Mon Sep 17 00:00:00 2001 From: BeaR Date: Tue, 7 Oct 2014 20:07:46 +0200 Subject: [PATCH] Editor: Add feature to zoom to mouse position --- src/game/editor/editor.cpp | 36 +++++++++++++++++++++++++++++++++--- src/game/editor/editor.h | 1 + src/game/variables.h | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 771f5bf85..63bb6e029 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -4028,12 +4028,22 @@ void CEditor::Render() } if(m_Dialog == DIALOG_NONE && UI()->MouseInside(&View)) { + // Determines in which direction to zoom. + int Zoom = 0; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) - m_ZoomLevel -= 20; - + Zoom--; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) - m_ZoomLevel += 20; + Zoom++; + + if(Zoom != 0) + { + float OldLevel = m_ZoomLevel; + m_ZoomLevel = clamp(m_ZoomLevel + Zoom * 20, 50, 2000); + if(g_Config.m_EdZoomTarget) + ZoomMouseTarget((float)m_ZoomLevel / OldLevel); + } } + m_ZoomLevel = clamp(m_ZoomLevel, 50, 2000); m_WorldZoom = m_ZoomLevel/100.0f; float Brightness = 0.25f; @@ -4229,6 +4239,26 @@ int CEditor::GetLineDistance() return LineDistance; } +void CEditor::ZoomMouseTarget(float ZoomFactor) +{ + // zoom to the current mouse position + // get absolute mouse position + float aPoints[4]; + RenderTools()->MapscreenToWorld( + m_WorldOffsetX, m_WorldOffsetY, + 1.0f, 1.0f, 0.0f, 0.0f, Graphics()->ScreenAspect(), m_WorldZoom, aPoints); + + float WorldWidth = aPoints[2]-aPoints[0]; + float WorldHeight = aPoints[3]-aPoints[1]; + + float Mwx = aPoints[0] + WorldWidth * (UI()->MouseX()/UI()->Screen()->w); + float Mwy = aPoints[1] + WorldHeight * (UI()->MouseY()/UI()->Screen()->h); + + // adjust camera + m_WorldOffsetX += (Mwx-m_WorldOffsetX) * (1-ZoomFactor); + m_WorldOffsetY += (Mwy-m_WorldOffsetY) * (1-ZoomFactor); +} + void CEditorMap::DeleteEnvelope(int Index) { if(Index < 0 || Index >= m_lEnvelopes.size()) diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index d216211b9..3e9e167dd 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -913,6 +913,7 @@ public: } int GetLineDistance(); + void ZoomMouseTarget(float ZoomFactor); // DDRace diff --git a/src/game/variables.h b/src/game/variables.h index 84fe4612d..4637c2930 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -48,6 +48,7 @@ MACRO_CONFIG_INT(ClMouseMaxDistance, cl_mouse_max_distance, 400, 0, 0, CFGFLAG_C MACRO_CONFIG_INT(ClMouseMaxDistance, cl_mouse_max_distance, 800, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") #endif +MACRO_CONFIG_INT(EdZoomTarget, ed_zoom_target, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Zoom to the current mouse target") MACRO_CONFIG_INT(EdShowkeys, ed_showkeys, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") //MACRO_CONFIG_INT(ClFlow, cl_flow, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "")