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(