From aabb86bbe522e8a14aa43378d0d858a419f5f8d7 Mon Sep 17 00:00:00 2001
From: ganthern <nils.ganther@stud.hs-hannover.de>
Date: Wed, 24 Mar 2021 12:17:37 +0100
Subject: [PATCH] add mouse wheel zoom

---
 CgEvents/CgWheelEvent.cpp       | 35 +++++++++++++++++++++++++++++++++
 CgEvents/CgWheelEvent.h         | 29 +++++++++++++++++++++++++++
 CgQtViewer/CgQtGui.cpp          |  7 +++++++
 CgQtViewer/CgQtGui.h            |  1 +
 CgSceneGraph/CgSceneControl.cpp | 14 +++++++++++--
 ExerciseVC.pro                  |  2 ++
 6 files changed, 86 insertions(+), 2 deletions(-)
 create mode 100644 CgEvents/CgWheelEvent.cpp
 create mode 100644 CgEvents/CgWheelEvent.h

diff --git a/CgEvents/CgWheelEvent.cpp b/CgEvents/CgWheelEvent.cpp
new file mode 100644
index 0000000..0826a4b
--- /dev/null
+++ b/CgEvents/CgWheelEvent.cpp
@@ -0,0 +1,35 @@
+#include "CgWheelEvent.h"
+
+
+CgWheelEvent::CgWheelEvent(Cg::EventType type, float numDegrees)
+{
+    m_type=type;
+    m_numDegrees = numDegrees;
+}
+
+CgWheelEvent::~CgWheelEvent()
+{
+
+}
+
+Cg::EventType  CgWheelEvent::getType()
+{
+    return m_type;
+}
+
+CgBaseEvent* CgWheelEvent::clone()
+{
+    return new CgWheelEvent(m_type,m_numDegrees);
+}
+
+std::ostream& operator<<(std::ostream& os,const CgWheelEvent& e)
+{
+    os << "Wheel-Event of Type: "<< e.m_type <<", Amount: " << e.numDegrees();
+    return os;
+}
+
+float CgWheelEvent::numDegrees() const
+{
+  return m_numDegrees;
+}
+
diff --git a/CgEvents/CgWheelEvent.h b/CgEvents/CgWheelEvent.h
new file mode 100644
index 0000000..5b5e4d0
--- /dev/null
+++ b/CgEvents/CgWheelEvent.h
@@ -0,0 +1,29 @@
+#ifndef CGWHEELEVENT
+#define CGWHEELEVENT
+
+#include "../CgBase/CgBaseEvent.h"
+#include "glm/glm.hpp"
+#include <iostream>
+
+class CgWheelEvent: public CgBaseEvent
+{
+public:
+
+    CgWheelEvent(Cg::EventType type, float numDegrees);
+    ~CgWheelEvent();
+
+    Cg::EventType  getType();
+    CgBaseEvent* clone();
+
+    float numDegrees() const;
+
+    friend std::ostream& operator <<(std::ostream& os, const CgWheelEvent& e);
+
+
+private:
+
+    Cg::EventType m_type;
+    float m_numDegrees;
+};
+
+#endif // CGWHEELEVENT
\ No newline at end of file
diff --git a/CgQtViewer/CgQtGui.cpp b/CgQtViewer/CgQtGui.cpp
index ee9858f..25ec6b1 100644
--- a/CgQtViewer/CgQtGui.cpp
+++ b/CgQtViewer/CgQtGui.cpp
@@ -12,6 +12,7 @@
 #include "../CgEvents/CgTrackballEvent.h"
 #include "../CgEvents/CgSplatEvent.h"
 #include "../CgEvents/CgPickRayEvent.h"
+#include "../CgEvents/CgWheelEvent.h"
 
 #include <QSlider>
 #include <QVBoxLayout>
@@ -355,6 +356,12 @@ void CgQtGui::mouseEvent(QMouseEvent* event)
 
 }
 
+void CgQtGui::wheelEvent(QWheelEvent* event)
+{
+    CgBaseEvent* e = new CgWheelEvent(Cg::CgMouseWheel, event->angleDelta().y() / 8.0);
+    notifyObserver(e);
+}
+
 void CgQtGui::keyPressEvent(QKeyEvent *event)
 {
    CgBaseEvent* e= new CgKeyEvent(Cg::CgKeyPressEvent,(Cg::Key)event->key(),(Cg::KeyboardModifiers)event->nativeModifiers(),event->text().toStdString());
diff --git a/CgQtViewer/CgQtGui.h b/CgQtViewer/CgQtGui.h
index ba1dd68..8a51e74 100644
--- a/CgQtViewer/CgQtGui.h
+++ b/CgQtViewer/CgQtGui.h
@@ -113,6 +113,7 @@ private slots:
 
     /* slots to catch events directly from renderer */
     void mouseEvent(QMouseEvent* event);
+    void wheelEvent(QWheelEvent* event);
     void viewportChanged(int,int);
     void slotTrackballChanged();
 
diff --git a/CgSceneGraph/CgSceneControl.cpp b/CgSceneGraph/CgSceneControl.cpp
index 60d9168..6eaa3d8 100644
--- a/CgSceneGraph/CgSceneControl.cpp
+++ b/CgSceneGraph/CgSceneControl.cpp
@@ -3,6 +3,7 @@
 #include "CgSceneControl.h"
 #include "CgBase/CgEnums.h"
 #include "CgEvents/CgMouseEvent.h"
+#include "CgEvents/CgWheelEvent.h"
 #include "CgEvents/CgKeyEvent.h"
 #include "CgEvents/CgWindowResizeEvent.h"
 #include "CgEvents/CgLoadMeshEvent.h"
@@ -168,6 +169,17 @@ void CgSceneControl::handleEvent(CgBaseEvent* e)
         CgMouseEvent* ev = (CgMouseEvent*)e;
         if(ev->button()==Cg::RightButton)
             calculatePickRay((double)ev->x(),(double)ev->y());
+    } 
+
+    if(e->getType() & Cg::CgMouseWheel) 
+    {
+      CgWheelEvent* ev = (CgWheelEvent*)e;
+      //scaling of scene, i.e. of the one single object
+      float scaleFactor = 1.0f + 0.01f * ev->numDegrees();
+      glm::mat4 scalemat = glm::mat4(1.);
+      scalemat = glm::scale(scalemat, glm::vec3(scaleFactor,scaleFactor,scaleFactor));
+      m_current_transformation = m_current_transformation * scalemat;
+      m_renderer->redraw();
     }
 
     if(e->getType() & Cg::CgTrackballEvent)
@@ -307,8 +319,6 @@ void CgSceneControl::handleEvent(CgBaseEvent* e)
 
     // delete event
     delete e;
-
-
 }
 
 
diff --git a/ExerciseVC.pro b/ExerciseVC.pro
index df9ff8d..4311c92 100644
--- a/ExerciseVC.pro
+++ b/ExerciseVC.pro
@@ -14,6 +14,7 @@ SOURCES += main.cpp \
     CgQtViewer/CgQtGui.cpp \
     CgBase/CgObservable.cpp \
     CgEvents/CgMouseEvent.cpp \
+    CgEvents/CgWheelEvent.cpp \
     CgQtViewer/CgQtMainApplication.cpp \
     CgSceneGraph/CgPointCloud.cpp \
     CgSceneGraph/CgPolyLine.cpp \
@@ -42,6 +43,7 @@ HEADERS += \
     CgBase/CgBaseEvent.h \
     CgBase/CgEnums.h \
     CgEvents/CgMouseEvent.h \
+    CgEvents/CgWheelEvent.h \
     CgQtViewer/CgQtMainApplication.h \
     CgSceneGraph/CgPointCloud.h \
     CgSceneGraph/CgPolyLine.h \
-- 
GitLab