From 811bf2df154c46e98258452afdb6fc4f9dbc64b6 Mon Sep 17 00:00:00 2001 From: Pichas Date: Sun, 13 Oct 2024 15:11:45 -0400 Subject: [PATCH] Fix issue 5767: Can't load USD from memory (#5818) * initial commit * fix element size --- code/AssetLib/USD/USDLoaderImplTinyusdz.cpp | 34 +++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/USD/USDLoaderImplTinyusdz.cpp b/code/AssetLib/USD/USDLoaderImplTinyusdz.cpp index 3e32917f9..3cd03083c 100644 --- a/code/AssetLib/USD/USDLoaderImplTinyusdz.cpp +++ b/code/AssetLib/USD/USDLoaderImplTinyusdz.cpp @@ -58,6 +58,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include "assimp/MemoryIOWrapper.h" #include #include @@ -81,7 +82,7 @@ using namespace std; void USDImporterImplTinyusdz::InternReadFile( const std::string &pFile, aiScene *pScene, - IOSystem *) { + IOSystem *pIOHandler) { // Grab filename for logging purposes size_t pos = pFile.find_last_of('/'); string basePath = pFile.substr(0, pos); @@ -91,29 +92,48 @@ void USDImporterImplTinyusdz::InternReadFile( ss << "InternReadFile(): model" << nameWExt; TINYUSDZLOGD(TAG, "%s", ss.str().c_str()); + bool is_load_from_mem{ pFile.substr(0, AI_MEMORYIO_MAGIC_FILENAME_LENGTH) == AI_MEMORYIO_MAGIC_FILENAME }; + std::vector in_mem_data; + if (is_load_from_mem) { + auto stream_closer = [pIOHandler](IOStream *pStream) { + pIOHandler->Close(pStream); + }; + std::unique_ptr file_stream(pIOHandler->Open(pFile, "rb"), stream_closer); + if (!file_stream) { + throw DeadlyImportError("Failed to open file ", pFile, "."); + } + size_t file_size{ file_stream->FileSize() }; + in_mem_data.resize(file_size); + file_stream->Read(in_mem_data.data(), 1, file_size); + } + bool ret{ false }; tinyusdz::USDLoadOptions options; tinyusdz::Stage stage; std::string warn, err; bool is_usdz{ false }; if (isUsdc(pFile)) { - ret = LoadUSDCFromFile(pFile, &stage, &warn, &err, options); + ret = is_load_from_mem ? LoadUSDCFromMemory(in_mem_data.data(), in_mem_data.size(), pFile, &stage, &warn, &err, options) : + LoadUSDCFromFile(pFile, &stage, &warn, &err, options); ss.str(""); ss << "InternReadFile(): LoadUSDCFromFile() result: " << ret; TINYUSDZLOGD(TAG, "%s", ss.str().c_str()); } else if (isUsda(pFile)) { - ret = LoadUSDAFromFile(pFile, &stage, &warn, &err, options); + ret = is_load_from_mem ? LoadUSDAFromMemory(in_mem_data.data(), in_mem_data.size(), pFile, &stage, &warn, &err, options) : + LoadUSDAFromFile(pFile, &stage, &warn, &err, options); ss.str(""); ss << "InternReadFile(): LoadUSDAFromFile() result: " << ret; TINYUSDZLOGD(TAG, "%s", ss.str().c_str()); } else if (isUsdz(pFile)) { - ret = LoadUSDZFromFile(pFile, &stage, &warn, &err, options); + ret = is_load_from_mem ? LoadUSDZFromMemory(in_mem_data.data(), in_mem_data.size(), pFile, &stage, &warn, &err, options) : + LoadUSDZFromFile(pFile, &stage, &warn, &err, options); is_usdz = true; ss.str(""); ss << "InternReadFile(): LoadUSDZFromFile() result: " << ret; TINYUSDZLOGD(TAG, "%s", ss.str().c_str()); } else if (isUsd(pFile)) { - ret = LoadUSDFromFile(pFile, &stage, &warn, &err, options); + ret = is_load_from_mem ? LoadUSDFromMemory(in_mem_data.data(), in_mem_data.size(), pFile, &stage, &warn, &err, options) : + LoadUSDFromFile(pFile, &stage, &warn, &err, options); ss.str(""); ss << "InternReadFile(): LoadUSDFromFile() result: " << ret; TINYUSDZLOGD(TAG, "%s", ss.str().c_str()); @@ -149,7 +169,9 @@ void USDImporterImplTinyusdz::InternReadFile( // NOTE: Pointer address of usdz_asset must be valid until the call of RenderSceneConverter::ConvertToRenderScene. tinyusdz::USDZAsset usdz_asset; if (is_usdz) { - if (!tinyusdz::ReadUSDZAssetInfoFromFile(pFile, &usdz_asset, &warn, &err)) { + bool is_read_USDZ_asset = is_load_from_mem ? tinyusdz::ReadUSDZAssetInfoFromMemory(in_mem_data.data(), in_mem_data.size(), false, &usdz_asset, &warn, &err) : + tinyusdz::ReadUSDZAssetInfoFromFile(pFile, &usdz_asset, &warn, &err); + if (!is_read_USDZ_asset) { if (!warn.empty()) { ss.str(""); ss << "InternReadFile(): ReadUSDZAssetInfoFromFile: WARNING reported: " << warn;