279 lines
7.9 KiB
C++
279 lines
7.9 KiB
C++
/*******************************************************************************
|
|
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.
|
|
*******************************************************************************/
|
|
|
|
/*------------------------------------------------------------------------------------
|
|
SGenerateSoundBanks.cpp
|
|
------------------------------------------------------------------------------------*/
|
|
|
|
#include "SGenerateSoundBanks.h"
|
|
|
|
#include "AkAudioBankGenerationHelpers.h"
|
|
#include "AkAudioDevice.h"
|
|
#include "AkSettingsPerUser.h"
|
|
#include "AkUEFeatures.h"
|
|
#include "AssetManagement/AkGenerateSoundBanksTask.h"
|
|
#include "AssetRegistry/AssetRegistryModule.h"
|
|
#include "Dialogs/Dialogs.h"
|
|
#include "Dom/JsonObject.h"
|
|
#include "Framework/Application/SlateApplication.h"
|
|
#include "GenericPlatform/GenericPlatformFile.h"
|
|
#if UE_5_0_OR_LATER
|
|
#include "HAL/PlatformFileManager.h"
|
|
#else
|
|
#include "HAL/PlatformFilemanager.h"
|
|
#endif
|
|
#include "Interfaces/ITargetPlatform.h"
|
|
#include "Interfaces/ITargetPlatformManagerModule.h"
|
|
#include "Misc/FileHelper.h"
|
|
#include "Misc/MessageDialog.h"
|
|
#include "Platforms/AkPlatformInfo.h"
|
|
#include "Platforms/AkUEPlatform.h"
|
|
#include "Serialization/JsonReader.h"
|
|
#include "Serialization/JsonSerializer.h"
|
|
#include "Widgets/Input/SButton.h"
|
|
#include "Widgets/Input/SCheckBox.h"
|
|
#include "AssetManagement/WwiseProjectInfo.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "AkAudio"
|
|
|
|
SGenerateSoundBanks::SGenerateSoundBanks()
|
|
{
|
|
}
|
|
|
|
void SGenerateSoundBanks::Construct(const FArguments& InArgs)
|
|
{
|
|
// Generate the list of banks and platforms
|
|
PopulateList();
|
|
if (PlatformNames.Num() == 0)
|
|
{
|
|
FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("AkAudio", "Warning_Ak_PlatformSupported", "Unable to generate Sound Data. Please select a valid Wwise supported platform in the 'Project Settings > Project > Supported Platforms' dialog."));
|
|
return;
|
|
}
|
|
|
|
bool skipLanguages = false;
|
|
|
|
if (auto* akSettingsPerUser = GetDefault<UAkSettingsPerUser>())
|
|
{
|
|
skipLanguages = akSettingsPerUser->SoundDataGenerationSkipLanguage;
|
|
}
|
|
|
|
// Build the form
|
|
ChildSlot
|
|
[
|
|
SNew(SVerticalBox)
|
|
+SVerticalBox::Slot()
|
|
.Padding(0, 8)
|
|
.FillHeight(1.f)
|
|
[
|
|
SNew(SHorizontalBox)
|
|
+SHorizontalBox::Slot()
|
|
.Padding(0, 8)
|
|
.AutoWidth()
|
|
[
|
|
SNew(SBorder)
|
|
.BorderImage( FAkAppStyle::Get().GetBrush("ToolPanel.GroupBorder") )
|
|
[
|
|
SAssignNew(PlatformList, SListView<TSharedPtr<FString>>)
|
|
.ListItemsSource(&PlatformNames)
|
|
.SelectionMode(ESelectionMode::Multi)
|
|
.OnGenerateRow(this, &SGenerateSoundBanks::MakePlatformListItemWidget)
|
|
.HeaderRow
|
|
(
|
|
SNew(SHeaderRow)
|
|
+ SHeaderRow::Column("Available Platforms")
|
|
[
|
|
SNew(SBorder)
|
|
.Padding(5)
|
|
.Content()
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(LOCTEXT("AkAvailablePlatforms", "Available Platforms"))
|
|
]
|
|
]
|
|
)
|
|
]
|
|
]
|
|
+ SHorizontalBox::Slot()
|
|
.Padding(0, 8)
|
|
.AutoWidth()
|
|
[
|
|
SNew(SBorder)
|
|
.BorderImage(FAkAppStyle::Get().GetBrush("ToolPanel.GroupBorder"))
|
|
[
|
|
SAssignNew(LanguageList, SListView<TSharedPtr<FString>>)
|
|
.ListItemsSource(&LanguagesNames)
|
|
.SelectionMode(ESelectionMode::Multi)
|
|
.OnGenerateRow(this, &SGenerateSoundBanks::MakePlatformListItemWidget)
|
|
.HeaderRow
|
|
(
|
|
SNew(SHeaderRow)
|
|
+ SHeaderRow::Column("Available Languages")
|
|
[
|
|
SNew(SBorder)
|
|
.Padding(5)
|
|
.Content()
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(LOCTEXT("AkAvailableLanguages", "Available Languages"))
|
|
]
|
|
]
|
|
)
|
|
]
|
|
]
|
|
]
|
|
+ SVerticalBox::Slot()
|
|
.AutoHeight()
|
|
.Padding(0, 4)
|
|
.HAlign(HAlign_Left)
|
|
[
|
|
SAssignNew(SkipLanguagesCheckBox, SCheckBox)
|
|
.IsChecked(skipLanguages ? ECheckBoxState::Checked : ECheckBoxState::Unchecked)
|
|
.Content()
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(LOCTEXT("AkSkipVOFiles", "Skip generation of localized assets"))
|
|
]
|
|
]
|
|
+SVerticalBox::Slot()
|
|
.AutoHeight()
|
|
.Padding(0, 4)
|
|
.HAlign(HAlign_Right)
|
|
[
|
|
SNew(SButton)
|
|
.Text(LOCTEXT("AkGenerate", "Generate"))
|
|
.OnClicked(this, &SGenerateSoundBanks::OnGenerateButtonClicked)
|
|
]
|
|
];
|
|
|
|
// Select all the platforms
|
|
for (const auto& platform : PlatformNames)
|
|
{
|
|
PlatformList->SetItemSelection(platform, true);
|
|
}
|
|
|
|
// Select all the languages
|
|
for (const auto& language : LanguagesNames)
|
|
{
|
|
LanguageList->SetItemSelection(language, true);
|
|
}
|
|
}
|
|
|
|
void SGenerateSoundBanks::PopulateList(void)
|
|
{
|
|
// Get platforms in Wwise project
|
|
wwiseProjectInfo.Parse();
|
|
PlatformNames.Empty();
|
|
for (const auto& WwisePlatform : wwiseProjectInfo.GetSupportedPlatforms())
|
|
{
|
|
const FString WwisePlatformName = WwisePlatform.Name;
|
|
if (!WwisePlatformName.IsEmpty() &&
|
|
!PlatformNames.ContainsByPredicate([WwisePlatformName](TSharedPtr<FString> Platform) { return WwisePlatformName == *Platform; }))
|
|
{
|
|
PlatformNames.Add(MakeShared<FString>(WwisePlatformName));
|
|
}
|
|
}
|
|
|
|
LanguagesNames.Empty();
|
|
for (const auto& language : wwiseProjectInfo.GetSupportedLanguages())
|
|
{
|
|
LanguagesNames.Add(MakeShared<FString>(language.Name));
|
|
}
|
|
}
|
|
|
|
FReply SGenerateSoundBanks::OnKeyDown( const FGeometry& MyGeometry, const FKeyEvent& InKeyboardEvent )
|
|
{
|
|
if( InKeyboardEvent.GetKey() == EKeys::Enter )
|
|
{
|
|
return OnGenerateButtonClicked();
|
|
}
|
|
else if( InKeyboardEvent.GetKey() == EKeys::Escape )
|
|
{
|
|
TSharedPtr<SWindow> ParentWindow = FSlateApplication::Get().FindWidgetWindow(AsShared());
|
|
ParentWindow->RequestDestroyWindow();
|
|
return FReply::Handled();
|
|
}
|
|
|
|
return SCompoundWidget::OnKeyDown(MyGeometry, InKeyboardEvent);
|
|
}
|
|
|
|
FReply SGenerateSoundBanks::OnGenerateButtonClicked()
|
|
{
|
|
TArray< TSharedPtr<FString> > PlatformsToGenerate = PlatformList->GetSelectedItems();
|
|
if( PlatformsToGenerate.Num() <= 0 )
|
|
{
|
|
FMessageDialog::Open( EAppMsgType::Ok, NSLOCTEXT("AkAudio", "Warning_Ak_NoAkPlatformsSelected", "At least one platform must be selected."));
|
|
return FReply::Handled();
|
|
}
|
|
|
|
AkSoundBankGenerationManager::FInitParameters InitParameters;
|
|
|
|
for (auto& platform : PlatformsToGenerate)
|
|
{
|
|
InitParameters.Platforms.Add(*platform.Get());
|
|
}
|
|
|
|
TArray<TSharedPtr<FString>> languagesToGenerate = LanguageList->GetSelectedItems();
|
|
|
|
for (auto& selectedLanguage : languagesToGenerate)
|
|
{
|
|
for (auto& entry : wwiseProjectInfo.GetSupportedLanguages())
|
|
{
|
|
if (*selectedLanguage == entry.Name)
|
|
{
|
|
InitParameters.Languages.Add(entry.Name);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
InitParameters.SkipLanguages = SkipLanguagesCheckBox->IsChecked();
|
|
|
|
if (auto* akSettingsPerUser = GetMutableDefault<UAkSettingsPerUser>())
|
|
{
|
|
akSettingsPerUser->SoundDataGenerationSkipLanguage = InitParameters.SkipLanguages;
|
|
akSettingsPerUser->SaveConfig();
|
|
}
|
|
|
|
if (FAkWaapiClient::IsProjectLoaded())
|
|
{
|
|
InitParameters.GenerationMode = AkSoundBankGenerationManager::ESoundBankGenerationMode::WAAPI;
|
|
}
|
|
|
|
AkGenerateSoundBanksTask::CreateAndExecuteTask(InitParameters);
|
|
|
|
TSharedPtr<SWindow> ParentWindow = FSlateApplication::Get().FindWidgetWindow(AsShared());
|
|
ParentWindow->RequestDestroyWindow();
|
|
|
|
return FReply::Handled();
|
|
}
|
|
|
|
TSharedRef<ITableRow> SGenerateSoundBanks::MakePlatformListItemWidget(TSharedPtr<FString> Platform, const TSharedRef<STableViewBase>& OwnerTable)
|
|
{
|
|
return
|
|
SNew(STableRow< TSharedPtr<FString> >, OwnerTable)
|
|
[
|
|
SNew(SBox)
|
|
.WidthOverride(300)
|
|
[
|
|
SNew(STextBlock)
|
|
.Text(FText::FromString(*Platform))
|
|
]
|
|
];
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE
|