From a2ceb2c12b9bf4c192f5e36a29543fda633d7479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sun, 2 Feb 2025 07:21:58 +0100 Subject: [PATCH] model import: embedded image will use full file data hash as resource name to avoid collisions between multiple models --- Editor/ModelImporter_FBX.cpp | 5 +---- Editor/ModelImporter_GLTF.cpp | 7 +------ WickedEngine/wiHelper.cpp | 10 ++++++++++ WickedEngine/wiHelper.h | 3 +++ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Editor/ModelImporter_FBX.cpp b/Editor/ModelImporter_FBX.cpp index 1ed216577..6bd668ca7 100644 --- a/Editor/ModelImporter_FBX.cpp +++ b/Editor/ModelImporter_FBX.cpp @@ -112,10 +112,7 @@ void ImportModel_FBX(const std::string& filename, wi::scene::Scene& scene) if (filename.empty()) { // Force some image resource name: - do { - filename.clear(); - filename += "fbximport_" + std::to_string(wi::random::GetRandom(std::numeric_limits::max())) + ".png"; - } while (wi::resourcemanager::Contains(filename)); // this is to avoid overwriting an existing imported image + filename = "fbximport_" + std::to_string(wi::helper::HashByteData((const uint8_t*)texture->content.data, texture->content.size)) + ".png"; } auto resource = wi::resourcemanager::Load( diff --git a/Editor/ModelImporter_GLTF.cpp b/Editor/ModelImporter_GLTF.cpp index ceae371ef..3faf4b0e6 100644 --- a/Editor/ModelImporter_GLTF.cpp +++ b/Editor/ModelImporter_GLTF.cpp @@ -90,12 +90,7 @@ namespace tinygltf if (image->uri.empty()) { // Force some image resource name: - std::string ss; - do { - ss.clear(); - ss += "gltfimport_" + std::to_string(wi::random::GetRandom(std::numeric_limits::max())) + ".png"; - } while (wi::resourcemanager::Contains(ss)); // this is to avoid overwriting an existing imported image - image->uri = ss; + image->uri = "gltfimport_" + std::to_string(wi::helper::HashByteData(bytes, size)) + ".png"; } auto resource = wi::resourcemanager::Load( diff --git a/WickedEngine/wiHelper.cpp b/WickedEngine/wiHelper.cpp index 13f531c04..f80e91247 100644 --- a/WickedEngine/wiHelper.cpp +++ b/WickedEngine/wiHelper.cpp @@ -1612,4 +1612,14 @@ namespace wi::helper res = ZSTD_decompress(dst_data.data(), dst_data.size(), src_data, src_size); return ZSTD_isError(res) == 0; } + + size_t HashByteData(const uint8_t* data, size_t size) + { + size_t hash = 0; + for (size_t i = 0; i < size; ++i) + { + hash_combine(hash, data[i]); + } + return hash; + } } diff --git a/WickedEngine/wiHelper.h b/WickedEngine/wiHelper.h index f77c5cf87..0c3d3dad9 100644 --- a/WickedEngine/wiHelper.h +++ b/WickedEngine/wiHelper.h @@ -190,4 +190,7 @@ namespace wi::helper // Lossless decompression of byte array that was compressed with wi::helper::Compress() bool Decompress(const uint8_t* src_data, size_t src_size, wi::vector& dst_data); + + // Hash the contents of a file: + size_t HashByteData(const uint8_t* data, size_t size); };