closes https://github.com/assimp/assimp/issues/2368: add missign anim mesh for multimaterial meshes in fbx,.
parent
6b3d6c3b8f
commit
418c07a9bb
|
@ -47,10 +47,10 @@ namespace Assimp {
|
||||||
aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh)
|
aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh)
|
||||||
{
|
{
|
||||||
aiAnimMesh *animesh = new aiAnimMesh;
|
aiAnimMesh *animesh = new aiAnimMesh;
|
||||||
animesh->mVertices = NULL;
|
/*animesh->mVertices = NULL;
|
||||||
animesh->mNormals = NULL;
|
animesh->mNormals = NULL;
|
||||||
animesh->mTangents = NULL;
|
animesh->mTangents = NULL;
|
||||||
animesh->mBitangents = NULL;
|
animesh->mBitangents = NULL;*/
|
||||||
animesh->mNumVertices = mesh->mNumVertices;
|
animesh->mNumVertices = mesh->mNumVertices;
|
||||||
if (mesh->mVertices) {
|
if (mesh->mVertices) {
|
||||||
animesh->mVertices = new aiVector3D[animesh->mNumVertices];
|
animesh->mVertices = new aiVector3D[animesh->mNumVertices];
|
||||||
|
|
|
@ -1385,6 +1385,50 @@ namespace Assimp {
|
||||||
ConvertWeights(out_mesh, model, mesh, node_global_transform, index, &reverseMapping);
|
ConvertWeights(out_mesh, model, mesh, node_global_transform, index, &reverseMapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<aiAnimMesh*> animMeshes;
|
||||||
|
size_t bsIdx(0), bsChannelIdx(0);
|
||||||
|
for (const BlendShape* blendShape : mesh.GetBlendShapes()) {
|
||||||
|
for (const BlendShapeChannel* blendShapeChannel : blendShape->BlendShapeChannels()) {
|
||||||
|
const std::vector<const ShapeGeometry*>& shapeGeometries = blendShapeChannel->GetShapeGeometries();
|
||||||
|
for (size_t i = 0; i < shapeGeometries.size(); i++) {
|
||||||
|
aiAnimMesh* animMesh = aiCreateAnimMesh(out_mesh);
|
||||||
|
const ShapeGeometry* shapeGeometry = shapeGeometries.at(i);
|
||||||
|
const std::vector<aiVector3D>& vertices = shapeGeometry->GetVertices();
|
||||||
|
const std::vector<aiVector3D>& normals = shapeGeometry->GetNormals();
|
||||||
|
const std::vector<unsigned int>& indices = shapeGeometry->GetIndices();
|
||||||
|
animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name()));
|
||||||
|
for (size_t j = 0; j < indices.size(); j++) {
|
||||||
|
unsigned int index = indices.at(j);
|
||||||
|
aiVector3D vertex = vertices.at(j);
|
||||||
|
aiVector3D normal = normals.at(j);
|
||||||
|
unsigned int count = 0;
|
||||||
|
const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count);
|
||||||
|
for (unsigned int k = 0; k < count; k++) {
|
||||||
|
unsigned int index = outIndices[k];
|
||||||
|
animMesh->mVertices[index] += vertex;
|
||||||
|
if (animMesh->mNormals != nullptr) {
|
||||||
|
animMesh->mNormals[index] += normal;
|
||||||
|
animMesh->mNormals[index].NormalizeSafe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
animMesh->mWeight = shapeGeometries.size() > 1 ? blendShapeChannel->DeformPercent() / 100.0f : 1.0f;
|
||||||
|
animMeshes.push_back(animMesh);
|
||||||
|
}
|
||||||
|
bsChannelIdx++;
|
||||||
|
}
|
||||||
|
bsIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t numAnimMeshes = animMeshes.size();
|
||||||
|
if (numAnimMeshes > 0) {
|
||||||
|
out_mesh->mNumAnimMeshes = static_cast<unsigned int>(numAnimMeshes);
|
||||||
|
out_mesh->mAnimMeshes = new aiAnimMesh * [numAnimMeshes];
|
||||||
|
for (size_t i = 0; i < numAnimMeshes; i++) {
|
||||||
|
out_mesh->mAnimMeshes[i] = animMeshes.at(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return static_cast<unsigned int>(meshes.size() - 1);
|
return static_cast<unsigned int>(meshes.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -963,7 +963,6 @@ void ParseVectorDataArray(std::vector<float>& out, const Element& el)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// read an array of uints
|
// read an array of uints
|
||||||
void ParseVectorDataArray(std::vector<unsigned int>& out, const Element& el)
|
void ParseVectorDataArray(std::vector<unsigned int>& out, const Element& el)
|
||||||
|
@ -1280,7 +1279,6 @@ float ParseTokenAsFloat(const Token& t)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// wrapper around ParseTokenAsInt() with ParseError handling
|
// wrapper around ParseTokenAsInt() with ParseError handling
|
||||||
int ParseTokenAsInt(const Token& t)
|
int ParseTokenAsInt(const Token& t)
|
||||||
|
@ -1293,8 +1291,6 @@ int ParseTokenAsInt(const Token& t)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// wrapper around ParseTokenAsInt64() with ParseError handling
|
// wrapper around ParseTokenAsInt64() with ParseError handling
|
||||||
int64_t ParseTokenAsInt64(const Token& t)
|
int64_t ParseTokenAsInt64(const Token& t)
|
||||||
|
|
Loading…
Reference in New Issue