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