-
Notifications
You must be signed in to change notification settings - Fork 0
/
transform3d.h
102 lines (84 loc) · 3.68 KB
/
transform3d.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef QTRANSFORM3D_H
#define QTRANSFORM3D_H
#include <QVector3D>
#include <QQuaternion>
#include <QMatrix4x4>
class Transform3D
{
public:
// Constants
static const QVector3D LocalForward;
static const QVector3D LocalUp;
static const QVector3D LocalRight;
// Constructors
Transform3D();
// Transform By (Add/Scale)
void translate(const QVector3D &dt);
void translate(float dx, float dy, float dz);
void scale(const QVector3D &ds);
void scale(float dx, float dy, float dz);
void scale(float factor);
void rotate(const QQuaternion &dr);
void rotate(float angle, const QVector3D &axis);
void rotate(float angle, float ax, float ay, float az);
void grow(const QVector3D &ds);
void grow(float dx, float dy, float dz);
void grow(float factor);
// Transform To (Setters)
void setTranslation(const QVector3D &t);
void setTranslation(float x, float y, float z);
void setScale(const QVector3D &s);
void setScale(float x, float y, float z);
void setScale(float k);
void setRotation(const QQuaternion &r);
void setRotation(float angle, const QVector3D &axis);
void setRotation(float angle, float ax, float ay, float az);
// Accessors
const QVector3D& translation() const;
const QVector3D& scale() const;
const QQuaternion& rotation() const;
const QMatrix4x4& toMatrix();
// Queries
QVector3D forward() const;
QVector3D up() const;
QVector3D right() const;
private:
bool m_dirty;
QVector3D m_translation;
QVector3D m_scale;
QQuaternion m_rotation;
QMatrix4x4 m_world;
#ifndef QT_NO_DATASTREAM
friend QDataStream &operator<<(QDataStream &out, const Transform3D &transform);
friend QDataStream &operator>>(QDataStream &in, Transform3D &transform);
#endif
};
Q_DECLARE_TYPEINFO(Transform3D, Q_MOVABLE_TYPE);
inline Transform3D::Transform3D() : m_dirty(true), m_scale(1.0f, 1.0f, 1.0f) {}
// Transform By (Add/Scale)
inline void Transform3D::translate(float dx, float dy,float dz) { translate(QVector3D(dx, dy, dz)); }
inline void Transform3D::scale(float dx, float dy,float dz) { scale(QVector3D(dx, dy, dz)); }
inline void Transform3D::scale(float factor) { scale(QVector3D(factor, factor, factor)); }
inline void Transform3D::rotate(float angle, const QVector3D &axis) { rotate(QQuaternion::fromAxisAndAngle(axis, angle)); }
inline void Transform3D::rotate(float angle, float ax, float ay,float az) { rotate(QQuaternion::fromAxisAndAngle(ax, ay, az, angle)); }
inline void Transform3D::grow(float dx, float dy, float dz) { grow(QVector3D(dx, dy, dz)); }
inline void Transform3D::grow(float factor) { grow(QVector3D(factor, factor, factor)); }
// Transform To (Setters)
inline void Transform3D::setTranslation(float x, float y, float z) { setTranslation(QVector3D(x, y, z)); }
inline void Transform3D::setScale(float x, float y, float z) { setScale(QVector3D(x, y, z)); }
inline void Transform3D::setScale(float k) { setScale(QVector3D(k, k, k)); }
inline void Transform3D::setRotation(float angle, const QVector3D &axis) { setRotation(QQuaternion::fromAxisAndAngle(axis, angle)); }
inline void Transform3D::setRotation(float angle, float ax, float ay, float az) { setRotation(QQuaternion::fromAxisAndAngle(ax, ay, az, angle)); }
// Accessors
inline const QVector3D& Transform3D::translation() const { return m_translation; }
inline const QVector3D& Transform3D::scale() const { return m_scale; }
inline const QQuaternion& Transform3D::rotation() const { return m_rotation; }
// Qt Streams
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const Transform3D &transform);
#endif
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &out, const Transform3D &transform);
QDataStream &operator>>(QDataStream &in, Transform3D &transform);
#endif
#endif // QTRANSFORM3D_H