Selaa lähdekoodia

Fix failed assimp validation for glTF2 sample animations

tirichards 6 vuotta sitten
vanhempi
commit
bb9e3c3593
1 muutettua tiedostoa jossa 19 lisäystä ja 5 poistoa
  1. 19 5
      code/glTF2Importer.cpp

+ 19 - 5
code/glTF2Importer.cpp

@@ -826,15 +826,29 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector<unsigned int>&
                     aiBone* bone = new aiBone();
                     aiBone* bone = new aiBone();
 
 
                     Ref<Node> joint = node.skin->jointNames[i];
                     Ref<Node> joint = node.skin->jointNames[i];
-                    bone->mName = joint->name;
+                    if (!joint->name.empty()) {
+                      bone->mName = joint->name;
+                    } else {
+                      // Assimp expects each bone to have a unique name.
+                      static const std::string kDefaultName = "bone_";
+                      char postfix[10] = {0};
+                      ASSIMP_itoa10(postfix, i);
+                      bone->mName = (kDefaultName + postfix);
+                    }
                     GetNodeTransform(bone->mOffsetMatrix, *joint);
                     GetNodeTransform(bone->mOffsetMatrix, *joint);
 
 
                     std::vector<aiVertexWeight>& weights = weighting[i];
                     std::vector<aiVertexWeight>& weights = weighting[i];
 
 
                     bone->mNumWeights = weights.size();
                     bone->mNumWeights = weights.size();
                     if (bone->mNumWeights > 0) {
                     if (bone->mNumWeights > 0) {
-                        bone->mWeights = new aiVertexWeight[bone->mNumWeights];
-                        memcpy(bone->mWeights, weights.data(), bone->mNumWeights * sizeof(aiVertexWeight));
+                      bone->mWeights = new aiVertexWeight[bone->mNumWeights];
+                      memcpy(bone->mWeights, weights.data(), bone->mNumWeights * sizeof(aiVertexWeight));
+                    } else {
+                      // Assimp expects all bones to have at least 1 weight.
+                      bone->mWeights = new aiVertexWeight[1];
+                      bone->mNumWeights = 1;
+                      bone->mWeights->mVertexId = 0;
+                      bone->mWeights->mWeight = 0.f;
                     }
                     }
                     mesh->mBones[i] = bone;
                     mesh->mBones[i] = bone;
                 }
                 }
@@ -1022,7 +1036,7 @@ void glTF2Importer::ImportAnimations(glTF2::Asset& r)
                 ++j;
                 ++j;
             }
             }
         }
         }
-        
+
         // Use the latest keyframe for the duration of the animation
         // Use the latest keyframe for the duration of the animation
         double maxDuration = 0;
         double maxDuration = 0;
         for (unsigned int j = 0; j < ai_anim->mNumChannels; ++j) {
         for (unsigned int j = 0; j < ai_anim->mNumChannels; ++j) {
@@ -1047,7 +1061,7 @@ void glTF2Importer::ImportAnimations(glTF2::Asset& r)
             }
             }
         }
         }
         ai_anim->mDuration = maxDuration;
         ai_anim->mDuration = maxDuration;
-        
+
         mScene->mAnimations[i] = ai_anim;
         mScene->mAnimations[i] = ai_anim;
     }
     }
 }
 }