-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMorphTarget.cpp
More file actions
113 lines (96 loc) · 2.49 KB
/
Copy pathMorphTarget.cpp
File metadata and controls
113 lines (96 loc) · 2.49 KB
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
103
104
105
106
107
108
109
110
111
112
113
#include "MorphTarget.h"
#include <QFile>
#include "Skin.h"
QHash<QString, MorphTarget::loadFunction> MorphTarget::_loadingFunctions = {
{"positions", &MorphTarget::_loadPositions},
{"normals", &MorphTarget::_loadNormals}
};
MorphTarget::MorphTarget(Node *parent) : Node(parent)
{
setName("Morph Target");
setType("Morph Target");
DOF* state = new DOF(DOF::MorphTarget, true);
state->setMin(-2);
state->setMax(2);
state->setValue(0);
setDOF(DOF::MorphTarget, state);
}
MorphTarget::~MorphTarget()
{
}
bool MorphTarget::loadFromFile(const QString &filename)
{
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QFileInfo fileInfo(filename);
BasicTokenizer tokenizer(&file);
if (!_load(tokenizer)) {
deleteChildren();
file.close();
qDebug() << "Invalid file";
return false;
}
QFileInfo info(filename);
setName(info.baseName());
file.close();
return true;
}
void MorphTarget::update(float elapsed)
{
}
void MorphTarget::init()
{
Node::init();
}
void MorphTarget::setSkin(Skin *newSkin)
{
_skin = newSkin;
}
Skin *MorphTarget::skin() const
{
return _skin;
}
const QPair<QVector3D, QVector3D> &MorphTarget::delta(int i) const
{
return _delta.value(i);
}
bool MorphTarget::_load(BasicTokenizer &tokenizer)
{
QString token = tokenizer.nextToken();
while (!token.isEmpty()) {
if (_loadingFunctions.contains(token) && (this->*_loadingFunctions[token])(tokenizer)) {
token = tokenizer.nextToken();
continue;
}
return false;
}
return true;}
bool MorphTarget::_loadPositions(BasicTokenizer &tokenizer)
{
if (!_skin)
return false;
int size = tokenizer.nextInt();
if (tokenizer.nextToken() != "{")
return false;
for (int i = 0; i < size; ++i) {
int id = tokenizer.nextInt();
QVector3D vector = tokenizer.nextVector();
_delta[id].first = vector - _skin->baseVertex(id);
}
return tokenizer.nextToken() == "}";
}
bool MorphTarget::_loadNormals(BasicTokenizer &tokenizer)
{
if (!_skin)
return false;
int size = tokenizer.nextInt();
if (tokenizer.nextToken() != "{")
return false;
for (int i = 0; i < size; ++i) {
int id = tokenizer.nextInt();
QVector3D vector = tokenizer.nextVector();
_delta[id].second = vector - _skin->baseNormal(id);
}
return tokenizer.nextToken() == "}";
}