From 801630e19c40bc15d38051915368f9a0a82fd692 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 17 Sep 2014 13:26:57 -0700 Subject: [PATCH 1/2] Normalize vertex weights if they don't add up to one; replace lowest weight if we can't find an empty slot. --- libraries/fbx/src/FBXReader.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 7d32d97752..3c65540e57 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -1755,12 +1755,24 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) // look for an unused slot in the weights vector glm::vec4& weights = extracted.mesh.clusterWeights[it.value()]; - for (int k = 0; k < 4; k++) { + int lowestIndex = -1; + float lowestWeight = FLT_MAX; + int k = 0; + for (; k < 4; k++) { if (weights[k] == 0.0f) { extracted.mesh.clusterIndices[it.value()][k] = i; weights[k] = weight; break; } + if (weights[k] < lowestWeight) { + lowestIndex = k; + lowestWeight = weights[k]; + } + } + if (k == 4) { + // no space for an additional weight; we must replace the lowest + weights[lowestIndex] = weight; + extracted.mesh.clusterIndices[it.value()][lowestIndex] = i; } } } @@ -1769,6 +1781,14 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) maxJointIndex = jointIndex; } } + // normalize the weights if they don't add up to one + for (int i = 0; i < extracted.mesh.clusterWeights.size(); i++) { + glm::vec4& weights = extracted.mesh.clusterWeights[i]; + float total = weights.x + weights.y + weights.z + weights.w; + if (total != 1.0f && total != 0.0f) { + weights /= total; + } + } } else { int jointIndex = maxJointIndex; FBXJoint& joint = geometry.joints[jointIndex]; From a3c107545ebf45d5b8ac42ebf898db8530dff1ad Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 17 Sep 2014 14:35:34 -0700 Subject: [PATCH 2/2] Allow rendering eye vectors even if there's no head model. --- interface/src/avatar/Head.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index b226b8ed31..9fb86c23ac 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -184,8 +184,8 @@ void Head::relaxLean(float deltaTime) { } void Head::render(float alpha, Model::RenderMode mode) { - if (_faceModel.render(alpha, mode, Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows)) && - _renderLookatVectors && mode != Model::SHADOW_RENDER_MODE) { + _faceModel.render(alpha, mode, Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows)); + if (_renderLookatVectors && mode != Model::SHADOW_RENDER_MODE) { renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); } }