- Calls to OnPluginUnload (one GC call for all plugins)
- Calls to FCollectionManager::HandleObjectDeleted (one UpdateCaches call at the end)
#rb Dave.Belanger, Francis.Hurteau
[FYI] Rex.Hill
#rnx
[CL 36757086 by nick verigakis in 5.5 branch]
Previously, the first (arbitrary) editor target receipt with a matching configuration was chosen.
This is necessary to disambiguate a second receipt for an editor target in the engine binaries directory, and matches existing logic used to determine the correct receipt in FEngineLoop::AppInit.
#jira UE-196216
#rb jeremie.roy, will.brown
[CL 36017174 by zach brockway in ue5-main branch]
Adds a "Plugin Directories" button to the Plugin Browser, which spawns a nomad tab containing a struct details view that lists configured directories, and optionally (config-driven) allows them to be modified and handles updates to the relevant managers.
Also includes some smaller supporting changes to make the Plugin Browser usable in LiveLink Hub.
Related changes to plugin manager:
- Adds an EPluginExternalSource enum, and extends IPluginManager's "external path" representation from FString to a tagged struct indicating the source of each path.
- Adds `void IPluginManager::GetExternalPluginSources(TSet<FExternalPluginPath>& OutPluginSources)` as an alternative/successor to `const TSet<FString>& GetAdditionalPluginSearchPaths()`.
- Adds `IPluginManager::RemovePluginSearchPath()` counterpart to existing `AddPluginSearchPath()`.
Other changes:
- Adds `[EditorSettings] bCanModifyProjectPluginDirectoriesFromBrowser` config bool. If not explicitly set, effectively defaults to the value of `bCanModifyPluginsFromBrowser`.
- Adds `[EditorSettings] bCanModifyUserPluginDirectoriesFromBrowser` config bool. Disabled and hidden by default, 'User' plugin directories are intended as an application-specific mechanism to expose `IPluginManager::AddPluginSearchPath` without requiring a writable uproject descriptor.
- Adds `[EditorSettings] HidePluginCategoriesFromBrowser` config string list to exclude named categories from SPluginCategoryTree (unused by default, will be used for LiveLink Hub).
- Adds `[EditorSettings] bCanCreatePluginsFromBrowser` config bool to disable the plugin creator / "Add Plugin" button.
#jira UE-216220
#rb jason.walter, will.brown
[CL 35747847 by zach brockway in ue5-main branch]
This restriction was added before the asset registry itself was made thread-safe, and is no longer needed
This allows us to remove all the places that were pessimistically calling ConditionalUpdateCache from the GT to avoid warnings from the ALT, as the ALT can now update the cache itself as needed. This avoids the per-plugin/GFP hit when calling ConditionalUpdateCache after mounting/loading the asset registry state, and in the editor means that nothing ever needs to call ConditionalUpdateCache (as the editor doesn't partake in localized asset loading).
#rb Justin.Marcus, Rex.Hill
[CL 35252667 by jamie dale in ue5-main branch]
This is now controlled by FTextLocalizationManager::ShouldForceLoadGameLocalization, which will return true in the following cases:
* A cooked editor.
* An uncooked editor with the game localization preview enabled, or with the CVar Localization.ForceLoadGameLocalizationInEditor set to true.
This is queried to add the ELocalizationLoadFlags::ForceLocalizedGame flag when loading localization data, and also by FLocalizationTargetDescriptor::ShouldLoadLocalizationTarget when deciding whether to load a game localization target for a plugin (which also allows plugins to work with the game localization preview).
#rb eric.boucher
[CL 34460891 by jamie dale in ue5-main branch]
Add way to know the current enabled plugins for the target. This allows the application to only load the modules and plugins.
[REVIEW] [at]Will.Brown [at]Lewis.Farrell [at]Aidan.McDu
#rb aidan.mcdu, will.brown
[CL 34212830 by eric knapik in ue5-main branch]
This is passed through to the target receipt, and respected in FPluginManager.
#jira UE-214749
#rb Joe.Kirchoff
[CL 33811096 by zach brockway in ue5-main branch]
- Making use of unload configs in PluginManager, GameFeaturePlugins, and HotFixes
- To help with memory increase from the branch memory for unloadable configs, I added FConfigCacheIni::SafeUnload(BranchName), which can unload the memory usage by a branch, but then will on-demand reload the hierarchy if accessed
- Used SafeUnload to GGameplayTagsIni because that is read once and cached
- Various other minor optimizations, like not creating hundreds of empty configs in GConfig,
- Added "config memusage" (similar to configmem as it turns out)
- Removed some old deprecated code
- Added ability for editor to remember and write out comments in .ini files
- Changed commandline ini overrides to a dynamic layer (this is a work in progress - old method is still in there - it's tied to the ini.UseNewDynamicLayers cvar - old GFP code used the old way, etc, which i still support)
- Experimental support for runtime config change tracking, so saving out .ini files will have more context about how the user changed a config section (mostly important for arrays). This is not fully functional yet [WILL PROBABLY REMOVE]
- Experimental new config layer expansion system that uses FPaths::ConvertPath to find Restricted/Platform locations, instead of hardcoding
#rb David.Harvey
[CL 33489816 by josh adams in ue5-main branch]
Since the mount/unmount localization calls are now ref-counted, we can just always call them during GFP loading/unloading as they'll be a no-op if the localization data was already loaded by mounting (or anything else).
Also improved the logging when the localization data skips being loaded/unloaded due to an existing reference, so that we can see the ref-count in the log.
[FYI] Kelby.Gamble
#rnx
[CL 33204941 by jamie dale in ue5-main branch]
This allows different systems that need plugin localization to call MountExplicitlyLoadedPluginLocalizationData and UnmountExplicitlyLoadedPluginLocalizationData (in pairs), without needing to understand any other system that may have mounted localization for that plugin, and avoids the unmount calls from different systems fighting with each other.
#rb simon.orr
[CL 32929429 by jamie dale in ue5-main branch]
This leverages 4-bytes of padding in FDisplayStringEntry to store an ID (an int32 index generated via FTextLocalizationManager::GetLocalizationTargetPathId) that is used to tag each display string with the localization target that it belongs to, without increasing the size of DisplayStringLookupTable.
There is an additional LUT mapping each localization target ID to its text IDs to act as an accelerator for HandleLocalizationTargetsUnmounted, however this LUT only tracks text IDs associated with localization data loaded via HandleLocalizationTargetsMounted to minimize the memory impact of this additional tracking. Without this LUT HandleLocalizationTargetsUnmounted would need to spin the entire live table each time, which is not acceptable from a performance standpoint.
Now that HandleLocalizationTargetsUnmounted is implemented it's also been hooked into GFP deactivation, to mirror how HandleLocalizationTargetsMounted was hooked into GFP activation.
#rb anton.dunchev
[CL 32312744 by jamie dale in ue5-main branch]
This allows them to separate their mounting and content loading into two phases, such as allowing a GFP to mount the plugin when "registered" and defer mounting the localization data until "activating".
Note: Anything that was calling one of the MountExplicitlyLoadedPlugin functions to load a plugin, will now need to also call MountExplicitlyLoadedPluginLocalizationData if it wants to also mount the localization data.
#rb anton.dunchev, Leon.Huang
[CL 32029617 by jamie dale in ue5-main branch]