Skip to content

Commit

Permalink
Refactoring and fixes applied to Project 3b.
Browse files Browse the repository at this point in the history
- Simplified QCamera3D by adding Local* coordinate vectors.
- Refactored QInput to use STL instead of recreating find.
- Added same constant static orientation Local* coordinate vectors to
  QTransform3D.
- Cleaned up implementation of QInput/QCamera3D within Window.
  • Loading branch information
TReed0803 committed Jan 16, 2015
1 parent 022a4d6 commit ccc0bc2
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 113 deletions.
16 changes: 8 additions & 8 deletions 3b_CameraControl/qcamera3d.cpp
@@ -1,9 +1,9 @@
#include "qcamera3d.h"
#include <QDebug>

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)
Expand Down Expand Up @@ -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
Expand Down
12 changes: 11 additions & 1 deletion 3b_CameraControl/qcamera3d.h
Expand Up @@ -6,6 +6,12 @@
class QCamera3D
{
public:

// Constants
static const QVector3D LocalForward;
static const QVector3D LocalUp;
static const QVector3D LocalRight;

// Constructors
QCamera3D();

Expand All @@ -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;
Expand All @@ -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)); }
Expand Down
165 changes: 77 additions & 88 deletions 3b_CameraControl/qinput.cpp
@@ -1,59 +1,88 @@
#include "QInput.h"
#include <QCursor>
#include <algorithm>
#include <vector>
#include <limits>
#include <algorithm>

/*******************************************************************************
* Static Helper Structs
******************************************************************************/
struct KeyInstance : std::pair<int, QInput::InputState>
template <typename T>
struct InputInstance : std::pair<T, QInput::InputState>
{
inline explicit KeyInstance(int k) : std::pair<int, QInput::InputState>(k, QInput::InputInvalid) {}
inline KeyInstance(int k, QInput::InputState s) : std::pair<int, QInput::InputState>(k, s) {}
typedef std::pair<T, QInput::InputState> 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<KeyInstance> KeyContainer;
static KeyContainer sg_keyInstances;

struct ButtonInstance : std::pair<Qt::MouseButton, QInput::InputState>
{
inline explicit ButtonInstance(Qt::MouseButton btn) : std::pair<Qt::MouseButton, QInput::InputState>(btn, QInput::InputInvalid) {}
inline ButtonInstance(Qt::MouseButton btn, QInput::InputState s) : std::pair<Qt::MouseButton, QInput::InputState>(btn, s) {}
};
// Instance types
typedef InputInstance<Qt::Key> KeyInstance;
typedef InputInstance<Qt::MouseButton> ButtonInstance;

// Container types
typedef std::vector<KeyInstance> KeyContainer;
typedef std::vector<ButtonInstance> 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;

/*******************************************************************************
* 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 <typename TPair>
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 <typename TPair>
static inline bool CheckReleased(const TPair &instance)
{
return instance.second == QInput::InputReleased;
}

template <typename Container>
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<TPair>);
container.erase(remove, container.end());

// Update existing data
std::for_each(container.begin(), container.end(), &UpdateStates<TPair>);
}

/*******************************************************************************
Expand All @@ -73,7 +102,7 @@ QInput::InputState QInput::buttonState(Qt::MouseButton k)

QPoint QInput::mousePosition()
{
return sg_mousePosition;
return QCursor::pos();
}

QPoint QInput::mouseDelta()
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions 3b_CameraControl/qinput.h
Expand Up @@ -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;
};
Expand Down
14 changes: 9 additions & 5 deletions 3b_CameraControl/qtransform3d.cpp
@@ -1,6 +1,10 @@
#include "qtransform3d.h"
#include <QDebug>

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)
{
Expand Down Expand Up @@ -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
Expand Down
8 changes: 7 additions & 1 deletion 3b_CameraControl/qtransform3d.h
Expand Up @@ -8,6 +8,12 @@
class QTransform3D
{
public:

// Constants
static const QVector3D LocalForward;
static const QVector3D LocalUp;
static const QVector3D LocalRight;

// Constructors
QTransform3D();

Expand Down Expand Up @@ -42,8 +48,8 @@ class QTransform3D

// Queries
QVector3D forward() const;
QVector3D right() const;
QVector3D up() const;
QVector3D right() const;

private:
bool m_dirty;
Expand Down

0 comments on commit ccc0bc2

Please sign in to comment.