From a2bdfdd05a6b3badbe4577092457c24054f27e71 Mon Sep 17 00:00:00 2001 From: Marco Feuerstein Date: Thu, 22 Jun 2023 13:58:51 +0200 Subject: [PATCH 1/4] Improve binary check for gltf and gltf2. By checking the magic token we don't depend on the extension any more and follow the official way to detect a gltf file as binary, see also https://github.com/KhronosGroup/glTF/blob/main/extensions/1.0/Khronos/KHR_binary_glTF/README.md#header and https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#binary-header. --- code/AssetLib/glTF/glTFImporter.cpp | 4 ++-- code/AssetLib/glTF2/glTF2Importer.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 61c11f594..db587ad69 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -93,7 +93,7 @@ const aiImporterDesc *glTFImporter::GetInfo() const { bool glTFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { glTF::Asset asset(pIOHandler); try { - asset.Load(pFile, GetExtension(pFile) == "glb"); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); return asset.asset; } catch (...) { return false; @@ -697,7 +697,7 @@ void glTFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOS // read the asset file glTF::Asset asset(pIOHandler); - asset.Load(pFile, GetExtension(pFile) == "glb"); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); // // Copy the data out diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 942c63c85..6371d2bd5 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -112,7 +112,8 @@ bool glTF2Importer::CanRead(const std::string &filename, IOSystem *pIOHandler, b if (pIOHandler) { glTF2::Asset asset(pIOHandler); - return asset.CanRead(filename, extension == "glb"); + return asset.CanRead(filename, CheckMagicToken(pIOHandler, filename, AI_GLB_MAGIC_NUMBER, + AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); } return false; @@ -1678,7 +1679,7 @@ void glTF2Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IO // read the asset file glTF2::Asset asset(pIOHandler, static_cast(mSchemaDocumentProvider)); - asset.Load(pFile, GetExtension(pFile) == "glb"); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); if (asset.scene) { pScene->mName = asset.scene->name; } From 1c0f3c5f8753040c5a84125697d1177b8e7e5d1b Mon Sep 17 00:00:00 2001 From: Marco Feuerstein Date: Mon, 26 Jun 2023 14:21:10 +0200 Subject: [PATCH 2/4] Fix string length calculation. --- code/AssetLib/glTF/glTFImporter.cpp | 4 ++-- code/AssetLib/glTF2/glTF2Importer.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index db587ad69..744b1d1e3 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -93,7 +93,7 @@ const aiImporterDesc *glTFImporter::GetInfo() const { bool glTFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { glTF::Asset asset(pIOHandler); try { - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); return asset.asset; } catch (...) { return false; @@ -697,7 +697,7 @@ void glTFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOS // read the asset file glTF::Asset asset(pIOHandler); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); // // Copy the data out diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 6371d2bd5..824fa7fcd 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -113,7 +113,7 @@ bool glTF2Importer::CanRead(const std::string &filename, IOSystem *pIOHandler, b if (pIOHandler) { glTF2::Asset asset(pIOHandler); return asset.CanRead(filename, CheckMagicToken(pIOHandler, filename, AI_GLB_MAGIC_NUMBER, - AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); + strlen(AI_GLB_MAGIC_NUMBER))); } return false; @@ -1679,7 +1679,7 @@ void glTF2Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IO // read the asset file glTF2::Asset asset(pIOHandler, static_cast(mSchemaDocumentProvider)); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, AI_COUNT_OF(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); if (asset.scene) { pScene->mName = asset.scene->name; } From 17fac97b045316e68dabcd1edede6f3326d0c25b Mon Sep 17 00:00:00 2001 From: Marco Feuerstein Date: Mon, 26 Jun 2023 15:18:31 +0200 Subject: [PATCH 3/4] Fix magic token usage. --- code/AssetLib/glTF/glTFImporter.cpp | 4 ++-- code/AssetLib/glTF2/glTF2Importer.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 744b1d1e3..27dd1f0e9 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -93,7 +93,7 @@ const aiImporterDesc *glTFImporter::GetInfo() const { bool glTFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { glTF::Asset asset(pIOHandler); try { - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); return asset.asset; } catch (...) { return false; @@ -697,7 +697,7 @@ void glTFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOS // read the asset file glTF::Asset asset(pIOHandler); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); // // Copy the data out diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 824fa7fcd..e5058bd4b 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -113,7 +113,7 @@ bool glTF2Importer::CanRead(const std::string &filename, IOSystem *pIOHandler, b if (pIOHandler) { glTF2::Asset asset(pIOHandler); return asset.CanRead(filename, CheckMagicToken(pIOHandler, filename, AI_GLB_MAGIC_NUMBER, - strlen(AI_GLB_MAGIC_NUMBER))); + 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); } return false; @@ -1679,7 +1679,7 @@ void glTF2Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IO // read the asset file glTF2::Asset asset(pIOHandler, static_cast(mSchemaDocumentProvider)); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); if (asset.scene) { pScene->mName = asset.scene->name; } From 2875de132f3a402100785f12582a9337c3a66cd6 Mon Sep 17 00:00:00 2001 From: Marco Feuerstein Date: Thu, 29 Jun 2023 08:17:08 +0200 Subject: [PATCH 4/4] Fix compilation on windows. --- code/AssetLib/glTF/glTFImporter.cpp | 10 ++++++++-- code/AssetLib/glTF2/glTF2Importer.cpp | 12 +++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 27dd1f0e9..110a2a52f 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -93,7 +93,10 @@ const aiImporterDesc *glTFImporter::GetInfo() const { bool glTFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool /* checkSig */) const { glTF::Asset asset(pIOHandler); try { - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, + CheckMagicToken( + pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, + static_cast(strlen(AI_GLB_MAGIC_NUMBER)))); return asset.asset; } catch (...) { return false; @@ -697,7 +700,10 @@ void glTFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOS // read the asset file glTF::Asset asset(pIOHandler); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, + CheckMagicToken( + pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, + static_cast(strlen(AI_GLB_MAGIC_NUMBER)))); // // Copy the data out diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index e5058bd4b..86fd0ab7e 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -112,8 +112,11 @@ bool glTF2Importer::CanRead(const std::string &filename, IOSystem *pIOHandler, b if (pIOHandler) { glTF2::Asset asset(pIOHandler); - return asset.CanRead(filename, CheckMagicToken(pIOHandler, filename, AI_GLB_MAGIC_NUMBER, - 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); + return asset.CanRead( + filename, + CheckMagicToken( + pIOHandler, filename, AI_GLB_MAGIC_NUMBER, 1, 0, + static_cast(strlen(AI_GLB_MAGIC_NUMBER)))); } return false; @@ -1679,7 +1682,10 @@ void glTF2Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IO // read the asset file glTF2::Asset asset(pIOHandler, static_cast(mSchemaDocumentProvider)); - asset.Load(pFile, CheckMagicToken(pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, strlen(AI_GLB_MAGIC_NUMBER))); + asset.Load(pFile, + CheckMagicToken( + pIOHandler, pFile, AI_GLB_MAGIC_NUMBER, 1, 0, + static_cast(strlen(AI_GLB_MAGIC_NUMBER)))); if (asset.scene) { pScene->mName = asset.scene->name; }