source: projectionDesigner/trunk/projdesigner/src/math/TransformMatrix.cpp @ 245

Last change on this file since 245 was 4, checked in by Torben Dannhauer, 15 years ago
File size: 4.2 KB
Line 
1#include "math/TransformMatrix.h"
2
3using namespace projection;
4using namespace gmtl;
5
6/**
7 * Constructor.
8 *
9 * Default transform matrix value is identity matrix.
10 */
11TransformMatrix::TransformMatrix()
12{
13                reset ();
14}
15
16/**
17 * Destructor.
18 */
19TransformMatrix::~TransformMatrix()
20{
21}
22
23/**
24 * Retrieve the trasform matrix.
25 *
26 * @return Trasform matrix.
27 */
28gmtl::Matrix44f TransformMatrix::getMatrix() const
29{
30    return makeTrans<Matrix44f>(m_pos) *
31        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[0]), Vec3f(0.0f, 1.0f, 0.0f))) *
32        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[1]), Vec3f(1.0f, 0.0f, 0.0f))) *
33        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[2]), Vec3f(0.0f, 0.0f, 1.0f))) *
34        makeScale<Matrix44f>(m_scale);
35}
36
37/**
38 * Retrieve the trasform matrix without scaling.
39 *
40 * @return Trasform matrix without scaling.
41 */
42gmtl::Matrix44f TransformMatrix::getMatrixWOScaling() const
43{
44    return makeTrans<Matrix44f>(m_pos) *
45        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[0]), Vec3f(0.0f, 1.0f, 0.0f))) *
46        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[1]), Vec3f(1.0f, 0.0f, 0.0f))) *
47        makeRot<Matrix44f>(AxisAnglef(Math::deg2Rad(m_rot[2]), Vec3f(0.0f, 0.0f, 1.0f)));
48}
49
50/**
51 * Retrieve transform parameters like 'Rotate 45 1 0 0;'.
52 *
53 * @param numSpaces Number of space characters for indent.
54 * @return Transform params.
55 */
56QString TransformMatrix::getParams(int space) const
57{
58    QString spc;
59    spc.fill(' ', space);
60
61    QString result;
62    if (m_scale != Vec3f(1.0f, 1.0f, 1.0f))
63        result += spc + QString("Scale %1 %2 %3;\n").arg(m_scale[0]).arg(m_scale[1]).arg(m_scale[2]);
64    if (m_rot[2] != 0.0)
65        result += spc + QString("Rotate %1 0 0 1;\n").arg(m_rot[2]);
66    if (m_rot[1] != 0.0)
67        result += spc + QString("Rotate %1 1 0 0;\n").arg(m_rot[1]);
68    if (m_rot[0] != 0.0)
69        result += spc + QString("Rotate %1 0 1 0;\n").arg(m_rot[0]);
70    if (m_pos != Vec3f(0.0f, 0.0f, 0.0f))
71        result += spc + QString("Translate %1 %2 %3;\n").arg(m_pos[0]).arg(m_pos[1]).arg(m_pos[2]);
72
73    return result;
74}
75
76/**
77 * Restore the transform matrix from XML data.
78 *
79 * @param element Parent XML element of the transform matrix data.
80 */
81void TransformMatrix::initFromDOMElement(const QDomElement& element)
82{
83    QDomElement pos = element.firstChildElement("position");
84    m_pos[0] = pos.attribute("x").toFloat();
85    m_pos[1] = pos.attribute("y").toFloat();
86    m_pos[2] = pos.attribute("z").toFloat();
87
88    QDomElement rot = element.firstChildElement("rotation");
89    m_rot[0] = rot.attribute("h").toFloat();
90    m_rot[1] = rot.attribute("p").toFloat();
91    m_rot[2] = rot.attribute("r").toFloat();
92
93    if (!element.firstChildElement("scaling").isNull())
94    {
95        QDomElement scale = element.firstChildElement("scaling");
96        m_scale[0] = scale.attribute("x").toFloat();
97        m_scale[1] = scale.attribute("y").toFloat();
98        m_scale[2] = scale.attribute("z").toFloat();
99    }
100}
101
102/**
103 * Store the current transform matrix as XML data.
104 *
105 * @param name XML node name of the data.
106 * @param doc XML document to store the data.
107 * @return Current transform matrix data as XML data.
108 */
109QDomElement TransformMatrix::domElement(const QString& name, QDomDocument& doc) const
110{
111    QDomElement de = doc.createElement(name);
112
113    QDomElement pos = doc.createElement("position");
114    pos.setAttribute("x", QString::number(m_pos[0]));
115    pos.setAttribute("y", QString::number(m_pos[1]));
116    pos.setAttribute("z", QString::number(m_pos[2]));
117    de.appendChild(pos);
118
119    QDomElement rot = doc.createElement("rotation");
120    rot.setAttribute("h", QString::number(m_rot[0]));
121    rot.setAttribute("p", QString::number(m_rot[1]));
122    rot.setAttribute("r", QString::number(m_rot[2]));
123    de.appendChild(rot);
124
125    QDomElement scale = doc.createElement("scaling");
126    scale.setAttribute("x", QString::number(m_scale[0]));
127    scale.setAttribute("y", QString::number(m_scale[1]));
128    scale.setAttribute("z", QString::number(m_scale[2]));
129    de.appendChild(scale);
130
131    return de;
132}
133
134/**
135 * Reset the matrix.
136 */
137void TransformMatrix::reset()
138{
139    m_pos.set(0.0f, 0.0f, 0.0f);
140    m_rot.set(0.0f, 0.0f, 0.0f);
141    m_scale.set(1.0f, 1.0f, 1.0f);
142    m_bUseScale = true;
143}
Note: See TracBrowser for help on using the repository browser.