diff --git a/examples/gl_viewer/gl_viewer.cpp b/examples/gl_viewer/gl_viewer.cpp index 2e15ba2b9..0c192f314 100644 --- a/examples/gl_viewer/gl_viewer.cpp +++ b/examples/gl_viewer/gl_viewer.cpp @@ -333,28 +333,31 @@ bool loadGltf(Viewer* viewer, std::string_view cPath) { std::cout << "Loading " << cPath << '\n'; // Parse the glTF file and get the constructed asset - { + { static constexpr auto supportedExtensions = fastgltf::Extensions::KHR_mesh_quantization | fastgltf::Extensions::KHR_texture_transform | fastgltf::Extensions::KHR_materials_variants; - fastgltf::Parser parser(supportedExtensions); + fastgltf::Parser parser(supportedExtensions); - auto path = std::filesystem::path{cPath}; + auto path = std::filesystem::path{cPath}; - constexpr auto gltfOptions = - fastgltf::Options::DontRequireValidAssetMember | - fastgltf::Options::AllowDouble | - fastgltf::Options::LoadGLBBuffers | - fastgltf::Options::LoadExternalBuffers | - fastgltf::Options::LoadExternalImages | + constexpr auto gltfOptions = + fastgltf::Options::DontRequireValidAssetMember | + fastgltf::Options::AllowDouble | + fastgltf::Options::LoadGLBBuffers | + fastgltf::Options::LoadExternalBuffers | + fastgltf::Options::LoadExternalImages | fastgltf::Options::GenerateMeshIndices; - fastgltf::GltfDataBuffer data; - data.loadFromFile(path); + fastgltf::GltfFileStream data(path); + if (!data.isOpen()) { + std::cerr << "Failed to open glTF file: " << path << '\n'; + return false; + } - auto asset = parser.loadGltf(&data, path.parent_path(), gltfOptions); + auto asset = parser.loadGltf(data, path.parent_path(), gltfOptions); if (asset.error() != fastgltf::Error::None) { std::cerr << "Failed to load glTF: " << fastgltf::getErrorMessage(asset.error()) << '\n'; return false; diff --git a/src/fastgltf.cpp b/src/fastgltf.cpp index 98f30ee25..47c4190e5 100644 --- a/src/fastgltf.cpp +++ b/src/fastgltf.cpp @@ -3754,6 +3754,7 @@ std::size_t fg::GltfDataBuffer::totalSize() { fg::GltfFileStream::GltfFileStream(const std::filesystem::path &path) : fileStream(path, std::ios::binary) { fileSize = std::filesystem::file_size(path); + reset(); } bool fg::GltfFileStream::isOpen() const { @@ -3840,24 +3841,30 @@ bool fg::AndroidGltfDataBuffer::loadFromAndroidAsset(const fs::path& path, std:: #pragma region Parser fastgltf::GltfType fg::determineGltfFileType(GltfDataGetter& data) { + GltfType ret = GltfType::Invalid; + // We'll try and read a BinaryGltfHeader from the buffer to see if the magic is correct. BinaryGltfHeader header = {}; data.read(&header, sizeof header); if (header.magic == binaryGltfHeaderMagic) { - return GltfType::GLB; + ret = GltfType::GLB; } + data.reset(); - // First, check if any of the first four characters is a '{'. + // Check if any of the first four characters is a '{'. std::array begin = {}; data.read(begin.data(), begin.size()); for (const auto& i : begin) { if ((char)i == ' ') continue; - if ((char)i == '{') - return GltfType::glTF; + if ((char)i == '{') { + ret = GltfType::glTF; + break; + } } - return GltfType::Invalid; + data.reset(); + return ret; } fg::Parser::Parser(Extensions extensionsToLoad) noexcept {