From 61fb52b57d040099697b628d5b403350f7509ee9 Mon Sep 17 00:00:00 2001 From: Syoyo Fujita Date: Sat, 6 Feb 2016 17:26:44 +0900 Subject: [PATCH] Support loading glTF from memory(string). --- tiny_gltf_loader.h | 59 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/tiny_gltf_loader.h b/tiny_gltf_loader.h index 49f150b..0481db6 100644 --- a/tiny_gltf_loader.h +++ b/tiny_gltf_loader.h @@ -31,6 +31,7 @@ // // // Version: +// - v0.9.1 Support loading glTF asset from memory // - v0.9.0 Initial // // Tiny glTF loader is using following libraries: @@ -203,10 +204,17 @@ public: TinyGLTFLoader(){}; ~TinyGLTFLoader(){}; - /// Loads GLTF asset from a file. - /// Returns false and set error string to `err` if there's and parsing error. + /// Loads glTF asset from a file. + /// Returns false and set error string to `err` if there's an error. bool LoadFromFile(Scene &scene, std::string &err, const std::string &filename); + + /// Loads glTF asset from string(memory). + /// `length` = strlen(str); + /// Returns false and set error string to `err` if there's an error. + bool LoadFromString(Scene &scene, std::string &err, + const char* str, const unsigned int length, const std::string& baseDir); + }; } // namespace tinygltf @@ -1051,19 +1059,10 @@ bool ParseMaterial(Material &material, std::string &err, } } -bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, - const std::string &filename) { - std::stringstream ss; - - std::ifstream ifs(filename.c_str()); - if (!ifs) { - ss << "Failed to open file: " << filename << std::endl; - err = ss.str(); - return false; - } - +bool TinyGLTFLoader::LoadFromString(Scene &scene, std::string &err, + const char *str, unsigned int length, const std::string& baseDir) { picojson::value v; - std::string perr = picojson::parse(v, ifs); + std::string perr = picojson::parse(v, str, str + length); if (!perr.empty()) { err = perr; @@ -1120,8 +1119,6 @@ bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, scene.nodes.clear(); scene.defaultScene = ""; - std::string basedir = GetBaseDir(filename); - // 0. Parse Asset if (v.contains("asset") && v.get("asset").is()) { const picojson::object &root = v.get("asset").get(); @@ -1139,7 +1136,7 @@ bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, Buffer buffer; if (!ParseBuffer(buffer, err, (it->second).get(), - basedir)) { + baseDir)) { return false; } @@ -1277,7 +1274,7 @@ bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, Image image; if (!ParseImage(image, err, (it->second).get(), - basedir)) { + baseDir)) { return false; } @@ -1288,6 +1285,32 @@ bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, return true; } +bool TinyGLTFLoader::LoadFromFile(Scene &scene, std::string &err, + const std::string &filename) { + std::stringstream ss; + + std::ifstream f(filename.c_str()); + if (!f) { + ss << "Failed to open file: " << filename << std::endl; + err = ss.str(); + return false; + } + + f.seekg(0, f.end); + size_t sz = f.tellg(); + std::vector buf(sz); + + f.seekg(0, f.beg); + f.read(&buf.at(0), sz); + f.close(); + + std::string basedir = GetBaseDir(filename); + + bool ret = LoadFromString(scene, err, &buf.at(0), buf.size(), basedir); + + return ret; +} + #endif // TINYGLTF_LOADER_IMPLEMENTATION #endif // TINY_GLTF_LOADER_H