diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index d446fd2e9..4de142075 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -232,7 +232,6 @@ void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) nodes_chain.clear(); post_nodes_chain.clear(); - aiMatrix4x4 new_abs_transform = parent->mTransformation; std::string node_name = FixNodeName(model->Name()); // even though there is only a single input node, the design of // assimp (or rather: the complicated transformation chain that @@ -266,12 +265,10 @@ void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) child->mParent = last_parent; last_parent = child.mNode; - - new_abs_transform *= child->mTransformation; } // attach geometry - ConvertModel(*model, nodes_chain.back().mNode, root_node, new_abs_transform); + ConvertModel(*model, nodes_chain.back().mNode, root_node); // check if there will be any child nodes const std::vector &child_conns = doc.GetConnectionsByDestinationSequenced(model->ID(), "Model"); @@ -290,8 +287,6 @@ void FBXConverter::ConvertNodes(uint64_t id, aiNode *parent, aiNode *root_node) postnode->mParent = last_parent; last_parent = postnode.mNode; - - new_abs_transform *= postnode->mTransformation; } } else { // free the nodes we allocated as we don't need them @@ -899,8 +894,7 @@ void FBXConverter::SetupNodeMetadata(const Model &model, aiNode &nd) { } } -void FBXConverter::ConvertModel(const Model &model, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &absolute_transform) { +void FBXConverter::ConvertModel(const Model &model, aiNode *parent, aiNode *root_node) { const std::vector &geos = model.GetGeometry(); std::vector meshes; @@ -911,8 +905,7 @@ void FBXConverter::ConvertModel(const Model &model, aiNode *parent, aiNode *root const MeshGeometry *const mesh = dynamic_cast(geo); const LineGeometry *const line = dynamic_cast(geo); if (mesh) { - const std::vector &indices = ConvertMesh(*mesh, model, parent, root_node, - absolute_transform); + const std::vector &indices = ConvertMesh(*mesh, model, parent, root_node); std::copy(indices.begin(), indices.end(), std::back_inserter(meshes)); } else if (line) { const std::vector &indices = ConvertLine(*line, root_node); @@ -933,8 +926,7 @@ void FBXConverter::ConvertModel(const Model &model, aiNode *parent, aiNode *root } std::vector -FBXConverter::ConvertMesh(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &absolute_transform) { +FBXConverter::ConvertMesh(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node) { std::vector temp; MeshMap::const_iterator it = meshes_converted.find(&mesh); @@ -957,13 +949,13 @@ FBXConverter::ConvertMesh(const MeshGeometry &mesh, const Model &model, aiNode * const MatIndexArray::value_type base = mindices[0]; for (MatIndexArray::value_type index : mindices) { if (index != base) { - return ConvertMeshMultiMaterial(mesh, model, parent, root_node, absolute_transform); + return ConvertMeshMultiMaterial(mesh, model, parent, root_node); } } } // faster code-path, just copy the data - temp.push_back(ConvertMeshSingleMaterial(mesh, model, absolute_transform, parent, root_node)); + temp.push_back(ConvertMeshSingleMaterial(mesh, model, parent, root_node)); return temp; } @@ -1032,8 +1024,7 @@ aiMesh *FBXConverter::SetupEmptyMesh(const Geometry &mesh, aiNode *parent) { } unsigned int FBXConverter::ConvertMeshSingleMaterial(const MeshGeometry &mesh, const Model &model, - const aiMatrix4x4 &absolute_transform, aiNode *parent, - aiNode *) { + aiNode *parent, aiNode *) { const MatIndexArray &mindices = mesh.GetMaterialIndices(); aiMesh *const out_mesh = SetupEmptyMesh(mesh, parent); @@ -1152,7 +1143,7 @@ unsigned int FBXConverter::ConvertMeshSingleMaterial(const MeshGeometry &mesh, c } if (doc.Settings().readWeights && mesh.DeformerSkin() != nullptr) { - ConvertWeights(out_mesh, mesh, absolute_transform, parent, NO_MATERIAL_SEPARATION, nullptr); + ConvertWeights(out_mesh, mesh, parent, NO_MATERIAL_SEPARATION, nullptr); } std::vector animMeshes; @@ -1200,8 +1191,7 @@ unsigned int FBXConverter::ConvertMeshSingleMaterial(const MeshGeometry &mesh, c std::vector FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &model, aiNode *parent, - aiNode *root_node, - const aiMatrix4x4 &absolute_transform) { + aiNode *root_node) { const MatIndexArray &mindices = mesh.GetMaterialIndices(); ai_assert(mindices.size()); @@ -1211,7 +1201,7 @@ FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &mo for (MatIndexArray::value_type index : mindices) { if (had.find(index) == had.end()) { - indices.push_back(ConvertMeshMultiMaterial(mesh, model, index, parent, root_node, absolute_transform)); + indices.push_back(ConvertMeshMultiMaterial(mesh, model, index, parent, root_node)); had.insert(index); } } @@ -1221,8 +1211,7 @@ FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &mo unsigned int FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &model, MatIndexArray::value_type index, - aiNode *parent, aiNode *, - const aiMatrix4x4 &absolute_transform) { + aiNode *parent, aiNode *) { aiMesh *const out_mesh = SetupEmptyMesh(mesh, parent); const MatIndexArray &mindices = mesh.GetMaterialIndices(); @@ -1385,7 +1374,7 @@ unsigned int FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, co ConvertMaterialForMesh(out_mesh, model, mesh, index); if (process_weights) { - ConvertWeights(out_mesh, mesh, absolute_transform, parent, index, &reverseMapping); + ConvertWeights(out_mesh, mesh, parent, index, &reverseMapping); } std::vector animMeshes; @@ -1436,7 +1425,6 @@ unsigned int FBXConverter::ConvertMeshMultiMaterial(const MeshGeometry &mesh, co } void FBXConverter::ConvertWeights(aiMesh *out, const MeshGeometry &geo, - const aiMatrix4x4 &absolute_transform, aiNode *parent, unsigned int materialIndex, std::vector *outputVertStartIndices) { ai_assert(geo.DeformerSkin()); @@ -1508,7 +1496,7 @@ void FBXConverter::ConvertWeights(aiMesh *out, const MeshGeometry &geo, // XXX this could be heavily simplified by collecting the bone // data in a single step. ConvertCluster(bones, cluster, out_indices, index_out_indices, - count_out_indices, absolute_transform, parent); + count_out_indices, parent); } bone_map.clear(); @@ -1537,8 +1525,7 @@ const aiNode *GetNodeByName(aiNode *current_node) { void FBXConverter::ConvertCluster(std::vector &local_mesh_bones, const Cluster *cl, std::vector &out_indices, std::vector &index_out_indices, - std::vector &count_out_indices, const aiMatrix4x4 &absolute_transform, - aiNode *) { + std::vector &count_out_indices, aiNode *) { ai_assert(cl); // make sure cluster valid std::string deformer_name = cl->TargetNode()->Name(); aiString bone_name = aiString(FixNodeName(deformer_name)); @@ -1553,14 +1540,16 @@ void FBXConverter::ConvertCluster(std::vector &local_mesh_bones, const bone = new aiBone(); bone->mName = bone_name; + bone->mOffsetMatrix = cl->Transform(); // store local transform link for post processing + /* bone->mOffsetMatrix = cl->TransformLink(); bone->mOffsetMatrix.Inverse(); aiMatrix4x4 matrix = (aiMatrix4x4)absolute_transform; bone->mOffsetMatrix = bone->mOffsetMatrix * matrix; // * mesh_offset - + */ // // Now calculate the aiVertexWeights // diff --git a/code/AssetLib/FBX/FBXConverter.h b/code/AssetLib/FBX/FBXConverter.h index becfdb3e8..5559f0b7c 100644 --- a/code/AssetLib/FBX/FBXConverter.h +++ b/code/AssetLib/FBX/FBXConverter.h @@ -180,14 +180,12 @@ private: void SetupNodeMetadata(const Model& model, aiNode& nd); // ------------------------------------------------------------------------------------------------ - void ConvertModel(const Model &model, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &absolute_transform); + void ConvertModel(const Model &model, aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ // MeshGeometry -> aiMesh, return mesh index + 1 or 0 if the conversion failed std::vector - ConvertMesh(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &absolute_transform); + ConvertMesh(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ std::vector ConvertLine(const LineGeometry& line, aiNode *root_node); @@ -197,17 +195,15 @@ private: // ------------------------------------------------------------------------------------------------ unsigned int ConvertMeshSingleMaterial(const MeshGeometry &mesh, const Model &model, - const aiMatrix4x4 &absolute_transform, aiNode *parent, - aiNode *root_node); + aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ std::vector - ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node, - const aiMatrix4x4 &absolute_transform); + ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &model, aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ unsigned int ConvertMeshMultiMaterial(const MeshGeometry &mesh, const Model &model, MatIndexArray::value_type index, - aiNode *parent, aiNode *root_node, const aiMatrix4x4 &absolute_transform); + aiNode *parent, aiNode *root_node); // ------------------------------------------------------------------------------------------------ static const unsigned int NO_MATERIAL_SEPARATION = /* std::numeric_limits::max() */ @@ -220,15 +216,14 @@ private: * - outputVertStartIndices is only used when a material index is specified, it gives for * each output vertex the DOM index it maps to. */ - void ConvertWeights(aiMesh *out, const MeshGeometry &geo, const aiMatrix4x4 &absolute_transform, - aiNode *parent = nullptr, unsigned int materialIndex = NO_MATERIAL_SEPARATION, + void ConvertWeights(aiMesh *out, const MeshGeometry &geo, aiNode *parent = nullptr, + unsigned int materialIndex = NO_MATERIAL_SEPARATION, std::vector *outputVertStartIndices = nullptr); // ------------------------------------------------------------------------------------------------ void ConvertCluster(std::vector &local_mesh_bones, const Cluster *cl, std::vector &out_indices, std::vector &index_out_indices, - std::vector &count_out_indices, const aiMatrix4x4 &absolute_transform, - aiNode *parent ); + std::vector &count_out_indices, aiNode *parent ); // ------------------------------------------------------------------------------------------------ void ConvertMaterialForMesh(aiMesh* out, const Model& model, const MeshGeometry& geo, diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 545107ea3..f6164c64f 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -248,6 +248,7 @@ void OgreXmlSerializer::ReadMesh(MeshXml *mesh) { } else if (currentName == nnBoneAssignments) { ReadBoneAssignments(currentNode, mesh->sharedVertexData); } else if (currentName == nnSkeletonLink) { + mesh->skeletonRef = currentNode.attribute("name").as_string(); } } @@ -488,6 +489,15 @@ bool OgreXmlSerializer::ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *me Skeleton *skeleton = new Skeleton(); OgreXmlSerializer serializer(xmlParser.get()); XmlNode root = xmlParser->getRootNode(); + if (std::string(root.name()) != nnSkeleton) { + printf("\nSkeleton is not a valid root: %s\n", root.name()); + for (auto &a : root.children()) { + if (std::string(a.name()) == nnSkeleton) { + root = a; + break; + } + } + } serializer.ReadSkeleton(root, skeleton); mesh->skeleton = skeleton; return true; @@ -537,7 +547,7 @@ XmlParserPtr OgreXmlSerializer::OpenXmlParser(Assimp::IOSystem *pIOHandler, cons } void OgreXmlSerializer::ReadSkeleton(XmlNode &node, Skeleton *skeleton) { - if (node.name() != nnSkeleton) { + if (std::string(node.name()) != nnSkeleton) { throw DeadlyImportError("Root node is <" + std::string(node.name()) + "> expecting "); } @@ -574,14 +584,14 @@ void OgreXmlSerializer::ReadAnimations(XmlNode &node, Skeleton *skeleton) { anim->name = ReadAttribute(currentNode, "name"); anim->length = ReadAttribute(currentNode, "length"); for (XmlNode ¤tChildNode : currentNode.children()) { - const std::string currentChildName = currentNode.name(); + const std::string currentChildName = currentChildNode.name(); if (currentChildName == nnTracks) { ReadAnimationTracks(currentChildNode, anim); - skeleton->animations.push_back(anim); } else { throw DeadlyImportError("No found in ", anim->name); } } + skeleton->animations.push_back(anim); } } } @@ -594,14 +604,14 @@ void OgreXmlSerializer::ReadAnimationTracks(XmlNode &node, Animation *dest) { track.type = VertexAnimationTrack::VAT_TRANSFORM; track.boneName = ReadAttribute(currentNode, "bone"); for (XmlNode ¤tChildNode : currentNode.children()) { - const std::string currentChildName = currentNode.name(); + const std::string currentChildName = currentChildNode.name(); if (currentChildName == nnKeyFrames) { ReadAnimationKeyFrames(currentChildNode, dest, &track); - dest->tracks.push_back(track); } else { throw DeadlyImportError("No found in ", dest->name); } } + dest->tracks.push_back(track); } } } @@ -614,15 +624,15 @@ void OgreXmlSerializer::ReadAnimationKeyFrames(XmlNode &node, Animation *anim, V if (currentName == nnKeyFrame) { keyframe.timePos = ReadAttribute(currentNode, "time"); for (XmlNode ¤tChildNode : currentNode.children()) { - const std::string currentChildName = currentNode.name(); + const std::string currentChildName = currentChildNode.name(); if (currentChildName == nnTranslate) { keyframe.position.x = ReadAttribute(currentChildNode, anX); keyframe.position.y = ReadAttribute(currentChildNode, anY); keyframe.position.z = ReadAttribute(currentChildNode, anZ); } else if (currentChildName == nnRotate) { float angle = ReadAttribute(currentChildNode, "angle"); - for (XmlNode ¤tChildChildNode : currentNode.children()) { - const std::string currentChildChildName = currentNode.name(); + for (XmlNode ¤tChildChildNode : currentChildNode.children()) { + const std::string currentChildChildName = currentChildChildNode.name(); if (currentChildChildName == nnAxis) { aiVector3D axis; axis.x = ReadAttribute(currentChildChildNode, anX); @@ -695,12 +705,12 @@ void OgreXmlSerializer::ReadBones(XmlNode &node, Skeleton *skeleton) { bone->id = ReadAttribute(currentNode, "id"); bone->name = ReadAttribute(currentNode, "name"); for (XmlNode ¤tChildNode : currentNode.children()) { - const std::string currentChildName = currentNode.name(); - if (currentChildName == nnRotation) { + const std::string currentChildName = currentChildNode.name(); + if (currentChildName == nnPosition) { bone->position.x = ReadAttribute(currentChildNode, anX); bone->position.y = ReadAttribute(currentChildNode, anY); bone->position.z = ReadAttribute(currentChildNode, anZ); - } else if (currentChildName == nnScale) { + } else if (currentChildName == nnRotation) { float angle = ReadAttribute(currentChildNode, "angle"); for (XmlNode currentChildChildNode : currentChildNode.children()) { const std::string ¤tChildChildName = currentChildChildNode.name(); diff --git a/contrib/draco/CMakeLists.txt b/contrib/draco/CMakeLists.txt index 5526e7f60..6ea9b21fd 100644 --- a/contrib/draco/CMakeLists.txt +++ b/contrib/draco/CMakeLists.txt @@ -10,7 +10,7 @@ endif() set(draco_root "${CMAKE_CURRENT_SOURCE_DIR}") set(draco_src_root "${draco_root}/src/draco") -set(draco_build "${CMAKE_BINARY_DIR}") +set(draco_build "${Assimp_BINARY_DIR}") if("${draco_root}" STREQUAL "${draco_build}") message(