|
@@ -3,7 +3,7 @@
|
|
|
Open Asset Import Library (assimp)
|
|
|
---------------------------------------------------------------------------
|
|
|
|
|
|
-Copyright (c) 2006-2022, assimp team
|
|
|
+Copyright (c) 2006-2024, assimp team
|
|
|
|
|
|
All rights reserved.
|
|
|
|
|
@@ -69,14 +69,6 @@ static constexpr aiImporterDesc desc = {
|
|
|
"xml irrmesh"
|
|
|
};
|
|
|
|
|
|
-// ------------------------------------------------------------------------------------------------
|
|
|
-// Constructor to be privately used by Importer
|
|
|
-IRRMeshImporter::IRRMeshImporter() = default;
|
|
|
-
|
|
|
-// ------------------------------------------------------------------------------------------------
|
|
|
-// Destructor, private as well
|
|
|
-IRRMeshImporter::~IRRMeshImporter() = default;
|
|
|
-
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
|
// Returns whether the class can handle the format of the given file.
|
|
|
bool IRRMeshImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /*checkSig*/) const {
|
|
@@ -116,8 +108,9 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
std::unique_ptr<IOStream> file(pIOHandler->Open(pFile));
|
|
|
|
|
|
// Check whether we can read from the file
|
|
|
- if (file == nullptr)
|
|
|
+ if (file == nullptr) {
|
|
|
throw DeadlyImportError("Failed to open IRRMESH file ", pFile);
|
|
|
+ }
|
|
|
|
|
|
// Construct the irrXML parser
|
|
|
XmlParser parser;
|
|
@@ -148,13 +141,11 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
// int vertexFormat = 0; // 0 = normal; 1 = 2 tcoords, 2 = tangents
|
|
|
bool useColors = false;
|
|
|
|
|
|
- /*
|
|
|
- ** irrmesh files have a top level <mesh> owning multiple <buffer> nodes.
|
|
|
- ** Each <buffer> contains <material>, <vertices>, and <indices>
|
|
|
- ** <material> tags here directly owns the material data specs
|
|
|
- ** <vertices> are a vertex per line, contains position, UV1 coords, maybe UV2, normal, tangent, bitangent
|
|
|
- ** <boundingbox> is ignored, I think assimp recalculates those?
|
|
|
- */
|
|
|
+ // irrmesh files have a top level <mesh> owning multiple <buffer> nodes.
|
|
|
+ // Each <buffer> contains <material>, <vertices>, and <indices>
|
|
|
+ // <material> tags here directly owns the material data specs
|
|
|
+ // <vertices> are a vertex per line, contains position, UV1 coords, maybe UV2, normal, tangent, bitangent
|
|
|
+ // <boundingbox> is ignored, I think assimp recalculates those?
|
|
|
|
|
|
// Parse the XML file
|
|
|
pugi::xml_node const &meshNode = root.child("mesh");
|
|
@@ -201,7 +192,6 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
// This is possible ... remove the mesh from the list and skip further reading
|
|
|
ASSIMP_LOG_WARN("IRRMESH: Found mesh with zero vertices");
|
|
|
releaseMaterial(&curMat);
|
|
|
- // releaseMesh(&curMesh);
|
|
|
continue; // Bail out early
|
|
|
};
|
|
|
|
|
@@ -331,7 +321,8 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
|
|
|
// NOTE this might explode for UTF-16 and wchars
|
|
|
const char *sz = indicesNode.text().get();
|
|
|
- const char *end = sz + std::strlen(sz) + 1;
|
|
|
+ const char *end = sz + std::strlen(sz);
|
|
|
+
|
|
|
// For each index loop over aiMesh faces
|
|
|
while (SkipSpacesAndLineEnd(&sz, end)) {
|
|
|
if (curFace >= faceEnd) {
|
|
@@ -377,8 +368,9 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
}
|
|
|
}
|
|
|
// We should be at the end of mFaces
|
|
|
- if (curFace != faceEnd)
|
|
|
+ if (curFace != faceEnd) {
|
|
|
ASSIMP_LOG_ERROR("IRRMESH: Not enough indices");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Finish processing the mesh - do some small material workarounds
|
|
@@ -388,8 +380,7 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile,
|
|
|
aiMaterial *mat = (aiMaterial *)curMat;
|
|
|
mat->AddProperty(&curColors[0].a, 1, AI_MATKEY_OPACITY);
|
|
|
}
|
|
|
- // textMeaning = 2;
|
|
|
-
|
|
|
+
|
|
|
// end of previous buffer. A material and a mesh should be there
|
|
|
if (!curMat || !curMesh) {
|
|
|
ASSIMP_LOG_ERROR("IRRMESH: A buffer must contain a mesh and a material");
|