diff --git a/CgEvents/CgWheelEvent.cpp b/CgEvents/CgWheelEvent.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0826a4b635407e59a74cde3861ea03a6aada13ef --- /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 0000000000000000000000000000000000000000..5b5e4d088e87c368e2507f02e7a18ebe004ffd0c --- /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 ee9858faf8af6d3e193e033ff83ae81ec5c370d1..25ec6b15db992bae9bf91ae390f1fb6bf49eac7a 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 ba1dd68d65883ca150db9236542d32c891b25fd1..8a51e74fcb67e3dfdc07f6eb2643233e53bc0ef7 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 60d9168b5566d01203f4b4ff5ec37272704f017a..6eaa3d821f0335ea3ba72e808a023d6ce4e28da1 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 df9ff8dc94c921d09e43913e383dfd06a4c0d981..4311c9226db6d49356decd78597ae982d8aefe4c 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 \