From fff10375a90a573618d82259bd8984a5cea3ade3 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 19 Sep 2013 15:48:33 -0700 Subject: [PATCH] Map the blendshapes by name. --- interface/src/avatar/BlendFace.cpp | 13 ++--- interface/src/renderer/FBXReader.cpp | 71 +++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/interface/src/avatar/BlendFace.cpp b/interface/src/avatar/BlendFace.cpp index 8280e8b7df..690a278453 100644 --- a/interface/src/avatar/BlendFace.cpp +++ b/interface/src/avatar/BlendFace.cpp @@ -55,7 +55,7 @@ bool BlendFace::render(float alpha) { const vector& coefficients = _owningHead->getBlendshapeCoefficients(); for (int i = 0; i < coefficients.size(); i++) { float coefficient = coefficients[i]; - if (coefficient == 0.0f || i >= _geometry.blendshapes.size()) { + if (coefficient == 0.0f || i >= _geometry.blendshapes.size() || _geometry.blendshapes[i].vertices.isEmpty()) { continue; } const glm::vec3* source = _geometry.blendshapes[i].vertices.constData(); @@ -147,8 +147,9 @@ void BlendFace::setRig(const fsMsgRig& rig) { for (vector::const_iterator it = rig.blendshapes().begin(), end = rig.blendshapes().end(); it != end; it++) { FBXBlendshape blendshape; for (int i = 0, n = it->m_vertices.size(); i < n; i++) { + // subtract the base vertex position; we want the deltas + blendshape.vertices.append(createVec3(it->m_vertices[i]) - geometry.vertices[i]); blendshape.indices.append(i); - blendshape.vertices.append(createVec3(it->m_vertices[i])); } geometry.blendshapes.append(blendshape); } @@ -210,12 +211,4 @@ void BlendFace::setGeometry(const FBXGeometry& geometry) { glBindBuffer(GL_ARRAY_BUFFER, 0); _geometry = geometry; - - // subtract the neutral locations from the blend shapes; we want the deltas - for (QVector::iterator it = _geometry.blendshapes.begin(); it != _geometry.blendshapes.end(); it++) { - glm::vec3* offset = it->vertices.data(); - for (const int* index = it->indices.constData(), *end = index + it->indices.size(); index != end; index++, offset++) { - *offset -= geometry.vertices[*index]; - } - } } diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index 8c7350e790..ce4dc35934 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -192,6 +192,71 @@ QVector createVec3Vector(const QVector& doubleVector) { return values; } +const char* FACESHIFT_BLENDSHAPES[] = { + "EyeBlink_L", + "EyeBlink_R", + "EyeSquint_L", + "EyeSquint_R", + "EyeDown_L", + "EyeDown_R", + "EyeIn_L", + "EyeIn_R", + "EyeOpen_L", + "EyeOpen_R", + "EyeOut_L", + "EyeOut_R", + "EyeUp_L", + "EyeUp_R", + "BrowsD_L", + "BrowsD_R", + "BrowsU_C", + "BrowsU_L", + "BrowsU_R", + "JawFwd", + "JawLeft", + "JawOpen", + "JawChew", + "JawRight", + "MouthLeft", + "MouthRight", + "MouthFrown_L", + "MouthFrown_R", + "MouthSmile_L", + "MouthSmile_R", + "MouthDimple_L", + "MouthDimple_R", + "LipsStretch_L", + "LipsStretch_R", + "LipsUpperClose", + "LipsLowerClose", + "LipsUpperUp", + "LipsLowerDown", + "LipsUpperOpen", + "LipsLowerOpen", + "LipsFunnel", + "LipsPucker", + "ChinLowerRaise", + "ChinUpperRaise", + "Sneer", + "Puff", + "CheekSquint_L", + "CheekSquint_R", + "" +}; + +QHash createBlendshapeMap() { + QHash map; + for (int i = 0;; i++) { + QByteArray name = FACESHIFT_BLENDSHAPES[i]; + if (name != "") { + map.insert(name, i); + + } else { + return map; + } + } +} + FBXGeometry extractFBXGeometry(const FBXNode& node) { FBXGeometry geometry; @@ -271,8 +336,10 @@ FBXGeometry extractFBXGeometry(const FBXNode& node) { // the name is followed by a null and some type info QByteArray name = object.properties.at(1).toByteArray(); - name = name.left(name.indexOf('\0')); - geometry.blendshapes.append(blendshape); + static QHash blendshapeMap = createBlendshapeMap(); + int index = blendshapeMap.value(name.left(name.indexOf('\0'))); + geometry.blendshapes.resize(qMax(geometry.blendshapes.size(), index + 1)); + geometry.blendshapes[index] = blendshape; } } }