diff --git a/3b_CameraControl/qcamera3d.cpp b/3b_CameraControl/qcamera3d.cpp index 98bc4bd..f62f775 100644 --- a/3b_CameraControl/qcamera3d.cpp +++ b/3b_CameraControl/qcamera3d.cpp @@ -1,9 +1,9 @@ #include "qcamera3d.h" #include -QCamera3D::QCamera3D() : m_dirty(true) -{ -} +const QVector3D QCamera3D::LocalForward(0.0f, 0.0f, -1.0f); +const QVector3D QCamera3D::LocalUp(0.0f, 1.0f, 0.0f); +const QVector3D QCamera3D::LocalRight(1.0f, 0.0f, 0.0f); // Transform By (Add/Scale) void QCamera3D::translate(const QVector3D &dt) @@ -47,17 +47,17 @@ const QMatrix4x4 &QCamera3D::toMatrix() // Queries QVector3D QCamera3D::forward() const { - return m_rotation.rotatedVector(QVector3D(0.0f, 0.0f, -1.0f)); + return m_rotation.rotatedVector(LocalForward); } -QVector3D QCamera3D::right() const +QVector3D QCamera3D::up() const { - return m_rotation.rotatedVector(QVector3D(1.0f, 0.0f, 0.0f)); + return m_rotation.rotatedVector(LocalUp); } -QVector3D QCamera3D::up() const +QVector3D QCamera3D::right() const { - return m_rotation.rotatedVector(QVector3D(0.0f, 1.0f, 0.0f)); + return m_rotation.rotatedVector(LocalRight); } // Qt Streams diff --git a/3b_CameraControl/qcamera3d.h b/3b_CameraControl/qcamera3d.h index 7144a7c..e3f6c24 100644 --- a/3b_CameraControl/qcamera3d.h +++ b/3b_CameraControl/qcamera3d.h @@ -6,6 +6,12 @@ class QCamera3D { public: + + // Constants + static const QVector3D LocalForward; + static const QVector3D LocalUp; + static const QVector3D LocalRight; + // Constructors QCamera3D(); @@ -30,8 +36,9 @@ class QCamera3D // Queries QVector3D forward() const; - QVector3D right() const; QVector3D up() const; + QVector3D right() const; + private: bool m_dirty; QVector3D m_translation; @@ -46,6 +53,9 @@ class QCamera3D Q_DECLARE_TYPEINFO(QCamera3D, Q_MOVABLE_TYPE); +// Constructors +inline QCamera3D::QCamera3D() : m_dirty(true) {} + // Transform By (Add/Scale) inline void QCamera3D::translate(float dx, float dy,float dz) { translate(QVector3D(dx, dy, dz)); } inline void QCamera3D::rotate(float angle, const QVector3D &axis) { rotate(QQuaternion::fromAxisAndAngle(axis, angle)); } diff --git a/3b_CameraControl/qinput.cpp b/3b_CameraControl/qinput.cpp index 0a5880e..09d8141 100644 --- a/3b_CameraControl/qinput.cpp +++ b/3b_CameraControl/qinput.cpp @@ -1,28 +1,34 @@ #include "QInput.h" #include -#include #include -#include +#include /******************************************************************************* * Static Helper Structs ******************************************************************************/ -struct KeyInstance : std::pair +template +struct InputInstance : std::pair { - inline explicit KeyInstance(int k) : std::pair(k, QInput::InputInvalid) {} - inline KeyInstance(int k, QInput::InputState s) : std::pair(k, s) {} + typedef std::pair base_class; + inline InputInstance(T value) : base_class(value, QInput::InputInvalid) {} + inline InputInstance(T value, QInput::InputState state) : base_class(value, state) {} + inline bool operator==(const InputInstance &rhs) const + { + return first == rhs.first; + } }; -typedef std::vector KeyContainer; -static KeyContainer sg_keyInstances; -struct ButtonInstance : std::pair -{ - inline explicit ButtonInstance(Qt::MouseButton btn) : std::pair(btn, QInput::InputInvalid) {} - inline ButtonInstance(Qt::MouseButton btn, QInput::InputState s) : std::pair(btn, s) {} -}; +// Instance types +typedef InputInstance KeyInstance; +typedef InputInstance ButtonInstance; + +// Container types +typedef std::vector KeyContainer; typedef std::vector ButtonContainer; + +// Globals +static KeyContainer sg_keyInstances; static ButtonContainer sg_buttonInstances; -static QPoint sg_mousePosition; static QPoint sg_mouseCurrPosition; static QPoint sg_mousePrevPosition; static QPoint sg_mouseDelta; @@ -30,30 +36,53 @@ static QPoint sg_mouseDelta; /******************************************************************************* * Static Helper Fucntions ******************************************************************************/ -static inline KeyContainer::iterator FindKey(Qt::Key k) +static inline KeyContainer::iterator FindKey(Qt::Key value) { - KeyContainer::iterator it = sg_keyInstances.begin(); - KeyContainer::iterator end = sg_keyInstances.end(); - while (it != end) - { - if (it->first == k) - return it; - ++it; - } - return it; + return std::find(sg_keyInstances.begin(), sg_keyInstances.end(), value); +} + +static inline ButtonContainer::iterator FindButton(Qt::MouseButton value) +{ + return std::find(sg_buttonInstances.begin(), sg_buttonInstances.end(), value); } -static inline ButtonContainer::iterator FindButton(Qt::MouseButton btn) +template +static inline void UpdateStates(TPair &instance) { - ButtonContainer::iterator it = sg_buttonInstances.begin(); - ButtonContainer::iterator end = sg_buttonInstances.end(); - while (it != end) + switch (instance.second) { - if (it->first == btn) - return it; - ++it; + case QInput::InputRegistered: + instance.second = QInput::InputTriggered; + break; + case QInput::InputTriggered: + instance.second = QInput::InputPressed; + break; + case QInput::InputUnregistered: + instance.second = QInput::InputReleased; + break; + default: + break; } - return it; +} + +template +static inline bool CheckReleased(const TPair &instance) +{ + return instance.second == QInput::InputReleased; +} + +template +static inline void Update(Container &container) +{ + typedef typename Container::iterator Iter; + typedef typename Container::value_type TPair; + + // Remove old data + Iter remove = std::remove_if(container.begin(), container.end(), &CheckReleased); + container.erase(remove, container.end()); + + // Update existing data + std::for_each(container.begin(), container.end(), &UpdateStates); } /******************************************************************************* @@ -73,7 +102,7 @@ QInput::InputState QInput::buttonState(Qt::MouseButton k) QPoint QInput::mousePosition() { - return sg_mousePosition; + return QCursor::pos(); } QPoint QInput::mouseDelta() @@ -83,62 +112,23 @@ QPoint QInput::mouseDelta() void QInput::update() { + // Update Mouse Delta sg_mousePrevPosition = sg_mouseCurrPosition; - sg_mouseCurrPosition = sg_mousePosition; + sg_mouseCurrPosition = QCursor::pos(); sg_mouseDelta = sg_mouseCurrPosition - sg_mousePrevPosition; - for (KeyContainer::iterator it = sg_keyInstances.begin(); it != sg_keyInstances.end();) - { - switch (it->second) - { - case InputRegistered: - it->second = InputTriggered; - ++it; - break; - case InputTriggered: - it->second = InputPressed; - ++it; - break; - case InputUnregistered: - it->second = InputReleased; - ++it; - break; - case InputReleased: - it = sg_keyInstances.erase(it); - break; - default: - ++it; - break; - } - } - for (ButtonContainer::iterator it = sg_buttonInstances.begin(); it != sg_buttonInstances.end();) - { - switch (it->second) - { - case InputRegistered: - it->second = InputTriggered; - ++it; - break; - case InputTriggered: - it->second = InputPressed; - ++it; - break; - case InputUnregistered: - it->second = InputReleased; - ++it; - break; - case InputReleased: - it = sg_buttonInstances.erase(it); - break; - default: - ++it; - break; - } - } + + // Update KeyState values + Update(sg_buttonInstances); + Update(sg_keyInstances); } void QInput::registerKeyPress(int k) { - sg_keyInstances.push_back(KeyInstance(k, InputRegistered)); + KeyContainer::iterator it = FindKey((Qt::Key)k); + if (it == sg_keyInstances.end()) + { + sg_keyInstances.push_back(KeyInstance((Qt::Key)k, InputRegistered)); + } } void QInput::registerKeyRelease(int k) @@ -152,7 +142,11 @@ void QInput::registerKeyRelease(int k) void QInput::registerMousePress(Qt::MouseButton btn) { - sg_buttonInstances.push_back(ButtonInstance(btn, InputRegistered)); + ButtonContainer::iterator it = FindButton(btn); + if (it == sg_buttonInstances.end()) + { + sg_buttonInstances.push_back(ButtonInstance(btn, InputRegistered)); + } } void QInput::registerMouseRelease(Qt::MouseButton btn) @@ -164,11 +158,6 @@ void QInput::registerMouseRelease(Qt::MouseButton btn) } } -void QInput::registerMouseMovement(const QPoint &pos) -{ - sg_mousePosition = pos; -} - void QInput::reset() { sg_keyInstances.clear(); diff --git a/3b_CameraControl/qinput.h b/3b_CameraControl/qinput.h index b157c25..54116d6 100644 --- a/3b_CameraControl/qinput.h +++ b/3b_CameraControl/qinput.h @@ -31,14 +31,14 @@ class QInput static QPoint mousePosition(); static QPoint mouseDelta(); - // State updating private: + + // State updating static void update(); static void registerKeyPress(int k); static void registerKeyRelease(int k); static void registerMousePress(Qt::MouseButton btn); static void registerMouseRelease(Qt::MouseButton btn); - static void registerMouseMovement(const QPoint &pos); static void reset(); friend class Window; }; diff --git a/3b_CameraControl/qtransform3d.cpp b/3b_CameraControl/qtransform3d.cpp index de4094e..ed994da 100644 --- a/3b_CameraControl/qtransform3d.cpp +++ b/3b_CameraControl/qtransform3d.cpp @@ -1,6 +1,10 @@ #include "qtransform3d.h" #include +const QVector3D QTransform3D::LocalForward(0.0f, 0.0f, 1.0f); +const QVector3D QTransform3D::LocalUp(0.0f, 1.0f, 0.0f); +const QVector3D QTransform3D::LocalRight(1.0f, 0.0f, 0.0f); + // Transform By (Add/Scale) void QTransform3D::translate(const QVector3D &dt) { @@ -62,17 +66,17 @@ const QMatrix4x4 &QTransform3D::toMatrix() // Queries QVector3D QTransform3D::forward() const { - return m_rotation.rotatedVector(QVector3D(0.0f, 0.0f, -1.0f)); + return m_rotation.rotatedVector(LocalForward); } -QVector3D QTransform3D::right() const +QVector3D QTransform3D::up() const { - return m_rotation.rotatedVector(QVector3D(1.0f, 0.0f, 0.0f)); + return m_rotation.rotatedVector(LocalUp); } -QVector3D QTransform3D::up() const +QVector3D QTransform3D::right() const { - return m_rotation.rotatedVector(QVector3D(0.0f, 1.0f, 0.0f)); + return m_rotation.rotatedVector(LocalRight); } // Qt Streams diff --git a/3b_CameraControl/qtransform3d.h b/3b_CameraControl/qtransform3d.h index 3baa382..c245f27 100644 --- a/3b_CameraControl/qtransform3d.h +++ b/3b_CameraControl/qtransform3d.h @@ -8,6 +8,12 @@ class QTransform3D { public: + + // Constants + static const QVector3D LocalForward; + static const QVector3D LocalUp; + static const QVector3D LocalRight; + // Constructors QTransform3D(); @@ -42,8 +48,8 @@ class QTransform3D // Queries QVector3D forward() const; - QVector3D right() const; QVector3D up() const; + QVector3D right() const; private: bool m_dirty; diff --git a/3b_CameraControl/window.cpp b/3b_CameraControl/window.cpp index 0992107..8a8b882 100644 --- a/3b_CameraControl/window.cpp +++ b/3b_CameraControl/window.cpp @@ -5,7 +5,6 @@ #include #include "qvertex.h" #include "qinput.h" -#include // Front Verticies #define QVERTEX_FTR QVertex( QVector3D( 0.5f, 0.5f, 0.5f), QVector3D( 1.0f, 0.0f, 0.0f ) ) @@ -147,7 +146,7 @@ void Window::update() // Camera Transformation if (QInput::buttonPressed(Qt::RightButton)) { - m_camera.rotate(-0.5f * QInput::mouseDelta().x(), QVector3D(0.0f, 1.0f, 0.0f)); + m_camera.rotate(-0.5f * QInput::mouseDelta().x(), QCamera3D::LocalUp); m_camera.rotate(-0.5f * QInput::mouseDelta().y(), m_camera.right()); if (QInput::keyPressed(Qt::Key_W)) { @@ -208,11 +207,6 @@ void Window::mouseReleaseEvent(QMouseEvent *event) QInput::registerMouseRelease(event->button()); } -void Window::mouseMoveEvent(QMouseEvent *event) -{ - QInput::registerMouseMovement(event->pos()); -} - /******************************************************************************* * Private Helpers ******************************************************************************/ diff --git a/3b_CameraControl/window.h b/3b_CameraControl/window.h index 006ab42..218f99a 100644 --- a/3b_CameraControl/window.h +++ b/3b_CameraControl/window.h @@ -31,7 +31,6 @@ protected slots: void keyReleaseEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); private: // OpenGL State Information