2
0
kimkulling 5 жил өмнө
parent
commit
582a8b1887

+ 10 - 3
code/AssetLib/Collada/ColladaParser.cpp

@@ -121,6 +121,14 @@ ColladaParser::ColladaParser(IOSystem *pIOHandler, const std::string &pFile) :
     if (nullptr == root) {
         ThrowException("Unable to read file, malformed XML");
     }
+    bool res = root->empty();
+    if (!res) {
+        for (XmlNode &n : root->children()) {
+            const std::string nm = n.name();
+        }
+        XmlNode node = root->first_child();
+        std::string name = node.name();
+    }
 
     // start reading
     ReadContents(*root);
@@ -664,7 +672,7 @@ void ColladaParser::ReadController(XmlNode &node, Collada::Controller &pControll
             }
         } else if (currentName == "source") {
             ReadSource(currentNode);
-        } else if (currentName == "joints" ) {
+        } else if (currentName == "joints") {
             ReadControllerJoints(currentNode, pController);
         } else if (currentName == "vertex_weights") {
             ReadControllerWeights(currentNode, pController);
@@ -2244,7 +2252,7 @@ void ColladaParser::ReadNodeGeometry(XmlNode &node, Node *pNode) {
 
     for (XmlNode &currentNode : node.children()) {
         const std::string &currentName = currentNode.name();
-        if (currentName=="instance_material") {
+        if (currentName == "instance_material") {
             // read ID of the geometry subgroup and the target material
             std::string group;
             XmlParser::getStdStrAttribute(currentNode, "symbol", group);
@@ -2256,7 +2264,6 @@ void ColladaParser::ReadNodeGeometry(XmlNode &node, Node *pNode) {
 
             s.mMatName = urlMat;
 
-
             // store the association
             instance.mMaterials[group] = s;
         }

+ 15 - 13
code/AssetLib/Obj/ObjFileImporter.cpp

@@ -75,7 +75,9 @@ using namespace std;
 // ------------------------------------------------------------------------------------------------
 //  Default constructor
 ObjFileImporter::ObjFileImporter() :
-        m_Buffer(), m_pRootObject(nullptr), m_strAbsPath(std::string(1, DefaultIOSystem().getOsSeparator())) {}
+        m_Buffer(),
+        m_pRootObject(nullptr),
+        m_strAbsPath(std::string(1, DefaultIOSystem().getOsSeparator())) {}
 
 // ------------------------------------------------------------------------------------------------
 //  Destructor.
@@ -589,18 +591,18 @@ void ObjFileImporter::createMaterials(const ObjFile::Model *pModel, aiScene *pSc
         // convert illumination model
         int sm = 0;
         switch (pCurrentMaterial->illumination_model) {
-            case 0:
-                sm = aiShadingMode_NoShading;
-                break;
-            case 1:
-                sm = aiShadingMode_Gouraud;
-                break;
-            case 2:
-                sm = aiShadingMode_Phong;
-                break;
-            default:
-                sm = aiShadingMode_Gouraud;
-                ASSIMP_LOG_ERROR("OBJ: unexpected illumination model (0-2 recognized)");
+        case 0:
+            sm = aiShadingMode_NoShading;
+            break;
+        case 1:
+            sm = aiShadingMode_Gouraud;
+            break;
+        case 2:
+            sm = aiShadingMode_Phong;
+            break;
+        default:
+            sm = aiShadingMode_Gouraud;
+            ASSIMP_LOG_ERROR("OBJ: unexpected illumination model (0-2 recognized)");
         }
 
         mat->AddProperty<int>(&sm, 1, AI_MATKEY_SHADING_MODEL);

+ 192 - 200
code/AssetLib/Ogre/OgreBinarySerializer.h

@@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
 
 Copyright (c) 2006-2020, assimp team
 
-
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms,
@@ -48,16 +47,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "OgreStructs.h"
 #include <assimp/StreamReader.h>
 
-namespace Assimp
-{
-namespace Ogre
-{
+namespace Assimp {
+namespace Ogre {
 
 typedef Assimp::StreamReaderLE MemoryStreamReader;
 typedef std::shared_ptr<MemoryStreamReader> MemoryStreamReaderPtr;
 
-class OgreBinarySerializer
-{
+class OgreBinarySerializer {
 public:
     /// Imports mesh and returns the result.
     /** @note Fatal unrecoverable errors will throw a DeadlyImportError. */
@@ -71,17 +67,15 @@ public:
     static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh);
 
 private:
-    enum AssetMode
-    {
+    enum AssetMode {
         AM_Mesh,
         AM_Skeleton
     };
 
     OgreBinarySerializer(MemoryStreamReader *reader, AssetMode mode) :
-        m_currentLen(0),
-        m_reader(reader),
-        assetMode(mode)
-    {
+            m_currentLen(0),
+            m_reader(reader),
+            assetMode(mode) {
     }
 
     static MemoryStreamReaderPtr OpenReader(Assimp::IOSystem *pIOHandler, const std::string &filename);
@@ -136,7 +130,7 @@ private:
     // Reader utils
     bool AtEnd() const;
 
-    template<typename T>
+    template <typename T>
     inline T Read();
 
     void ReadBytes(char *dest, size_t numBytes);
@@ -158,155 +152,154 @@ private:
     AssetMode assetMode;
 };
 
-enum MeshChunkId
-{
+enum MeshChunkId {
     M_HEADER = 0x1000,
-        // char*          version          : Version number check
-    M_MESH   = 0x3000,
-        // bool skeletallyAnimated   // important flag which affects h/w buffer policies
-        // Optional M_GEOMETRY chunk
-        M_SUBMESH            = 0x4000,
-            // char* materialName
-            // bool useSharedVertices
-            // unsigned int indexCount
-            // bool indexes32Bit
-            // unsigned int* faceVertexIndices (indexCount)
-            // OR
-            // unsigned short* faceVertexIndices (indexCount)
-            // M_GEOMETRY chunk (Optional: present only if useSharedVertices = false)
-            M_SUBMESH_OPERATION = 0x4010, // optional, trilist assumed if missing
-                // unsigned short operationType
-            M_SUBMESH_BONE_ASSIGNMENT = 0x4100,
-                // Optional bone weights (repeating section)
-                // unsigned int vertexIndex;
-                // unsigned short boneIndex;
-                // float weight;
-            // Optional chunk that matches a texture name to an alias
-            // a texture alias is sent to the submesh material to use this texture name
-            // instead of the one in the texture unit with a matching alias name
-            M_SUBMESH_TEXTURE_ALIAS = 0x4200, // Repeating section
-                // char* aliasName;
-                // char* textureName;
-
-        M_GEOMETRY        = 0x5000, // NB this chunk is embedded within M_MESH and M_SUBMESH
-            // unsigned int vertexCount
-            M_GEOMETRY_VERTEX_DECLARATION = 0x5100,
-                M_GEOMETRY_VERTEX_ELEMENT = 0x5110, // Repeating section
-                    // unsigned short source;   // buffer bind source
-                    // unsigned short type;     // VertexElementType
-                    // unsigned short semantic; // VertexElementSemantic
-                    // unsigned short offset;   // start offset in buffer in bytes
-                    // unsigned short index;    // index of the semantic (for colours and texture coords)
-            M_GEOMETRY_VERTEX_BUFFER = 0x5200, // Repeating section
-                // unsigned short bindIndex;    // Index to bind this buffer to
-                // unsigned short vertexSize;   // Per-vertex size, must agree with declaration at this index
-                M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210,
-                    // raw buffer data
-        M_MESH_SKELETON_LINK = 0x6000,
-            // Optional link to skeleton
-            // char* skeletonName          : name of .skeleton to use
-        M_MESH_BONE_ASSIGNMENT = 0x7000,
-            // Optional bone weights (repeating section)
-            // unsigned int vertexIndex;
-            // unsigned short boneIndex;
-            // float weight;
-        M_MESH_LOD = 0x8000,
-            // Optional LOD information
-            // string strategyName;
-            // unsigned short numLevels;
-            // bool manual;  (true for manual alternate meshes, false for generated)
-            M_MESH_LOD_USAGE = 0x8100,
-            // Repeating section, ordered in increasing depth
-            // NB LOD 0 (full detail from 0 depth) is omitted
-            // LOD value - this is a distance, a pixel count etc, based on strategy
-            // float lodValue;
-                M_MESH_LOD_MANUAL = 0x8110,
-                // Required if M_MESH_LOD section manual = true
-                // String manualMeshName;
-                M_MESH_LOD_GENERATED = 0x8120,
-                // Required if M_MESH_LOD section manual = false
-                // Repeating section (1 per submesh)
-                // unsigned int indexCount;
-                // bool indexes32Bit
-                // unsigned short* faceIndexes;  (indexCount)
-                // OR
-                // unsigned int* faceIndexes;  (indexCount)
-        M_MESH_BOUNDS = 0x9000,
-            // float minx, miny, minz
-            // float maxx, maxy, maxz
-            // float radius
-
-        // Added By DrEvil
-        // optional chunk that contains a table of submesh indexes and the names of
-        // the sub-meshes.
-        M_SUBMESH_NAME_TABLE = 0xA000,
-            // Subchunks of the name table. Each chunk contains an index & string
-            M_SUBMESH_NAME_TABLE_ELEMENT = 0xA100,
-                // short index
-                // char* name
-        // Optional chunk which stores precomputed edge data
-        M_EDGE_LISTS = 0xB000,
-            // Each LOD has a separate edge list
-            M_EDGE_LIST_LOD = 0xB100,
-                // unsigned short lodIndex
-                // bool isManual            // If manual, no edge data here, loaded from manual mesh
-                    // bool isClosed
-                    // unsigned long numTriangles
-                    // unsigned long numEdgeGroups
-                    // Triangle* triangleList
-                        // unsigned long indexSet
-                        // unsigned long vertexSet
-                        // unsigned long vertIndex[3]
-                        // unsigned long sharedVertIndex[3]
-                        // float normal[4]
-
-                    M_EDGE_GROUP = 0xB110,
-                        // unsigned long vertexSet
-                        // unsigned long triStart
-                        // unsigned long triCount
-                        // unsigned long numEdges
-                        // Edge* edgeList
-                            // unsigned long  triIndex[2]
-                            // unsigned long  vertIndex[2]
-                            // unsigned long  sharedVertIndex[2]
-                            // bool degenerate
-        // Optional poses section, referred to by pose keyframes
-        M_POSES = 0xC000,
-            M_POSE = 0xC100,
-                // char* name (may be blank)
-                // unsigned short target    // 0 for shared geometry,
-                                            // 1+ for submesh index + 1
-                // bool includesNormals [1.8+]
-                M_POSE_VERTEX = 0xC111,
-                    // unsigned long vertexIndex
-                    // float xoffset, yoffset, zoffset
-                    // float xnormal, ynormal, znormal (optional, 1.8+)
-        // Optional vertex animation chunk
-        M_ANIMATIONS = 0xD000,
-            M_ANIMATION = 0xD100,
-            // char* name
-            // float length
-            M_ANIMATION_BASEINFO = 0xD105,
-            // [Optional] base keyframe information (pose animation only)
-            // char* baseAnimationName (blank for self)
-            // float baseKeyFrameTime
-            M_ANIMATION_TRACK = 0xD110,
-                // unsigned short type          // 1 == morph, 2 == pose
-                // unsigned short target        // 0 for shared geometry,
-                                                // 1+ for submesh index + 1
-                M_ANIMATION_MORPH_KEYFRAME = 0xD111,
-                    // float time
-                    // bool includesNormals [1.8+]
-                    // float x,y,z          // repeat by number of vertices in original geometry
-                M_ANIMATION_POSE_KEYFRAME = 0xD112,
-                    // float time
-                    M_ANIMATION_POSE_REF = 0xD113, // repeat for number of referenced poses
-                        // unsigned short poseIndex
-                        // float influence
-        // Optional submesh extreme vertex list chink
-        M_TABLE_EXTREMES = 0xE000
-        // unsigned short submesh_index;
-        // float extremes [n_extremes][3];
+    // char*          version          : Version number check
+    M_MESH = 0x3000,
+    // bool skeletallyAnimated   // important flag which affects h/w buffer policies
+    // Optional M_GEOMETRY chunk
+    M_SUBMESH = 0x4000,
+    // char* materialName
+    // bool useSharedVertices
+    // unsigned int indexCount
+    // bool indexes32Bit
+    // unsigned int* faceVertexIndices (indexCount)
+    // OR
+    // unsigned short* faceVertexIndices (indexCount)
+    // M_GEOMETRY chunk (Optional: present only if useSharedVertices = false)
+    M_SUBMESH_OPERATION = 0x4010, // optional, trilist assumed if missing
+    // unsigned short operationType
+    M_SUBMESH_BONE_ASSIGNMENT = 0x4100,
+    // Optional bone weights (repeating section)
+    // unsigned int vertexIndex;
+    // unsigned short boneIndex;
+    // float weight;
+    // Optional chunk that matches a texture name to an alias
+    // a texture alias is sent to the submesh material to use this texture name
+    // instead of the one in the texture unit with a matching alias name
+    M_SUBMESH_TEXTURE_ALIAS = 0x4200, // Repeating section
+    // char* aliasName;
+    // char* textureName;
+
+    M_GEOMETRY = 0x5000, // NB this chunk is embedded within M_MESH and M_SUBMESH
+    // unsigned int vertexCount
+    M_GEOMETRY_VERTEX_DECLARATION = 0x5100,
+    M_GEOMETRY_VERTEX_ELEMENT = 0x5110, // Repeating section
+    // unsigned short source;   // buffer bind source
+    // unsigned short type;     // VertexElementType
+    // unsigned short semantic; // VertexElementSemantic
+    // unsigned short offset;   // start offset in buffer in bytes
+    // unsigned short index;    // index of the semantic (for colours and texture coords)
+    M_GEOMETRY_VERTEX_BUFFER = 0x5200, // Repeating section
+    // unsigned short bindIndex;    // Index to bind this buffer to
+    // unsigned short vertexSize;   // Per-vertex size, must agree with declaration at this index
+    M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210,
+    // raw buffer data
+    M_MESH_SKELETON_LINK = 0x6000,
+    // Optional link to skeleton
+    // char* skeletonName          : name of .skeleton to use
+    M_MESH_BONE_ASSIGNMENT = 0x7000,
+    // Optional bone weights (repeating section)
+    // unsigned int vertexIndex;
+    // unsigned short boneIndex;
+    // float weight;
+    M_MESH_LOD = 0x8000,
+    // Optional LOD information
+    // string strategyName;
+    // unsigned short numLevels;
+    // bool manual;  (true for manual alternate meshes, false for generated)
+    M_MESH_LOD_USAGE = 0x8100,
+    // Repeating section, ordered in increasing depth
+    // NB LOD 0 (full detail from 0 depth) is omitted
+    // LOD value - this is a distance, a pixel count etc, based on strategy
+    // float lodValue;
+    M_MESH_LOD_MANUAL = 0x8110,
+    // Required if M_MESH_LOD section manual = true
+    // String manualMeshName;
+    M_MESH_LOD_GENERATED = 0x8120,
+    // Required if M_MESH_LOD section manual = false
+    // Repeating section (1 per submesh)
+    // unsigned int indexCount;
+    // bool indexes32Bit
+    // unsigned short* faceIndexes;  (indexCount)
+    // OR
+    // unsigned int* faceIndexes;  (indexCount)
+    M_MESH_BOUNDS = 0x9000,
+    // float minx, miny, minz
+    // float maxx, maxy, maxz
+    // float radius
+
+    // Added By DrEvil
+    // optional chunk that contains a table of submesh indexes and the names of
+    // the sub-meshes.
+    M_SUBMESH_NAME_TABLE = 0xA000,
+    // Subchunks of the name table. Each chunk contains an index & string
+    M_SUBMESH_NAME_TABLE_ELEMENT = 0xA100,
+    // short index
+    // char* name
+    // Optional chunk which stores precomputed edge data
+    M_EDGE_LISTS = 0xB000,
+    // Each LOD has a separate edge list
+    M_EDGE_LIST_LOD = 0xB100,
+    // unsigned short lodIndex
+    // bool isManual            // If manual, no edge data here, loaded from manual mesh
+    // bool isClosed
+    // unsigned long numTriangles
+    // unsigned long numEdgeGroups
+    // Triangle* triangleList
+    // unsigned long indexSet
+    // unsigned long vertexSet
+    // unsigned long vertIndex[3]
+    // unsigned long sharedVertIndex[3]
+    // float normal[4]
+
+    M_EDGE_GROUP = 0xB110,
+    // unsigned long vertexSet
+    // unsigned long triStart
+    // unsigned long triCount
+    // unsigned long numEdges
+    // Edge* edgeList
+    // unsigned long  triIndex[2]
+    // unsigned long  vertIndex[2]
+    // unsigned long  sharedVertIndex[2]
+    // bool degenerate
+    // Optional poses section, referred to by pose keyframes
+    M_POSES = 0xC000,
+    M_POSE = 0xC100,
+    // char* name (may be blank)
+    // unsigned short target    // 0 for shared geometry,
+    // 1+ for submesh index + 1
+    // bool includesNormals [1.8+]
+    M_POSE_VERTEX = 0xC111,
+    // unsigned long vertexIndex
+    // float xoffset, yoffset, zoffset
+    // float xnormal, ynormal, znormal (optional, 1.8+)
+    // Optional vertex animation chunk
+    M_ANIMATIONS = 0xD000,
+    M_ANIMATION = 0xD100,
+    // char* name
+    // float length
+    M_ANIMATION_BASEINFO = 0xD105,
+    // [Optional] base keyframe information (pose animation only)
+    // char* baseAnimationName (blank for self)
+    // float baseKeyFrameTime
+    M_ANIMATION_TRACK = 0xD110,
+    // unsigned short type          // 1 == morph, 2 == pose
+    // unsigned short target        // 0 for shared geometry,
+    // 1+ for submesh index + 1
+    M_ANIMATION_MORPH_KEYFRAME = 0xD111,
+    // float time
+    // bool includesNormals [1.8+]
+    // float x,y,z          // repeat by number of vertices in original geometry
+    M_ANIMATION_POSE_KEYFRAME = 0xD112,
+    // float time
+    M_ANIMATION_POSE_REF = 0xD113, // repeat for number of referenced poses
+    // unsigned short poseIndex
+    // float influence
+    // Optional submesh extreme vertex list chink
+    M_TABLE_EXTREMES = 0xE000
+    // unsigned short submesh_index;
+    // float extremes [n_extremes][3];
 };
 
 /*
@@ -353,49 +346,48 @@ static std::string MeshHeaderToString(MeshChunkId id)
 }
 */
 
-enum SkeletonChunkId
-{
-    SKELETON_HEADER             = 0x1000,
-        // char* version           : Version number check
-        SKELETON_BLENDMODE      = 0x1010, // optional
-            // unsigned short blendmode     : SkeletonAnimationBlendMode
-    SKELETON_BONE               = 0x2000,
+enum SkeletonChunkId {
+    SKELETON_HEADER = 0x1000,
+    // char* version           : Version number check
+    SKELETON_BLENDMODE = 0x1010, // optional
+    // unsigned short blendmode     : SkeletonAnimationBlendMode
+    SKELETON_BONE = 0x2000,
     // Repeating section defining each bone in the system.
     // Bones are assigned indexes automatically based on their order of declaration
     // starting with 0.
-        // char* name                      : name of the bone
-        // unsigned short handle            : handle of the bone, should be contiguous & start at 0
-        // Vector3 position              : position of this bone relative to parent
-        // Quaternion orientation          : orientation of this bone relative to parent
-        // Vector3 scale                    : scale of this bone relative to parent
-    SKELETON_BONE_PARENT        = 0x3000,
+    // char* name                      : name of the bone
+    // unsigned short handle            : handle of the bone, should be contiguous & start at 0
+    // Vector3 position              : position of this bone relative to parent
+    // Quaternion orientation          : orientation of this bone relative to parent
+    // Vector3 scale                    : scale of this bone relative to parent
+    SKELETON_BONE_PARENT = 0x3000,
     // Record of the parent of a single bone, used to build the node tree
     // Repeating section, listed in Bone Index order, one per Bone
-        // unsigned short handle             : child bone
-        // unsigned short parentHandle   : parent bone
-    SKELETON_ANIMATION          = 0x4000,
+    // unsigned short handle             : child bone
+    // unsigned short parentHandle   : parent bone
+    SKELETON_ANIMATION = 0x4000,
     // A single animation for this skeleton
-        // char* name                      : Name of the animation
-        // float length                   : Length of the animation in seconds
-        SKELETON_ANIMATION_BASEINFO = 0x4010,
-        // [Optional] base keyframe information
-        // char* baseAnimationName (blank for self)
-        // float baseKeyFrameTime
-        SKELETON_ANIMATION_TRACK    = 0x4100,
-        // A single animation track (relates to a single bone)
-        // Repeating section (within SKELETON_ANIMATION)
-            // unsigned short boneIndex  : Index of bone to apply to
-            SKELETON_ANIMATION_TRACK_KEYFRAME = 0x4110,
-            // A single keyframe within the track
-            // Repeating section
-                // float time                   : The time position (seconds)
-                // Quaternion rotate            : Rotation to apply at this keyframe
-                // Vector3 translate            : Translation to apply at this keyframe
-                // Vector3 scale                : Scale to apply at this keyframe
-    SKELETON_ANIMATION_LINK     = 0x5000
+    // char* name                      : Name of the animation
+    // float length                   : Length of the animation in seconds
+    SKELETON_ANIMATION_BASEINFO = 0x4010,
+    // [Optional] base keyframe information
+    // char* baseAnimationName (blank for self)
+    // float baseKeyFrameTime
+    SKELETON_ANIMATION_TRACK = 0x4100,
+    // A single animation track (relates to a single bone)
+    // Repeating section (within SKELETON_ANIMATION)
+    // unsigned short boneIndex  : Index of bone to apply to
+    SKELETON_ANIMATION_TRACK_KEYFRAME = 0x4110,
+    // A single keyframe within the track
+    // Repeating section
+    // float time                   : The time position (seconds)
+    // Quaternion rotate            : Rotation to apply at this keyframe
+    // Vector3 translate            : Translation to apply at this keyframe
+    // Vector3 scale                : Scale to apply at this keyframe
+    SKELETON_ANIMATION_LINK = 0x5000
     // Link to another skeleton, to re-use its animations
-        // char* skeletonName                   : name of skeleton to get animations from
-        // float scale                          : scale to apply to trans/scale keys
+    // char* skeletonName                   : name of skeleton to get animations from
+    // float scale                          : scale to apply to trans/scale keys
 };
 
 /*
@@ -416,8 +408,8 @@ static std::string SkeletonHeaderToString(SkeletonChunkId id)
     return "Unknown_SkeletonChunkId";
 }
 */
-} // Ogre
-} // Assimp
+} // namespace Ogre
+} // namespace Assimp
 
 #endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
 #endif // AI_OGREBINARYSERIALIZER_H_INC

+ 8 - 8
code/AssetLib/Ogre/OgreXmlSerializer.cpp

@@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 namespace Assimp {
 namespace Ogre {
 
-AI_WONT_RETURN void ThrowAttibuteError(const XmlParser *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX;
+//AI_WONT_RETURN void ThrowAttibuteError(const XmlParser *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX;
 
 AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::string &name, const std::string &error) {
     if (!error.empty()) {
@@ -69,7 +69,7 @@ AI_WONT_RETURN void ThrowAttibuteError(const std::string &nodeName, const std::s
 template <>
 int32_t OgreXmlSerializer::ReadAttribute<int32_t>(XmlNode &xmlNode, const char *name) const {
     if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(mParser, name);
+        ThrowAttibuteError(xmlNode.name(), name, "Not found");
     }
     pugi::xml_attribute attr = xmlNode.attribute(name);
     return static_cast<int32_t>(attr.as_int());
@@ -78,14 +78,14 @@ int32_t OgreXmlSerializer::ReadAttribute<int32_t>(XmlNode &xmlNode, const char *
 template <>
 uint32_t OgreXmlSerializer::ReadAttribute<uint32_t>(XmlNode &xmlNode, const char *name) const {
     if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(mParser, name);
+        ThrowAttibuteError(xmlNode.name(), name, "Not found");
     }
 
     // @note This is hackish. But we are never expecting unsigned values that go outside the
     //       int32_t range. Just monitor for negative numbers and kill the import.
     int32_t temp = ReadAttribute<int32_t>(xmlNode, name);
     if (temp < 0) {
-        ThrowAttibuteError(mParser, name, "Found a negative number value where expecting a uint32_t value");
+        ThrowAttibuteError(xmlNode.name(), name, "Found a negative number value where expecting a uint32_t value");
     }
 
     return static_cast<uint32_t>(temp);
@@ -94,7 +94,7 @@ uint32_t OgreXmlSerializer::ReadAttribute<uint32_t>(XmlNode &xmlNode, const char
 template <>
 uint16_t OgreXmlSerializer::ReadAttribute<uint16_t>(XmlNode &xmlNode, const char *name) const {
     if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(mParser, name);
+        ThrowAttibuteError(xmlNode.name(), name, "Not found");
     }
 
     return static_cast<uint16_t>(xmlNode.attribute(name).as_int());
@@ -103,7 +103,7 @@ uint16_t OgreXmlSerializer::ReadAttribute<uint16_t>(XmlNode &xmlNode, const char
 template <>
 float OgreXmlSerializer::ReadAttribute<float>(XmlNode &xmlNode, const char *name) const {
     if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(mParser, name);
+        ThrowAttibuteError(xmlNode.name(), name, "Not found");
     }
     
     return xmlNode.attribute(name).as_float();
@@ -112,7 +112,7 @@ float OgreXmlSerializer::ReadAttribute<float>(XmlNode &xmlNode, const char *name
 template <>
 std::string OgreXmlSerializer::ReadAttribute<std::string>(XmlNode &xmlNode, const char *name) const {
     if (!XmlParser::hasAttribute(xmlNode, name)) {
-        ThrowAttibuteError(mParser, name);
+        ThrowAttibuteError(xmlNode.name(), name, "Not found");
     }
 
     return xmlNode.attribute(name).as_string();
@@ -127,7 +127,7 @@ bool OgreXmlSerializer::ReadAttribute<bool>(XmlNode &xmlNode, const char *name)
         return false;
     } 
 
-    ThrowAttibuteError(mParser, name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'");
+    ThrowAttibuteError(xmlNode.name(), name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'");
     return false;
 }
 

+ 13 - 1
code/AssetLib/X3D/X3DImporter.cpp

@@ -147,6 +147,16 @@ void X3DImporter::Clear() {
     }
 }
 
+void X3DImporter::ParseFile(const std::string &file, IOSystem *pIOHandler) {
+    ai_assert(nullptr != pIOHandler);
+
+    static const std::string mode = "rb";
+    std::unique_ptr<IOStream> fileStream(pIOHandler->Open(file, mode));
+    if (!fileStream.get()) {
+        throw DeadlyImportError("Failed to open file " + file + ".");
+    }
+}
+
 /*********************************************************************************************************************************************/
 /************************************************************ Functions: find set ************************************************************/
 /*********************************************************************************************************************************************/
@@ -154,7 +164,9 @@ void X3DImporter::Clear() {
 bool X3DImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const {
     const std::string extension = GetExtension(pFile);
 
-    if ((extension == "x3d") || (extension == "x3db")) return true;
+    if ((extension == "x3d") || (extension == "x3db")) {
+        return true;
+    }
 
     if (!extension.length() || pCheckSig) {
         const char *tokens[] = { "DOCTYPE X3D PUBLIC", "http://www.web3d.org/specifications/x3d" };

+ 3 - 4
include/assimp/XmlParser.h

@@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
 
 Copyright (c) 2006-2020, assimp team
 
-
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms,
@@ -119,6 +118,7 @@ public:
     }
 
     TNodeType *parse(IOStream *stream) {
+        mRoot = nullptr;
         if (nullptr == stream) {
             return nullptr;
         }
@@ -126,10 +126,9 @@ public:
         mData.resize(stream->FileSize());
         stream->Read(&mData[0], mData.size(), 1);
         mDoc = new pugi::xml_document();
-        pugi::xml_parse_result result = mDoc->load_string(&mData[0]);
+        pugi::xml_parse_result result = mDoc->load_string(&mData[0], pugi::parse_default | pugi::parse_declaration);
         if (result.status == pugi::status_ok) {
-            pugi::xml_node root = *(mDoc->children().begin());
-
+            pugi::xml_node root = mDoc->document_element();
             mRoot = &root;
         }
 

+ 2 - 2
test/CMakeLists.txt

@@ -2,8 +2,7 @@
 # ----------------------------------------------------------------------
 #
 # Copyright (c) 2006-2020, assimp team
-
-
+#
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -88,6 +87,7 @@ SET( COMMON
   unit/Common/utLineSplitter.cpp
   unit/Common/utSpatialSort.cpp
   unit/Common/utAssertHandler.cpp
+  unit/Common/utXmlParser.cpp
 )
 
 SET( IMPORTERS

+ 0 - 2
test/unit/ut3DImportExport.cpp

@@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
 
 Copyright (c) 2006-2020, assimp team
 
-
-
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms,