123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /*******************************************************************************
- The content of this file includes portions of the proprietary AUDIOKINETIC Wwise
- Technology released in source code form as part of the game integration package.
- The content of this file may not be used without valid licenses to the
- AUDIOKINETIC Wwise Technology.
- Note that the use of the game engine is subject to the Unreal(R) Engine End User
- License Agreement at https://www.unrealengine.com/en-US/eula/unreal
-
- License Usage
-
- Licensees holding valid licenses to the AUDIOKINETIC Wwise Technology may use
- this file in accordance with the end user license agreement provided with the
- software or, alternatively, in accordance with the terms contained
- in a written agreement between you and Audiokinetic Inc.
- Copyright (c) 2023 Audiokinetic Inc.
- *******************************************************************************/
- #include "AssetManagement/AkAssetDatabase.h"
- #include "AkAudioType.h"
- #include "AkAcousticTexture.h"
- #include "AkAudioEvent.h"
- #include "AkAuxBus.h"
- #include "AkRtpc.h"
- #include "AkStateValue.h"
- #include "AkSwitchValue.h"
- #include "AkTrigger.h"
- #include "WwiseUnrealHelper.h"
- #include "AkAudioDevice.h"
- #include "AkSettingsPerUser.h"
- #include "IAudiokineticTools.h"
- #include "AssetRegistry/AssetRegistryModule.h"
- #include "AssetToolsModule.h"
- #include "Async/Async.h"
- #include "Misc/FeedbackContext.h"
- #include "ObjectTools.h"
- #include "Logging/LogMacros.h"
- #define LOCTEXT_NAMESPACE "AkAudio"
- AkAssetDatabase& AkAssetDatabase::Get()
- {
- static AkAssetDatabase instance;
- return instance;
- }
- AkAssetDatabase::AkAssetDatabase()
- {
- AssetRegistryModule = &FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
- AssetToolsModule = &FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
- }
- bool AkAssetDatabase::FindAllAssets(TArray<FAssetData>& OutData)
- {
- #if UE_5_1_OR_LATER
- AssetRegistryModule->Get().GetAssetsByClass(UAkAudioType::StaticClass()->GetClassPathName(), OutData, true);
- #else
- AssetRegistryModule->Get().GetAssetsByClass(UAkAudioType::StaticClass()->GetFName(), OutData, true);
- #endif
- return OutData.Num() > 0;
- }
- bool AkAssetDatabase::FindAssets(const FGuid& AkGuid, TArray<FAssetData>& OutData)
- {
- TMultiMap<FName, FString> Search;
- Search.Add(GET_MEMBER_NAME_CHECKED(FWwiseObjectInfo, WwiseGuid), AkGuid.ToString(EGuidFormats::Digits));
- AssetRegistryModule->Get().GetAssetsByTagValues(Search, OutData);
- return OutData.Num() > 0;
- }
- bool AkAssetDatabase::FindAssets(const FString& AssetName, TArray<FAssetData>& OutData)
- {
- TMultiMap<FName, FString> Search;
- Search.Add(GET_MEMBER_NAME_CHECKED(FAssetData, AssetName), AssetName);
- AssetRegistryModule->Get().GetAssetsByTagValues(Search, OutData);
- return OutData.Num() > 0;
- }
- FAssetData AkAssetDatabase::FindAssetByObjectPath(const FSoftObjectPath& AssetPath)
- {
- #if UE_5_1_OR_LATER
- return AssetRegistryModule->Get().GetAssetByObjectPath(AssetPath);
- #else
- return AssetRegistryModule->Get().GetAssetByObjectPath(AssetPath.GetAssetPathName());
- #endif
- }
- bool AkAssetDatabase::FindFirstAsset(const FGuid& AkGuid, FAssetData& OutAsset)
- {
- TArray<FAssetData> Assets;
- if (FindAssets(AkGuid, Assets))
- {
- OutAsset = Assets[0];
- return true;
- }
- return false;
- }
- bool AkAssetDatabase::FindFirstAsset(const FString& AssetName, FAssetData& OutAsset)
- {
- TArray<FAssetData> Assets;
- if (FindAssets(AssetName, Assets))
- {
- OutAsset = Assets[0];
- return true;
- }
- return false;
- }
- bool AkAssetDatabase::FindAssetsByGuidAndClass(const FGuid& AkGuid, const UClass* StaticClass, TArray<FAssetData>& OutWwiseAssets)
- {
- TMultiMap<FName, FString> Search;
- FARFilter Filter;
- #if UE_5_1_OR_LATER
- Filter.ClassPaths.Add(StaticClass->GetClassPathName());
- #else
- Filter.ClassNames.Add(StaticClass->GetFName());
- #endif
- Filter.bRecursiveClasses = true;
- Filter.TagsAndValues.AddUnique(GET_MEMBER_NAME_CHECKED(FWwiseObjectInfo, WwiseGuid), AkGuid.ToString(EGuidFormats::Digits));
- AssetRegistryModule->Get().GetAssets(Filter, OutWwiseAssets);
- return OutWwiseAssets.Num() > 0;
- }
- bool AkAssetDatabase::RenameAsset(const FGuid& Id, const FString& AssetName,
- const FString& RelativePath)
- {
- check(IsInGameThread());
- auto parentPath = RelativePath;
- TArray<FAssetData> AssetData;
- if (!FindAssets(Id, AssetData))
- {
- UE_LOG(LogAudiokineticTools, Verbose, TEXT("Can't find Wwise asset to rename with ID %s"), *Id.ToString());
- return false;
- }
- TArray<FAssetRenameData> AssetsToRename;
- for (FAssetData Asset : AssetData)
- {
- if (Asset.AssetName.ToString() != AssetName || parentPath != Asset.PackagePath.ToString())
- {
- if (parentPath.IsEmpty())
- {
- parentPath = Asset.PackagePath.ToString();
- }
- FAssetRenameData NewAssetRenameData(Asset.GetAsset(), parentPath, AssetName);
- AssetsToRename.Add(NewAssetRenameData);
- UE_LOG(LogAudiokineticTools, Verbose, TEXT("Renaming Wwise asset %s"), *AssetName);
- }
- }
- if (!AssetToolsModule->Get().RenameAssets(AssetsToRename))
- {
- UE_LOG(LogAudiokineticTools, Error, TEXT("Failed to rename Wwise Assets"));
- return false;
- }
- return true;
- }
- void AkAssetDatabase::DeleteAsset(const FGuid& Id)
- {
- check(IsInGameThread());
- TArray<FAssetData> AssetsToDelete;
- if (FindAssets(Id, AssetsToDelete))
- {
- ObjectTools::DeleteAssets(AssetsToDelete, true);
- }
- }
- void AkAssetDatabase::DeleteAssets(const TSet<FGuid>& AssetsId)
- {
- for (auto& ID : AssetsId)
- {
- DeleteAsset(ID);
- }
- }
- void AkAssetDatabase::FixUpRedirectors(const FString& AssetPackagePath)
- {
- TArray<UObjectRedirector*> redirectorsToFix;
- TArray<FAssetData> foundRedirectorsData;
- #if UE_5_1_OR_LATER
- AssetRegistryModule->Get().GetAssetsByClass(UObjectRedirector::StaticClass()->GetClassPathName(), foundRedirectorsData);
- #else
- AssetRegistryModule->Get().GetAssetsByClass(UObjectRedirector::StaticClass()->GetFName(), foundRedirectorsData);
- #endif
- if (foundRedirectorsData.Num() > 0)
- {
- for (auto& entry : foundRedirectorsData)
- {
- if (auto redirector = Cast<UObjectRedirector>(entry.GetAsset()))
- {
- if (redirector->DestinationObject)
- {
- auto pathName = redirector->DestinationObject->GetPathName();
- if (pathName.StartsWith(AssetPackagePath))
- {
- redirectorsToFix.Add(redirector);
- }
- }
- }
- }
- }
- if (redirectorsToFix.Num() > 0)
- {
- AssetToolsModule->Get().FixupReferencers(redirectorsToFix);
- }
- }
- bool AkAssetDatabase::IsAkAudioType(const FAssetData& AssetData)
- {
- #if UE_5_1_OR_LATER
- static const TArray<FTopLevelAssetPath> AkAudioClassPaths = {
- UAkAcousticTexture::StaticClass()->GetClassPathName(),
- UAkAudioEvent::StaticClass()->GetClassPathName(),
- UAkAuxBus::StaticClass()->GetClassPathName(),
- UAkRtpc::StaticClass()->GetClassPathName(),
- UAkStateValue::StaticClass()->GetClassPathName(),
- UAkSwitchValue::StaticClass()->GetClassPathName(),
- UAkTrigger::StaticClass()->GetClassPathName()
- };
- if (AkAudioClassPaths.Contains(AssetData.AssetClassPath))
- return true;
- #else
- static const TArray<FName> AkAudioClassNames = {
- UAkAcousticTexture::StaticClass()->GetFName(),
- UAkAudioEvent::StaticClass()->GetFName(),
- UAkAuxBus::StaticClass()->GetFName(),
- UAkRtpc::StaticClass()->GetFName(),
- UAkStateValue::StaticClass()->GetFName(),
- UAkSwitchValue::StaticClass()->GetFName(),
- UAkTrigger::StaticClass()->GetFName()
- };
- if (AkAudioClassNames.Contains(AssetData.AssetClass))
- return true;
- #endif
- return false;
- }
- bool AkAssetDatabase::CheckIfLoadingAssets()
- {
- return AssetRegistryModule->Get().IsLoadingAssets();
- }
- #undef LOCTEXT_NAMESPACE
|