Fix #113201: Assets in same folder as current file ignored in All library

If an asset library was pointing to the same path as the current file is saved
in, the assets from this library wouldn't be loaded. This is because the asset
library service assumed the absolute library root path is a way to uniquely
identify an asset library.

Instead, identify the asset library using both the root path and the library
type.
This commit is contained in:
Julian Eisel
2023-10-13 18:52:38 +02:00
parent a9dc7a4719
commit 7705e49bcd
2 changed files with 9 additions and 5 deletions

View File

@@ -122,7 +122,7 @@ AssetLibrary *AssetLibraryService::get_asset_library_on_disk(eAssetLibraryType l
std::string normalized_root_path = utils::normalize_directory_path(root_path); std::string normalized_root_path = utils::normalize_directory_path(root_path);
std::unique_ptr<AssetLibrary> *lib_uptr_ptr = on_disk_libraries_.lookup_ptr( std::unique_ptr<AssetLibrary> *lib_uptr_ptr = on_disk_libraries_.lookup_ptr(
normalized_root_path); {library_type, normalized_root_path});
if (lib_uptr_ptr != nullptr) { if (lib_uptr_ptr != nullptr) {
CLOG_INFO(&LOG, 2, "get \"%s\" (cached)", normalized_root_path.c_str()); CLOG_INFO(&LOG, 2, "get \"%s\" (cached)", normalized_root_path.c_str());
AssetLibrary *lib = lib_uptr_ptr->get(); AssetLibrary *lib = lib_uptr_ptr->get();
@@ -139,7 +139,7 @@ AssetLibrary *AssetLibraryService::get_asset_library_on_disk(eAssetLibraryType l
/* Reload catalogs on refresh. */ /* Reload catalogs on refresh. */
lib->on_refresh_ = [](AssetLibrary &self) { self.catalog_service->reload_catalogs(); }; lib->on_refresh_ = [](AssetLibrary &self) { self.catalog_service->reload_catalogs(); };
on_disk_libraries_.add_new(normalized_root_path, std::move(lib_uptr)); on_disk_libraries_.add_new({library_type, normalized_root_path}, std::move(lib_uptr));
CLOG_INFO(&LOG, 2, "get \"%s\" (loaded)", normalized_root_path.c_str()); CLOG_INFO(&LOG, 2, "get \"%s\" (loaded)", normalized_root_path.c_str());
return lib; return lib;
} }

View File

@@ -9,6 +9,7 @@
#pragma once #pragma once
#include <optional> #include <optional>
#include <utility>
#include "AS_asset_library.hh" #include "AS_asset_library.hh"
@@ -38,9 +39,12 @@ namespace blender::asset_system {
class AssetLibraryService { class AssetLibraryService {
static std::unique_ptr<AssetLibraryService> instance_; static std::unique_ptr<AssetLibraryService> instance_;
/* Mapping absolute path of the library's root path (normalize with #normalize_directory_path()!) /** Identify libraries with the library type, and the absolute path of the library's root path
* the AssetLibrary instance. */ * (normalize with #normalize_directory_path()!). The type is relevant since the current file
Map<std::string, std::unique_ptr<AssetLibrary>> on_disk_libraries_; * library may point to the same path as a custom library. */
using OnDiskLibraryIdentifier = std::pair<eAssetLibraryType, std::string>;
/* Mapping of a (type, root path) pair to the AssetLibrary instance. */
Map<OnDiskLibraryIdentifier, std::unique_ptr<AssetLibrary>> on_disk_libraries_;
/** Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If /** Library without a known path, i.e. the "Current File" library if the file isn't saved yet. If
* the file was saved, a valid path for the library can be determined and #on_disk_libraries_ * the file was saved, a valid path for the library can be determined and #on_disk_libraries_
* above should be used. */ * above should be used. */