ソースを参照

- Bugfix again: SkeletonMeshBuilder avoids validation warning for empty bones now.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@199 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
ulfjorensen 17 年 前
コミット
d618a57428
1 ファイル変更28 行追加25 行削除
  1. 28 25
      code/SkeletonMeshBuilder.cpp

+ 28 - 25
code/SkeletonMeshBuilder.cpp

@@ -162,32 +162,35 @@ void SkeletonMeshBuilder::CreateGeometry( const aiNode* pNode)
 		mFaces.push_back( Face( vertexStartIndex + 21, vertexStartIndex + 22, vertexStartIndex + 23));
 	}
 
-	// create a bone affecting all the newly created vertices
-	aiBone* bone = new aiBone;
-	mBones.push_back( bone);
-	bone->mName = pNode->mName;
-
-	// calculate the bone offset matrix by concatenating the inverse transformations of all parents
-	bone->mOffsetMatrix = aiMatrix4x4( pNode->mTransformation).Inverse();
-	for( aiNode* parent = pNode->mParent; parent != NULL; parent = parent->mParent)
-		bone->mOffsetMatrix = aiMatrix4x4( parent->mTransformation).Inverse() * bone->mOffsetMatrix;
-
-	// add all the vertices to the bone's influences
 	unsigned int numVertices = mVertices.size() - vertexStartIndex;
-	bone->mNumWeights = numVertices;
-	bone->mWeights = new aiVertexWeight[numVertices];
-	for( unsigned int a = 0; a < numVertices; a++)
-		bone->mWeights[a] = aiVertexWeight( vertexStartIndex + a, 1.0f);
-
-	// HACK: (thom) transform all vertices to the bone's local space. Should be done before adding
-	// them to the array, but I'm tired now and I'm annoyed.
-	aiMatrix4x4 boneToMeshTransform = aiMatrix4x4( bone->mOffsetMatrix).Inverse();
-	for( unsigned int a = vertexStartIndex; a < mVertices.size(); a++)
-		mVertices[a] = boneToMeshTransform * mVertices[a];
-
-	// and finally recurse into the children list
-	for( unsigned int a = 0; a < pNode->mNumChildren; a++)
-		CreateGeometry( pNode->mChildren[a]);
+  if( numVertices > 0)
+  {
+    // create a bone affecting all the newly created vertices
+    aiBone* bone = new aiBone;
+    mBones.push_back( bone);
+    bone->mName = pNode->mName;
+
+    // calculate the bone offset matrix by concatenating the inverse transformations of all parents
+    bone->mOffsetMatrix = aiMatrix4x4( pNode->mTransformation).Inverse();
+    for( aiNode* parent = pNode->mParent; parent != NULL; parent = parent->mParent)
+	    bone->mOffsetMatrix = aiMatrix4x4( parent->mTransformation).Inverse() * bone->mOffsetMatrix;
+
+    // add all the vertices to the bone's influences
+    bone->mNumWeights = numVertices;
+    bone->mWeights = new aiVertexWeight[numVertices];
+    for( unsigned int a = 0; a < numVertices; a++)
+	    bone->mWeights[a] = aiVertexWeight( vertexStartIndex + a, 1.0f);
+
+    // HACK: (thom) transform all vertices to the bone's local space. Should be done before adding
+    // them to the array, but I'm tired now and I'm annoyed.
+    aiMatrix4x4 boneToMeshTransform = aiMatrix4x4( bone->mOffsetMatrix).Inverse();
+    for( unsigned int a = vertexStartIndex; a < mVertices.size(); a++)
+	    mVertices[a] = boneToMeshTransform * mVertices[a];
+  }
+
+  // and finally recurse into the children list
+  for( unsigned int a = 0; a < pNode->mNumChildren; a++)
+	  CreateGeometry( pNode->mChildren[a]);
 }
 
 // ------------------------------------------------------------------------------------------------