From 1b9444cb39062c69da3f617ee122d81e9d67843f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 24 Sep 2013 14:22:01 -0700 Subject: [PATCH] As a temporary hack, render the mesh with the most blendshapes with the head color (other meshes white). --- interface/src/avatar/BlendFace.cpp | 12 +++++++----- interface/src/renderer/FBXReader.cpp | 11 ++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/BlendFace.cpp b/interface/src/avatar/BlendFace.cpp index 886184aafc..14818ff22f 100644 --- a/interface/src/avatar/BlendFace.cpp +++ b/interface/src/avatar/BlendFace.cpp @@ -48,6 +48,8 @@ bool BlendFace::render(float alpha) { // enable normalization under the expectation that the GPU can do it faster glEnable(GL_NORMALIZE); + glColor4f(_owningHead->getSkinColor().r, _owningHead->getSkinColor().g, _owningHead->getSkinColor().b, alpha); + for (int i = 0; i < _meshIDs.size(); i++) { const VerticesIndices& ids = _meshIDs.at(i); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ids.first); @@ -56,12 +58,12 @@ bool BlendFace::render(float alpha) { const FBXMesh& mesh = _geometry.meshes.at(i); int vertexCount = mesh.vertices.size(); - if (mesh.blendshapes.isEmpty()) { + // all meshes after the first are white + if (i == 1) { glColor4f(1.0f, 1.0f, 1.0f, alpha); - - } else { - glColor4f(_owningHead->getSkinColor().r, _owningHead->getSkinColor().g, _owningHead->getSkinColor().b, alpha); - + } + + if (!mesh.blendshapes.isEmpty()) { _blendedVertices.resize(max(_blendedVertices.size(), vertexCount)); _blendedNormals.resize(_blendedVertices.size()); memcpy(_blendedVertices.data(), mesh.vertices.constData(), vertexCount * sizeof(glm::vec3)); diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index 5219669193..a5fd85673f 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -376,9 +376,18 @@ FBXGeometry extractFBXGeometry(const FBXNode& node) { mesh.blendshapes[extracted.index] = extracted.blendshape; } + // as a temporary hack, put the mesh with the most blendshapes on top; assume it to be the face FBXGeometry geometry; + int mostBlendshapes = 0; + int mostBlendshapesIndex = 0; foreach (const FBXMesh& mesh, meshes) { - geometry.meshes.append(mesh); + if (mesh.blendshapes.size() > mostBlendshapes) { + geometry.meshes.prepend(mesh); + mostBlendshapes = mesh.blendshapes.size(); + + } else { + geometry.meshes.append(mesh); + } } return geometry;