From deddaf49df98613006e94e8749894910eb6ec74e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 16 Jul 2020 11:33:28 +0200 Subject: [PATCH] finish migrate ogrexmlserializer. --- code/AssetLib/Ogre/OgreImporter.cpp | 10 ++-- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 69 ++++++------------------ code/AssetLib/Ogre/OgreXmlSerializer.h | 29 +++------- include/assimp/XmlParser.h | 7 ++- 4 files changed, 35 insertions(+), 80 deletions(-) diff --git a/code/AssetLib/Ogre/OgreImporter.cpp b/code/AssetLib/Ogre/OgreImporter.cpp index 9d85a0a96..17ed5b966 100644 --- a/code/AssetLib/Ogre/OgreImporter.cpp +++ b/code/AssetLib/Ogre/OgreImporter.cpp @@ -126,11 +126,13 @@ void OgreImporter::InternReadFile(const std::string &pFile, aiScene *pScene, Ass { /// @note XmlReader does not take ownership of f, hence the scoped ptr. std::unique_ptr scopedFile(f); - std::unique_ptr xmlStream(new CIrrXML_IOStreamReader(scopedFile.get())); - std::unique_ptr reader(irr::io::createIrrXMLReader(xmlStream.get())); - + XmlParser xmlParser; + + //std::unique_ptr xmlStream(new CIrrXML_IOStreamReader(scopedFile.get())); + //std::unique_ptr reader(irr::io::createIrrXMLReader(xmlStream.get())); + xmlParser.parse(scopedFile.get()); // Import mesh - std::unique_ptr mesh(OgreXmlSerializer::ImportMesh(reader.get())); + std::unique_ptr mesh(OgreXmlSerializer::ImportMesh(xmlParser)); // Import skeleton OgreXmlSerializer::ImportSkeleton(pIOHandler, mesh.get()); diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 0a60c1455..def12a87e 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -42,8 +42,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "OgreXmlSerializer.h" #include "OgreBinarySerializer.h" #include "OgreParsingUtils.h" + #include #include + #include #ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER @@ -63,10 +65,6 @@ AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::s throw DeadlyImportError("Attribute '" + name + "' does not exist in node '" + nodeName + "'"); } } -static inline bool hasAttribute( XmlNode &xmlNode, const char *name ) { - pugi::xml_attribute attr = xmlNode.attribute(name); - return !attr.empty(); -} template <> int32_t OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char *name) const { @@ -133,51 +131,7 @@ bool OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char *name) return false; } -/*std::string &OgreXmlSerializer::NextNode() { - do { - if (!m_reader->read()) { - m_currentNodeName = ""; - return m_currentNodeName; - } - } while (m_reader->getNodeType() != irr::io::EXN_ELEMENT); - CurrentNodeName(true); -#if (OGRE_XML_SERIALIZER_DEBUG == 1) - ASSIMP_LOG_DEBUG"<" + m_currentNodeName + ">"); -#endif - return m_currentNodeName; -} - -bool OgreXmlSerializer::CurrentNodeNameEquals(const std::string &name) const { - return (ASSIMP_stricmp(m_currentNodeName, name) == 0); -} - -std::string OgreXmlSerializer::CurrentNodeName(bool forceRead) { - if (forceRead) - m_currentNodeName = std::string(m_reader->getNodeName()); - return m_currentNodeName; -} - -std::string &OgreXmlSerializer::SkipCurrentNode() { -#if (OGRE_XML_SERIALIZER_DEBUG == 1) - ASSIMP_LOG_DEBUG("Skipping node <" + m_currentNodeName + ">"); -#endif - - for (;;) { - if (!m_reader->read()) { - m_currentNodeName = ""; - return m_currentNodeName; - } - if (m_reader->getNodeType() != irr::io::EXN_ELEMENT_END) { - continue; - } else if (std::string(m_reader->getNodeName()) == m_currentNodeName) { - break; - } - } - - return NextNode(); -} -*/ // Mesh XML constants // @@ -252,8 +206,17 @@ static const char *anZ = "z"; // Mesh -MeshXml *OgreXmlSerializer::ImportMesh(XmlParser *xmlParser) { - OgreXmlSerializer serializer(xmlParser); +OgreXmlSerializer::OgreXmlSerializer(XmlParser *parser) : + mParser(parser) { + // empty +} + +MeshXml *OgreXmlSerializer::ImportMesh(XmlParser *parser) { + if (nullptr == parser) { + return nullptr; + } + + OgreXmlSerializer serializer(parser); MeshXml *mesh = new MeshXml(); serializer.ReadMesh(mesh); @@ -262,9 +225,9 @@ MeshXml *OgreXmlSerializer::ImportMesh(XmlParser *xmlParser) { } void OgreXmlSerializer::ReadMesh(MeshXml *mesh) { - const XmlNode *root = mParser->getRootNode(); + XmlNode *root = mParser->getRootNode(); if (nullptr == root || std::string(nnMesh)!=root->name()) { - throw DeadlyImportError("Root node is <" + m_currentNodeName + "> expecting "); + throw DeadlyImportError("Root node is <" + std::string(root->name()) + "> expecting "); } for (XmlNode currentNode : root->children()) { @@ -557,7 +520,7 @@ void OgreXmlSerializer::ReadSubMesh(XmlNode &node, MeshXml *mesh) { submesh->vertexData = new VertexDataXml(); ReadGeometry(currentNode, submesh->vertexData); - } else if (m_currentNodeName == nnBoneAssignments) { + } else if (currentName == nnBoneAssignments) { ReadBoneAssignments(currentNode, submesh->vertexData); } } diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.h b/code/AssetLib/Ogre/OgreXmlSerializer.h index f18791e86..a5a235a98 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.h +++ b/code/AssetLib/Ogre/OgreXmlSerializer.h @@ -49,21 +49,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include namespace Assimp { + namespace Ogre { -//typedef irr::io::IrrXMLReader XmlReader; -using XmlParserPtr = std::shared_ptr ; +using XmlParserPtr = std::shared_ptr<::Assimp::XmlParser> ; class OgreXmlSerializer { public: /// Imports mesh and returns the result. - /** @note Fatal unrecoverable errors will throw a DeadlyImportError. */ + /// @note Fatal unrecoverable errors will throw a DeadlyImportError. static MeshXml *ImportMesh(XmlParser *parser); /// Imports skeleton to @c mesh. - /** If mesh does not have a skeleton reference or the skeleton file - cannot be found it is not a fatal DeadlyImportError. - @return If skeleton import was successful. */ + /// If mesh does not have a skeleton reference or the skeleton file + /// cannot be found it is not a fatal DeadlyImportError. + /// @return If skeleton import was successful. static bool ImportSkeleton(IOSystem *pIOHandler, MeshXml *mesh); static bool ImportSkeleton(IOSystem *pIOHandler, Mesh *mesh); @@ -75,40 +75,25 @@ private: // Mesh void ReadMesh(MeshXml *mesh); void ReadSubMesh(XmlNode &node, MeshXml *mesh); - void ReadGeometry(XmlNode &node, VertexDataXml *dest); void ReadGeometryVertexBuffer(XmlNode &node, VertexDataXml *dest); - void ReadBoneAssignments(XmlNode &node, VertexDataXml *dest); // Skeleton void ReadSkeleton(XmlNode &node, Skeleton *skeleton); - void ReadBones(XmlNode &node, Skeleton *skeleton); void ReadBoneHierarchy(XmlNode &node, Skeleton *skeleton); - void ReadAnimations(XmlNode &node, Skeleton *skeleton); void ReadAnimationTracks(XmlNode &node, Animation *dest); void ReadAnimationKeyFrames(XmlNode &node, Animation *anim, VertexAnimationTrack *dest); template T ReadAttribute(XmlNode &xmlNode, const char *name) const; - //bool HasAttribute(const char *name) const; - - //std::string &NextNode(); - //std::string &SkipCurrentNode(); - - //bool CurrentNodeNameEquals(const std::string &name) const; - //std::string CurrentNodeName(bool forceRead = false); +private: XmlParser *mParser; - std::string m_currentNodeName; }; -inline OgreXmlSerializer::OgreXmlSerializer(XmlParser *xmlParser) : - mParser(xmlParser) { - // empty -} } // namespace Ogre } // namespace Assimp diff --git a/include/assimp/XmlParser.h b/include/assimp/XmlParser.h index 0bdc07cbe..11f06d692 100644 --- a/include/assimp/XmlParser.h +++ b/include/assimp/XmlParser.h @@ -152,7 +152,12 @@ private: }; using XmlParser = TXmlParser; -using XmlNode = pugi::xml_node; +using XmlNode = pugi::xml_node; + +static inline bool hasAttribute(XmlNode &xmlNode, const char *name) { + pugi::xml_attribute attr = xmlNode.attribute(name); + return !attr.empty(); +} } // namespace Assimp