From 128242e3710c3683160a05d1db0a136d14bca1fc Mon Sep 17 00:00:00 2001 From: Ichiro Date: Mon, 18 Apr 2022 01:28:03 +0900 Subject: [PATCH 1/2] Fix ogre xml serializer --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 26 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 545107ea3..923cb1ae2 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,7 +584,7 @@ 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); @@ -594,7 +604,7 @@ 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); @@ -614,7 +624,7 @@ 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); @@ -622,7 +632,7 @@ void OgreXmlSerializer::ReadAnimationKeyFrames(XmlNode &node, Animation *anim, V } else if (currentChildName == nnRotate) { float angle = ReadAttribute(currentChildNode, "angle"); for (XmlNode ¤tChildChildNode : currentNode.children()) { - const std::string currentChildChildName = currentNode.name(); + 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(); From 9ab6ebd36321bc8496acf6b569e180c3f80fab40 Mon Sep 17 00:00:00 2001 From: Ichiro Date: Mon, 18 Apr 2022 04:11:06 +0900 Subject: [PATCH 2/2] Fix foreach --- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 923cb1ae2..f6164c64f 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -587,11 +587,11 @@ void OgreXmlSerializer::ReadAnimations(XmlNode &node, Skeleton *skeleton) { 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); } } } @@ -607,11 +607,11 @@ void OgreXmlSerializer::ReadAnimationTracks(XmlNode &node, Animation *dest) { 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); } } } @@ -631,7 +631,7 @@ void OgreXmlSerializer::ReadAnimationKeyFrames(XmlNode &node, Animation *anim, V keyframe.position.z = ReadAttribute(currentChildNode, anZ); } else if (currentChildName == nnRotate) { float angle = ReadAttribute(currentChildNode, "angle"); - for (XmlNode ¤tChildChildNode : currentNode.children()) { + for (XmlNode ¤tChildChildNode : currentChildNode.children()) { const std::string currentChildChildName = currentChildChildNode.name(); if (currentChildChildName == nnAxis) { aiVector3D axis;