diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index e1046c622..c942fd766 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/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 ¤tNode : node.children()) { const std::string ¤tName = 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; } diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index b6e1f9061..0c52a4e75 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/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(&sm, 1, AI_MATKEY_SHADING_MODEL); diff --git a/code/AssetLib/Ogre/OgreBinarySerializer.h b/code/AssetLib/Ogre/OgreBinarySerializer.h index 0b88641aa..011c4775a 100644 --- a/code/AssetLib/Ogre/OgreBinarySerializer.h +++ b/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 -namespace Assimp -{ -namespace Ogre -{ +namespace Assimp { +namespace Ogre { typedef Assimp::StreamReaderLE MemoryStreamReader; typedef std::shared_ptr 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 + template 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; + // 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 + 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] + // 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]; + 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 diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 3fb16236d..9555b052b 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/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(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(attr.as_int()); @@ -78,14 +78,14 @@ int32_t OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char * template <> uint32_t OgreXmlSerializer::ReadAttribute(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(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(temp); @@ -94,7 +94,7 @@ uint32_t OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char template <> uint16_t OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char *name) const { if (!XmlParser::hasAttribute(xmlNode, name)) { - ThrowAttibuteError(mParser, name); + ThrowAttibuteError(xmlNode.name(), name, "Not found"); } return static_cast(xmlNode.attribute(name).as_int()); @@ -103,7 +103,7 @@ uint16_t OgreXmlSerializer::ReadAttribute(XmlNode &xmlNode, const char template <> float OgreXmlSerializer::ReadAttribute(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(XmlNode &xmlNode, const char *name template <> std::string OgreXmlSerializer::ReadAttribute(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(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; } diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index 4cec09887..9cf916548 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/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 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" }; diff --git a/include/assimp/XmlParser.h b/include/assimp/XmlParser.h index ff04c0d8c..aa1c0c8b2 100644 --- a/include/assimp/XmlParser.h +++ b/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; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8e1746ce2..a45a72078 100644 --- a/test/CMakeLists.txt +++ b/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 diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp index 4588289e2..f77c4181e 100644 --- a/test/unit/ut3DImportExport.cpp +++ b/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,