Răsfoiți Sursa

Fixed MMD Importer not loading files from buffer and enabled unit test

RedSkittleFox 3 ani în urmă
părinte
comite
f26dc74f21
2 a modificat fișierele cu 23 adăugiri și 16 ștergeri
  1. 20 13
      code/AssetLib/MMD/MMDImporter.cpp
  2. 3 3
      test/unit/utPMXImporter.cpp

+ 20 - 13
code/AssetLib/MMD/MMDImporter.cpp

@@ -55,6 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <fstream>
 #include <iomanip>
 #include <memory>
+#include <strstream>
 
 static const aiImporterDesc desc = { "MMD Importer",
     "",
@@ -102,26 +103,32 @@ const aiImporterDesc *MMDImporter::GetInfo() const {
 // ------------------------------------------------------------------------------------------------
 //  MMD import implementation
 void MMDImporter::InternReadFile(const std::string &file, aiScene *pScene,
-        IOSystem * /*pIOHandler*/) {
-    // Read file by istream
-    std::filebuf fb;
-    if (!fb.open(file, std::ios::in | std::ios::binary)) {
-        throw DeadlyImportError("Failed to open file ", file, ".");
-    }
+        IOSystem* pIOHandler) {
 
-    std::istream fileStream(&fb);
+    auto streamCloser = [&](IOStream *pStream) {
+        pIOHandler->Close(pStream);
+    };
 
-    // Get the file-size and validate it, throwing an exception when fails
-    fileStream.seekg(0, fileStream.end);
-    size_t fileSize = static_cast<size_t>(fileStream.tellg());
-    fileStream.seekg(0, fileStream.beg);
+    static const std::string mode = "rb";
+    const std::unique_ptr<IOStream, decltype(streamCloser)> fileStream(pIOHandler->Open(file, mode), streamCloser);
 
-    if (fileSize < sizeof(pmx::PmxModel)) {
+    if (fileStream == nullptr) {
+        throw DeadlyImportError("Failed to open file ", file, ".");
+    }
+
+    const size_t fileSize = fileStream->FileSize();
+    if (fileSize < sizeof(pmx::PmxModel))
+    {
         throw DeadlyImportError(file, " is too small.");
     }
 
+    std::vector<char> contents(fileStream->FileSize());
+    fileStream->Read(std::data(contents), 1, std::size(contents));
+
+    std::istrstream is(static_cast<const char *>(std::data(contents)), std::size(contents));
+
     pmx::PmxModel model;
-    model.Read(&fileStream);
+    model.Read(&is);
 
     CreateDataFromImport(&model, pScene);
 }

+ 3 - 3
test/unit/utPMXImporter.cpp

@@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "UnitTestPCH.h"
 #include "AbstractImportExportBase.h"
 #include "AssetLib/MMD/MMDImporter.h"
+#include "assimp/postprocess.h"
 
 #include <assimp/Importer.hpp>
 
@@ -51,9 +52,8 @@ class utPMXImporter : public AbstractImportExportBase {
 public:
     virtual bool importerTest() {
         Assimp::Importer importer;
-        /*const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/MMD/Alicia_blade.pmx", aiProcess_ValidateDataStructure );
-        return nullptr != scene;*/
-        return true;
+        const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/MMD/Alicia_blade.pmx", aiProcess_ValidateDataStructure );
+        return nullptr != scene;
     }
 };