[colobot] 86/145: Unified all camera inputs

Didier Raboud odyx at moszumanska.debian.org
Mon Jul 11 12:56:20 UTC 2016


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit bd72086704a6b61222a9708b848875585d84ae4e
Author: krzys-h <krzys_h at interia.pl>
Date:   Fri May 27 22:38:44 2016 +0200

    Unified all camera inputs
    
    Until now each camera type had separate code for handling camera input, and some new features were missing in some of them.
    
    The camera controls are as follows:
    * RMB+mouse and numpad keys - horizontal/vertical rotation
    * mouse wheel and +/- keys - zoom (in free camera - move eye up/down)
    * CTRL or MMB + horizontal controls - pan left/right
    * CTRL or MMB + zoom controls - move lookat up/down (free camera only)
---
 po/colobot.pot                 |   6 -
 po/de.po                       |   6 -
 po/fr.po                       |  12 +-
 po/pl.po                       |  12 +-
 po/ru.po                       |   6 -
 src/app/input.cpp              |  30 +----
 src/app/input.h                |   8 --
 src/common/key.h               |   2 -
 src/common/restext.cpp         |   2 -
 src/graphics/engine/camera.cpp | 266 +++++++++++++----------------------------
 src/graphics/engine/camera.h   |  21 ++--
 11 files changed, 109 insertions(+), 262 deletions(-)

diff --git a/po/colobot.pot b/po/colobot.pot
index b39e7ad..08625b6 100644
--- a/po/colobot.pot
+++ b/po/colobot.pot
@@ -506,12 +506,6 @@ msgstr ""
 msgid "Speed 6.0x\\Sextuple speed"
 msgstr ""
 
-msgid "Camera up\\Increase camera angle while visiting message origin"
-msgstr ""
-
-msgid "Camera down\\Decrease camera angle while visiting message origin"
-msgstr ""
-
 msgid "Pause\\Pause the game without opening menu"
 msgstr ""
 
diff --git a/po/de.po b/po/de.po
index 972066e..c49e5cf 100644
--- a/po/de.po
+++ b/po/de.po
@@ -330,9 +330,6 @@ msgstr "Kameradrehung mit der Maus\\Die Kamera dreht wenn die Maus den Rand erre
 msgid "Camera closer\\Moves the camera forward"
 msgstr "Kamera näher\\Bewegung der Kamera vorwärts"
 
-msgid "Camera down\\Decrease camera angle while visiting message origin"
-msgstr ""
-
 msgid "Camera nearest"
 msgstr "Kamera näher"
 
@@ -342,9 +339,6 @@ msgstr "Kamera links"
 msgid "Camera to right"
 msgstr "Kamera rechts"
 
-msgid "Camera up\\Increase camera angle while visiting message origin"
-msgstr ""
-
 msgid "Can not produce not researched object"
 msgstr "Das erforschte Objekt kann nicht produziert werden"
 
diff --git a/po/fr.po b/po/fr.po
index 6822fa0..880f1d0 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -321,9 +321,6 @@ msgstr "Défilement dans les bords\\Défilement lorsque la souris touche les bor
 msgid "Camera closer\\Moves the camera forward"
 msgstr "Caméra plus proche\\Avance la caméra"
 
-msgid "Camera down\\Decrease camera angle while visiting message origin"
-msgstr "Caméra plus basse\\Réduit l'angle de caméra lors de la vue de l'origine des messages"
-
 msgid "Camera nearest"
 msgstr "Caméra plus proche"
 
@@ -333,9 +330,6 @@ msgstr "Caméra à gauche"
 msgid "Camera to right"
 msgstr "Caméra à droite"
 
-msgid "Camera up\\Increase camera angle while visiting message origin"
-msgstr "Caméra plus haute\\Augmente l'angle de caméra lors de la vue de l'origine des messages"
-
 msgid "Can not produce not researched object"
 msgstr "Impossible de créer un objet n'ayant pas été recherché"
 
@@ -1815,6 +1809,12 @@ msgstr ""
 #~ msgid "COLOBOT"
 #~ msgstr "COLOBOT"
 
+#~ msgid "Camera down\\Decrease camera angle while visiting message origin"
+#~ msgstr "Caméra plus basse\\Réduit l'angle de caméra lors de la vue de l'origine des messages"
+
+#~ msgid "Camera up\\Increase camera angle while visiting message origin"
+#~ msgstr "Caméra plus haute\\Augmente l'angle de caméra lors de la vue de l'origine des messages"
+
 #~ msgid "Can not create this; there are too many objects"
 #~ msgstr "Création impossible; il y a trop d'objets"
 
diff --git a/po/pl.po b/po/pl.po
index 89cc236..6796728 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -324,9 +324,6 @@ msgstr "Przewijanie kamery przy krawędzi\\Ekran jest przewijany gdy mysz dotkni
 msgid "Camera closer\\Moves the camera forward"
 msgstr "Kamera bliżej\\Przybliża kamerę"
 
-msgid "Camera down\\Decrease camera angle while visiting message origin"
-msgstr "Kamera w dół\\Opuść kamerę podczas sprawdzania źródła wiadomości"
-
 msgid "Camera nearest"
 msgstr "Camera nearest"
 
@@ -336,9 +333,6 @@ msgstr "Camera to left"
 msgid "Camera to right"
 msgstr "Camera to right"
 
-msgid "Camera up\\Increase camera angle while visiting message origin"
-msgstr "Kamera w górę\\Podnieś kamerę podczas sprawdzania źródła wiadomości"
-
 msgid "Can not produce not researched object"
 msgstr "Nie można wyprodukować nie wynalezionego obiektu"
 
@@ -1811,6 +1805,12 @@ msgstr ""
 #~ msgid "Building too close"
 #~ msgstr "Budynek za blisko"
 
+#~ msgid "Camera down\\Decrease camera angle while visiting message origin"
+#~ msgstr "Kamera w dół\\Opuść kamerę podczas sprawdzania źródła wiadomości"
+
+#~ msgid "Camera up\\Increase camera angle while visiting message origin"
+#~ msgstr "Kamera w górę\\Podnieś kamerę podczas sprawdzania źródła wiadomości"
+
 #~ msgid "Can not create this; there are too many objects"
 #~ msgstr "Nie można tego utworzyć, za dużo obiektów"
 
diff --git a/po/ru.po b/po/ru.po
index 31d91d6..563ba00 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -328,9 +328,6 @@ msgstr "Прокрутка\\Прокрутка, когда указатель м
 msgid "Camera closer\\Moves the camera forward"
 msgstr "Приблизать камеру\\Перемещение камеры вперед"
 
-msgid "Camera down\\Decrease camera angle while visiting message origin"
-msgstr ""
-
 msgid "Camera nearest"
 msgstr "Приблизить камеру"
 
@@ -340,9 +337,6 @@ msgstr "Камеру влево"
 msgid "Camera to right"
 msgstr "Камеру вправо"
 
-msgid "Camera up\\Increase camera angle while visiting message origin"
-msgstr ""
-
 msgid "Can not produce not researched object"
 msgstr ""
 
diff --git a/src/app/input.cpp b/src/app/input.cpp
index ed1fdf9..0a04915 100644
--- a/src/app/input.cpp
+++ b/src/app/input.cpp
@@ -30,6 +30,7 @@
 
 #include <sstream>
 #include <boost/lexical_cast.hpp>
+#include <SDL_system.h>
 
 
 template<> CInput* CSingleton<CInput>::m_instance = nullptr;
@@ -63,13 +64,10 @@ CInput::CInput()
         { INPUT_SLOT_SPEED30,  "speed30" },
         { INPUT_SLOT_SPEED40,  "speed40" },
         { INPUT_SLOT_SPEED60,  "speed60" },
-        { INPUT_SLOT_CAMERA_UP,   "camup"   },
-        { INPUT_SLOT_CAMERA_DOWN, "camdown" },
         { INPUT_SLOT_PAUSE,    "pause" },
         { INPUT_SLOT_CMDLINE,    "cmdline" },
     };
 
-    m_kmodState = 0;
     m_mousePos = Math::Point();
     m_mouseButtonsState = 0;
     std::fill_n(m_keyPresses, static_cast<std::size_t>(INPUT_SLOT_MAX), false);
@@ -80,13 +78,6 @@ CInput::CInput()
 
 void CInput::EventProcess(Event& event)
 {
-    if (event.type == EVENT_KEY_DOWN ||
-        event.type == EVENT_KEY_UP)
-    {
-        // Use the occasion to update kmods
-        m_kmodState = event.kmodState;
-    }
-
     // Use the occasion to update mouse button state
     if (event.type == EVENT_MOUSE_BUTTON_DOWN)
     {
@@ -107,7 +98,7 @@ void CInput::EventProcess(Event& event)
         data->slot = FindBinding(data->key);
     }
 
-    event.kmodState = m_kmodState;
+    event.kmodState = SDL_GetModState();
     event.mousePos = m_mousePos;
     event.mouseButtonsState = m_mouseButtonsState;
 
@@ -134,8 +125,6 @@ void CInput::EventProcess(Event& event)
         if (data->slot == INPUT_SLOT_GUP  ) m_keyMotion.z =  1.0f;
         if (data->slot == INPUT_SLOT_GDOWN) m_keyMotion.z = -1.0f;
 
-        if (data->slot == INPUT_SLOT_CAMERA_UP  ) m_cameraKeyMotion.z =  1.0f;
-        if (data->slot == INPUT_SLOT_CAMERA_DOWN) m_cameraKeyMotion.z = -1.0f;
         if (data->key  == KEY(KP_4)             ) m_cameraKeyMotion.x = -1.0f;
         if (data->key  == KEY(KP_6)             ) m_cameraKeyMotion.x =  1.0f;
         if (data->key  == KEY(KP_8)             ) m_cameraKeyMotion.y =  1.0f;
@@ -152,8 +141,6 @@ void CInput::EventProcess(Event& event)
         if (data->slot == INPUT_SLOT_GUP  ) m_keyMotion.z = 0.0f;
         if (data->slot == INPUT_SLOT_GDOWN) m_keyMotion.z = 0.0f;
 
-        if (data->slot == INPUT_SLOT_CAMERA_UP  ) m_cameraKeyMotion.z = 0.0f;
-        if (data->slot == INPUT_SLOT_CAMERA_DOWN) m_cameraKeyMotion.z = 0.0f;
         if (data->key  == KEY(KP_4)             ) m_cameraKeyMotion.x = 0.0f;
         if (data->key  == KEY(KP_6)             ) m_cameraKeyMotion.x = 0.0f;
         if (data->key  == KEY(KP_8)             ) m_cameraKeyMotion.y = 0.0f;
@@ -194,16 +181,6 @@ void CInput::MouseMove(Math::IntPoint pos)
     m_mousePos = Gfx::CEngine::GetInstancePointer()->WindowToInterfaceCoords(pos);
 }
 
-int CInput::GetKmods() const
-{
-    return m_kmodState;
-}
-
-bool CInput::GetKmodState(int kmod) const
-{
-    return (m_kmodState & kmod) != 0;
-}
-
 bool CInput::GetKeyState(InputSlot key) const
 {
     return m_keyPresses[key];
@@ -217,7 +194,6 @@ bool CInput::GetMouseButtonState(int index) const
 void CInput::ResetKeyStates()
 {
     GetLogger()->Trace("Reset key states\n");
-    m_kmodState = 0;
     m_keyMotion = Math::Vector(0.0f, 0.0f, 0.0f);
     m_joyMotion = Math::Vector(0.0f, 0.0f, 0.0f);
     m_cameraKeyMotion = Math::Vector(0.0f, 0.0f, 0.0f);
@@ -272,8 +248,6 @@ void CInput::SetDefaultInputBindings()
     m_inputBindings[INPUT_SLOT_SPEED30].primary   = KEY(F7);
     m_inputBindings[INPUT_SLOT_SPEED40].primary   = KEY(F8);
     m_inputBindings[INPUT_SLOT_SPEED60].primary   = KEY(F9);
-    m_inputBindings[INPUT_SLOT_CAMERA_UP].primary   = KEY(PAGEUP);
-    m_inputBindings[INPUT_SLOT_CAMERA_DOWN].primary = KEY(PAGEDOWN);
     m_inputBindings[INPUT_SLOT_PAUSE].primary       = KEY(PAUSE);
     m_inputBindings[INPUT_SLOT_PAUSE].secondary     = KEY(p);
     m_inputBindings[INPUT_SLOT_CMDLINE].primary     = KEY(BACKQUOTE);
diff --git a/src/app/input.h b/src/app/input.h
index e920388..d58bf2f 100644
--- a/src/app/input.h
+++ b/src/app/input.h
@@ -81,12 +81,6 @@ public:
     void MouseMove(Math::IntPoint pos);
 
 
-    //! Returns the current key modifiers
-    int         GetKmods() const;
-
-    //! Returns whether the given kmod is active
-    bool        GetKmodState(int kmod) const;
-
     //! Returns whether the key is pressed
     bool        GetKeyState(InputSlot key) const;
 
@@ -140,8 +134,6 @@ public:
     //@}
 
 private:
-    //! Current state of key modifiers (bitmask of SDLMod)
-    unsigned int    m_kmodState;
     //! Current state of keys
     bool            m_keyPresses[INPUT_SLOT_MAX];
 
diff --git a/src/common/key.h b/src/common/key.h
index 4f089ec..d618c45 100644
--- a/src/common/key.h
+++ b/src/common/key.h
@@ -102,8 +102,6 @@ enum InputSlot
     INPUT_SLOT_SPEED30,
     INPUT_SLOT_SPEED40,
     INPUT_SLOT_SPEED60,
-    INPUT_SLOT_CAMERA_UP,
-    INPUT_SLOT_CAMERA_DOWN,
     INPUT_SLOT_PAUSE,
     INPUT_SLOT_CMDLINE,
 
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index 2016464..24d515d 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -235,8 +235,6 @@ void InitializeRestext()
     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED30]     = TR("Speed 3.0x\\Triple speed");
     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED40]     = TR("Speed 4.0x\\Quadruple speed");
     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED60]     = TR("Speed 6.0x\\Sextuple speed");
-    stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAMERA_UP]   = TR("Camera up\\Increase camera angle while visiting message origin");
-    stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAMERA_DOWN] = TR("Camera down\\Decrease camera angle while visiting message origin");
     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_PAUSE]       = TR("Pause\\Pause the game without opening menu");
     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CMDLINE]     = TR("Cheat console\\Show cheat console");
 
diff --git a/src/graphics/engine/camera.cpp b/src/graphics/engine/camera.cpp
index 53613b6..b713bc6 100644
--- a/src/graphics/engine/camera.cpp
+++ b/src/graphics/engine/camera.cpp
@@ -102,7 +102,7 @@ CCamera::CCamera()
     m_eyePt        = Math::Vector(0.0f, 0.0f, 0.0f);
     m_directionH   =  0.0f;
     m_directionV   =  0.0f;
-    m_heightEye    = 20.0f;
+    m_heightEye    = 40.0f;
     m_heightLookat =  0.0f;
     m_speed        =  2.0f;
 
@@ -122,8 +122,6 @@ CCamera::CCamera()
     m_visitType       = CAM_TYPE_NULL;
     m_visitDirectionV = 0.0f;
 
-    m_editHeight = 40.0f;
-
     m_remotePan  = 0.0f;
 
     m_centeringPhase    = CAM_PHASE_NULL;
@@ -1145,34 +1143,7 @@ bool CCamera::EventMouseMove(const Event &event)
 void CCamera::EventMouseWheel(const Event &event)
 {
     auto dir = event.GetData<MouseWheelEventData>()->y;
-
-    if (m_type == CAM_TYPE_BACK)
-    {
-        m_backDist -= 8.0f*dir;
-        if (m_backDist < m_backMin)
-            m_backDist = m_backMin;
-        if (m_backDist > 200.0f)
-            m_backDist = 200.0f;
-    }
-
-    if ( m_type == CAM_TYPE_FIX   ||
-         m_type == CAM_TYPE_PLANE )
-    {
-        m_fixDist -= 8.0f*dir;
-        if (m_fixDist < 10.0f)
-            m_fixDist = 10.0f;
-        if (m_fixDist > 200.0f)
-            m_fixDist = 200.0f;
-    }
-
-    if ( m_type == CAM_TYPE_VISIT )
-    {
-        m_visitDist -= 8.0f*dir;
-        if (m_visitDist < 20.0f)
-            m_visitDist = 20.0f;
-        if (m_visitDist > 200.0f)
-            m_visitDist = 200.0f;
-    }
+    m_mouseWheelDelta -= dir;
 }
 
 void CCamera::EventMouseButton(const Event &event)
@@ -1202,11 +1173,9 @@ bool CCamera::EventFrame(const Event &event)
     EffectFrame(event);
     OverFrame(event);
 
-    if (m_type == CAM_TYPE_FREE)
-        return EventFrameFree(event);
-
-    if (m_type == CAM_TYPE_EDIT)
-        return EventFrameEdit(event);
+    if (m_type == CAM_TYPE_FREE ||
+        m_type == CAM_TYPE_EDIT)
+        return EventFrameFree(event, m_type != CAM_TYPE_EDIT);
 
     if (m_type == CAM_TYPE_DIALOG)
         return EventFrameDialog(event);
@@ -1236,57 +1205,36 @@ bool CCamera::EventFrame(const Event &event)
     return true;
 }
 
-bool CCamera::EventFrameFree(const Event &event)
+bool CCamera::EventFrameFree(const Event &event, bool keysAllowed)
 {
-    Math::Vector cameraInput = event.cameraInput;
-    if (m_cameraObj == nullptr)
-    {
-        cameraInput = Math::Clamp(cameraInput + event.motionInput, Math::Vector(-1.0f, -1.0f, -1.0f), Math::Vector(1.0f, 1.0f, 1.0f));
-    }
+    Math::Vector cameraMove = CalculateCameraMovement(event, keysAllowed);
 
     float factor = m_heightEye * 0.5f + 30.0f;
+    bool secondary = event.kmodState & KEY_MOD(CTRL) || event.mouseButtonsState & MOUSE_BUTTON_MIDDLE;
 
-    m_directionH -= m_mouseDelta.x * 2*Math::PI;
-    m_eyePt = Math::LookatPoint(m_eyePt, m_directionH, m_directionV, m_mouseDelta.y * factor * m_speed);
-    m_mouseDelta.LoadZero();
-
-    // Up/Down
-    m_eyePt = Math::LookatPoint(m_eyePt, m_directionH, m_directionV, cameraInput.y * event.rTime * factor * m_speed);
+    // Forward/Backward
+    m_eyePt = Math::LookatPoint(m_eyePt, m_directionH, m_directionV, -cameraMove.y * factor * 2);
 
-    // Left/Right
-    if ( event.kmodState & KEY_MOD(CTRL) )
+    // Left/Right (pan or rotate)
+    if (secondary)
     {
-        if ( cameraInput.x < 0.0f )
-            m_eyePt = Math::LookatPoint(m_eyePt, m_directionH + Math::PI / 2.0f, m_directionV, -cameraInput.x * event.rTime * factor * m_speed);
-        if ( cameraInput.x > 0.0f )
-            m_eyePt = Math::LookatPoint(m_eyePt, m_directionH - Math::PI / 2.0f, m_directionV,  cameraInput.x * event.rTime * factor * m_speed);
+        if (cameraMove.x < 0.0f)
+            m_eyePt = Math::LookatPoint(m_eyePt, m_directionH + Math::PI / 2.0f, m_directionV, -cameraMove.x * factor);
+        if (cameraMove.x > 0.0f)
+            m_eyePt = Math::LookatPoint(m_eyePt, m_directionH - Math::PI / 2.0f, m_directionV,  cameraMove.x * factor);
     }
     else
     {
-        m_directionH -= cameraInput.x * event.rTime * 0.7f * m_speed;
-    }
-
-    // PageUp/PageDown
-    if ( m_input->GetKeyState(INPUT_SLOT_AWAY) )
-    {
-        if (m_heightEye < 500.0f)
-            m_heightEye += event.rTime * factor * m_speed;
-    }
-    if ( m_input->GetKeyState(INPUT_SLOT_NEAR) )
-    {
-        if (m_heightEye > -2.0f)
-            m_heightEye -= event.rTime * factor * m_speed;
+        m_directionH -= cameraMove.x;
     }
 
+    // Up/Down (eye or lookat point)
+    if (secondary)
+        m_heightLookat -= cameraMove.z;
+    else
+        m_heightEye -= cameraMove.z;
 
-    if ( m_input->GetKeyState(INPUT_SLOT_CAMERA_UP) )
-    {
-        m_heightLookat += event.rTime * factor * m_speed;
-    }
-    if ( m_input->GetKeyState(INPUT_SLOT_CAMERA_DOWN) )
-    {
-        m_heightLookat -= event.rTime * factor * m_speed;
-    }
+    m_heightEye = Math::Clamp(m_heightEye, -2.0f, 500.0f);
 
     m_terrain->AdjustToBounds(m_eyePt, 10.0f);
 
@@ -1314,44 +1262,6 @@ bool CCamera::EventFrameFree(const Event &event)
     return true;
 }
 
-bool CCamera::EventFrameEdit(const Event &event)
-{
-    float factor = m_editHeight * 0.5f + 30.0f;
-
-    m_directionH -= m_mouseDelta.x * 0.7f * 2*Math::PI;
-    m_eyePt = Math::LookatPoint(m_eyePt, m_directionH, m_directionV, m_mouseDelta.y * factor * m_speed);
-
-    m_fixDirectionH += m_mouseDelta.x * 2*Math::PI;
-    m_fixDirectionH = Math::NormAngle(m_fixDirectionH);
-
-    m_mouseDelta.LoadZero();
-
-    m_terrain->AdjustToBounds(m_eyePt, 10.0f);
-
-    if (m_terrain->AdjustToFloor(m_eyePt, false))
-    {
-        m_eyePt.y += m_editHeight;
-
-        Math::Vector pos = m_eyePt;
-        if (m_terrain->AdjustToFloor(pos, false))
-        {
-            pos.y += 2.0f;
-            if (m_eyePt.y < pos.y)
-                m_eyePt.y = pos.y;
-        }
-
-    }
-
-    Math::Vector lookatPt = Math::LookatPoint( m_eyePt, m_directionH, m_directionV, 50.0f );
-
-    if ( m_terrain->AdjustToFloor(lookatPt, true))
-        lookatPt.y += m_heightLookat;
-
-    SetViewTime(m_eyePt, lookatPt, event.rTime);
-
-    return true;
-}
-
 bool CCamera::EventFrameDialog(const Event &event)
 {
     return true;
@@ -1359,29 +1269,15 @@ bool CCamera::EventFrameDialog(const Event &event)
 
 bool CCamera::EventFrameBack(const Event &event)
 {
-    ObjectType type;
-    if (m_cameraObj == nullptr)
-        type = OBJECT_NULL;
-    else
-        type = m_cameraObj->GetType();
-
-    // +/-.
-    if (m_input->GetKeyState(INPUT_SLOT_NEAR))
-    {
-        m_backDist -= event.rTime * 30.0f * m_speed;
-        if (m_backDist < m_backMin) m_backDist = m_backMin;
-    }
-    if (m_input->GetKeyState(INPUT_SLOT_AWAY))
-    {
-        m_backDist += event.rTime * 30.0f * m_speed;
-        if (m_backDist > 200.0f) m_backDist = 200.0f;
-    }
+    Math::Vector cameraMove = CalculateCameraMovement(event);
+    m_addDirectionH += cameraMove.x;
+    m_addDirectionV += cameraMove.y;
+    m_backDist += cameraMove.z;
 
-    m_addDirectionH -= m_mouseDelta.x * 2*Math::PI;
     m_addDirectionH = Math::NormAngle(m_addDirectionH);
-    if (m_mouseDelta.Length() > 0)
-        AbortCentering();  // special stops framing
-    m_mouseDelta.LoadZero();
+    m_addDirectionV = Math::NormAngle(m_addDirectionV);
+
+    m_backDist = Math::Clamp(m_backDist, m_backMin, 200.0f);
 
     // Increase the special framework
     float centeringH = 0.0f;
@@ -1423,6 +1319,8 @@ bool CCamera::EventFrameBack(const Event &event)
 
     if (m_cameraObj != nullptr)
     {
+        ObjectType type = m_cameraObj->GetType();
+
         Math::Vector lookatPt = m_cameraObj->GetPosition();
              if (type == OBJECT_BASE ) lookatPt.y += 40.0f;
         else if (type == OBJECT_HUMAN) lookatPt.y +=  1.0f;
@@ -1502,30 +1400,16 @@ bool CCamera::EventFrameBack(const Event &event)
 
 bool CCamera::EventFrameFix(const Event &event)
 {
-    // +/-.
-    if (m_input->GetKeyState(INPUT_SLOT_NEAR))
-    {
-        m_fixDist -= event.rTime * 30.0f * m_speed;
-        if (m_fixDist < 10.0f) m_fixDist = 10.0f;
-    }
-    if (m_input->GetKeyState(INPUT_SLOT_AWAY))
-    {
-        m_fixDist += event.rTime * 30.0f * m_speed;
-        if (m_fixDist > 200.0f) m_fixDist = 200.0f;
-    }
-
-    m_fixDirectionH -= m_mouseDelta.x * 2*Math::PI;
-    if (m_mouseDelta.Length() > 0)
-        AbortCentering();  // special stops framing
-    m_mouseDelta.LoadZero();
+    Math::Vector cameraMove = CalculateCameraMovement(event);
+    m_fixDirectionH += cameraMove.x;
+    m_fixDirectionV += cameraMove.y;
+    m_fixDist += cameraMove.z;
 
-    // Left/Right
-    m_fixDirectionH += event.cameraInput.x * event.rTime * 0.7f * m_speed;
     m_fixDirectionH = Math::NormAngle(m_fixDirectionH);
+    m_fixDirectionV = Math::NormAngle(m_fixDirectionV);
 
-    // Up/Down
-    m_fixDirectionV -= event.cameraInput.y * event.rTime * 0.7f * m_speed;
-    m_fixDirectionV = Math::Min(Math::Max(m_fixDirectionV, -0.5*Math::PI), 0.25*Math::PI);
+    m_fixDirectionV = Math::Clamp(m_fixDirectionV, -0.5f*Math::PI, 0.25f*Math::PI);
+    m_fixDist = Math::Clamp(m_fixDist, 10.0f, 200.0f);
 
     if (m_cameraObj != nullptr)
     {
@@ -1551,8 +1435,9 @@ bool CCamera::EventFrameFix(const Event &event)
 
 bool CCamera::EventFrameExplo(const Event &event)
 {
-    m_directionH -= m_mouseDelta.x * 2*Math::PI;
-    m_mouseDelta.LoadZero();
+    Math::Vector cameraMove = CalculateCameraMovement(event);
+    m_directionH += cameraMove.x;
+    m_directionH = Math::NormAngle(m_directionH);
 
     m_terrain->AdjustToBounds(m_eyePt, 10.0f);
 
@@ -1609,34 +1494,15 @@ bool CCamera::EventFrameVisit(const Event &event)
 {
     m_visitTime += event.rTime;
 
-    // +/-.
-    if (m_input->GetKeyState(INPUT_SLOT_NEAR))
-    {
-        m_visitDist -= event.rTime * 50.0f * m_speed;
-        if (m_visitDist < 20.0f) m_visitDist = 20.0f;
-    }
-    if (m_input->GetKeyState(INPUT_SLOT_AWAY))
-    {
-        m_visitDist += event.rTime * 50.0f * m_speed;
-        if (m_visitDist > 200.0f) m_visitDist = 200.0f;
-    }
+    Math::Vector cameraMove = CalculateCameraMovement(event);
 
-    // PageUp/Down.
-    if (m_input->GetKeyState(INPUT_SLOT_CAMERA_UP))
-    {
-        m_visitDirectionV -= event.rTime * 1.0f * m_speed;
-        if (m_visitDirectionV < -Math::PI * 0.40f) m_visitDirectionV = -Math::PI * 0.40f;
-    }
-    if (m_input->GetKeyState(INPUT_SLOT_CAMERA_DOWN))
-    {
-        m_visitDirectionV += event.rTime * 1.0f * m_speed;
-        if (m_visitDirectionV > 0.0f ) m_visitDirectionV = 0.0f;
-    }
+    // ZoomIn/ZoomOut
+    m_visitDist += cameraMove.z;
+    m_visitDist = Math::Clamp(m_visitDist, 20.0f, 200.0f);
 
-    m_visitDist -= m_mouseDelta.y * 100.0f * m_speed;
-    m_mouseDelta.LoadZero();
-    if (m_visitDist <  20.0f)  m_visitDist =  20.0f;
-    if (m_visitDist > 200.0f)  m_visitDist = 200.0f;
+    // Up/Down
+    m_visitDirectionV += cameraMove.y;
+    m_visitDirectionV = Math::Clamp(m_visitDirectionV, -Math::PI * 0.40f, 0.0f);
 
     float angleH = (m_visitTime / 10.0f) * (Math::PI * 2.0f);
     float angleV = m_visitDirectionV;
@@ -1726,4 +1592,38 @@ void CCamera::SetCameraSpeed(float speed)
     m_speed = speed;
 }
 
+Math::Vector CCamera::CalculateCameraMovement(const Event &event, bool keysAllowed)
+{
+    Math::Vector delta;
+
+    delta.x += m_mouseDelta.x * 2*Math::PI;
+    delta.y -= m_mouseDelta.y * Math::PI;
+    m_mouseDelta.LoadZero();
+
+    delta.z += m_mouseWheelDelta * 8.0f;
+    m_mouseWheelDelta = 0.0f;
+
+    if (keysAllowed)
+    {
+        delta.x += event.cameraInput.x * event.rTime * 0.5f * m_speed;
+        delta.y -= event.cameraInput.y * event.rTime * 0.5f * m_speed;
+
+        if (m_cameraObj == nullptr)
+        {
+            delta.x += event.motionInput.x * event.rTime * 0.5f * m_speed;
+            delta.y -= event.motionInput.y * event.rTime * 0.5f * m_speed;
+        }
+
+        if (m_input->GetKeyState(INPUT_SLOT_NEAR))
+            delta.z -= event.rTime * 20.0f * m_speed;
+        if (m_input->GetKeyState(INPUT_SLOT_AWAY))
+            delta.z += event.rTime * 20.0f * m_speed;
+    }
+
+    if (delta.Length() > 0)
+        AbortCentering();  // special stops framing
+
+    return delta;
+}
+
 }
diff --git a/src/graphics/engine/camera.h b/src/graphics/engine/camera.h
index f00332a..8d7386f 100644
--- a/src/graphics/engine/camera.h
+++ b/src/graphics/engine/camera.h
@@ -144,11 +144,11 @@ public:
     CObject*    GetControllingObject();
 
     //! Change the type of camera
-    void            SetType(CameraType type);
-    CameraType GetType();
+    void        SetType(CameraType type);
+    CameraType  GetType();
 
     //! Management of the smoothing mode
-    void              SetSmooth(CameraSmooth type);
+    void         SetSmooth(CameraSmooth type);
     CameraSmooth GetSmooth();
 
     //! Management of the setback distance
@@ -223,9 +223,7 @@ protected:
     //! Changes the camera according to the time elapsed
     bool        EventFrame(const Event &event);
     //! Moves the point of view
-    bool        EventFrameFree(const Event &event);
-    //! Moves the point of view
-    bool        EventFrameEdit(const Event &event);
+    bool        EventFrameFree(const Event &event, bool keysAllowed);
     //! Moves the point of view
     bool        EventFrameDialog(const Event &event);
     //! Moves the point of view
@@ -264,6 +262,13 @@ protected:
     //! Advanced overlay effect in the foreground
     void        OverFrame(const Event &event);
 
+    /**
+     * \brief Calculate camera movement (from user inputs) to apply
+     * \return Math::Vector where x, y represent respectively horizontal and vertical angle change in radians and z represents zoom (distance change)
+     * \remarks Should not be called more often than once every EVENT_FRAME
+     **/
+    Math::Vector CalculateCameraMovement(const Event &event, bool keysAllowed = true);
+
 protected:
     CEngine*     m_engine;
     CRobotMain*  m_main;
@@ -339,15 +344,13 @@ protected:
     //! CAM_TYPE_VISIT: direction
     float        m_visitDirectionV;
 
-    //! CAM_TYPE_EDIT: height
-    float        m_editHeight;
-
     float        m_remotePan;
 
     //! Last known mouse position, used to calculate change since last frame
     Math::Point  m_mousePos = Math::Point(0.5f, 0.5f);
     Math::Point  m_mouseDelta = Math::Point(0.0f, 0.0f);
     Math::Point  m_mouseDeltaEdge = Math::Point(0.0f, 0.0f);
+    float        m_mouseWheelDelta = 0.0f;
 
     CenteringPhase m_centeringPhase;
     float       m_centeringAngleH;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list