Files
UnrealEngine/Engine/Plugins/Experimental/TechAudioTools/Source/TechAudioToolsMetaSound/Public/ViewModels/MetaSoundViewModel.h
2025-05-18 13:04:45 +08:00

200 lines
8.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "MetasoundFrontendDocumentBuilder.h"
#include "MetasoundGeneratorHandle.h"
#include "MVVMViewModelBase.h"
#include "MetaSoundViewModel.generated.h"
#define UE_API TECHAUDIOTOOLSMETASOUND_API
TECHAUDIOTOOLSMETASOUND_API DECLARE_LOG_CATEGORY_EXTERN(LogTechAudioToolsMetaSound, Log, All);
class UMetaSoundBuilderBase;
class UMetaSoundInputViewModel;
class UMetaSoundOutputViewModel;
/**
* The base class for MetaSound viewmodels. Used for binding metadata and member inputs/outputs of a MetaSound to widgets in UMG.
* Can be initialized using a MetaSound Builder or a MetaSound asset. Creates member viewmodels for each input and output in the
* MetaSound upon initialization.
*/
UCLASS(MinimalAPI, DisplayName = "MetaSound Viewmodel")
class UMetaSoundViewModel : public UMVVMViewModelBase
{
GENERATED_BODY()
private:
// True if this MetaSound Viewmodel has been initialized.
UPROPERTY(BlueprintReadOnly, FieldNotify, Category = "MetaSound Viewmodel", meta = (AllowPrivateAccess))
bool bIsInitialized = false;
// True if the initialized MetaSound is a preset.
UPROPERTY(BlueprintReadOnly, FieldNotify, Category = "MetaSound Viewmodel", meta = (AllowPrivateAccess))
bool bIsPreset = false;
public:
// Returns the object name of the initialized builder as text.
UFUNCTION(BlueprintCallable, FieldNotify, Category = "MetaSound Viewmodel")
UE_API FText GetBuilderNameAsText() const;
// Contains MetaSound Input Viewmodels for each input of the initialized MetaSound.
UFUNCTION(BlueprintCallable, FieldNotify, DisplayName = "Get Input Viewmodels", Category = "MetaSound Viewmodel")
UE_API virtual TArray<UMetaSoundInputViewModel*> GetInputViewModels() const;
// Contains MetaSound Output ViewModels for each output of the initialized MetaSound.
UFUNCTION(BlueprintCallable, FieldNotify, DisplayName = "Get Output Viewmodels", Category = "MetaSound Viewmodel")
UE_API virtual TArray<UMetaSoundOutputViewModel*> GetOutputViewModels() const;
// Initializes the viewmodel using the given MetaSound asset.
UFUNCTION(BlueprintCallable, DisplayName = "Initialize MetaSound", Category = "Audio|MetaSound Viewmodel")
UE_API virtual void InitializeMetaSound(const TScriptInterface<IMetaSoundDocumentInterface> InMetaSound);
// Initializes the viewmodel using the given builder.
UFUNCTION(BlueprintCallable, DisplayName = "Initialize Builder", Category = "Audio|MetaSound Viewmodel")
UE_API virtual void Initialize(UMetaSoundBuilderBase* InBuilder);
// Resets this MetaSoundViewModel instance to an uninitialized state.
UFUNCTION(BlueprintCallable, Category = "Audio|MetaSound Viewmodel")
UE_API virtual void Reset();
// Returns a reference to the initialized MetaSound's Builder.
UFUNCTION(BlueprintCallable, Category = "Audio|MetaSound Viewmodel")
UMetaSoundBuilderBase* GetBuilder() const { return Builder; }
bool IsInitialized() const { return bIsInitialized; }
void SetIsInitialized(const bool bInIsInitialized) { UE_MVVM_SET_PROPERTY_VALUE(bIsInitialized, bInIsInitialized); }
protected:
UE_API virtual void InitializeProperties(const FMetasoundFrontendDocument& FrontendDocument);
UE_API virtual void ResetProperties();
// Called upon initialization. Creates viewmodel instances for all inputs and outputs of the initialized MetaSound.
UE_API void CreateMemberViewModels();
// Creates a single MetaSoundInputViewModel instance for the given input.
UE_API virtual void CreateInputViewModel(const FMetasoundFrontendClassInput& InInput);
UE_API virtual UMetaSoundInputViewModel* CreateInputViewModelInstance();
// Creates a single MetaSoundOutputViewModel instance for the given output.
UE_API void CreateOutputViewModel(const FMetasoundFrontendClassOutput& InOutput);
UE_API virtual UMetaSoundOutputViewModel* CreateOutputViewModelInstance();
UPROPERTY(Transient)
TObjectPtr<UMetaSoundBuilderBase> Builder;
UPROPERTY(Transient)
TMap<FName, TObjectPtr<UMetaSoundInputViewModel>> InputViewModels;
UPROPERTY(Transient)
TMap<FName, TObjectPtr<UMetaSoundOutputViewModel>> OutputViewModels;
};
/**
* Viewmodel class for MetaSound inputs. Allows widgets in UMG to bind to MetaSound literals. Useful for creating knobs, sliders, and other
* widgets for setting MetaSound input parameters.
*/
UCLASS(MinimalAPI, DisplayName = "MetaSound Input Viewmodel")
class UMetaSoundInputViewModel : public UMVVMViewModelBase
{
GENERATED_BODY()
protected:
// True if this MetaSoundInputViewModel has been initialized.
UPROPERTY(BlueprintReadOnly, FieldNotify, Category = "MetaSound Input", meta = (AllowPrivateAccess))
bool bIsInitialized = false;
// Sets the name of the initialized MetaSound input.
UPROPERTY(BlueprintReadWrite, EditAnywhere, FieldNotify, Setter, Category = "MetaSound Input", meta = (AllowPrivateAccess))
FName InputName;
// Returns the data type of the initialized MetaSound input.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Category = "MetaSound Input", meta = (AllowPrivateAccess))
FName DataType;
// True if the initialized MetaSound input is an array.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter = "SetIsArray", Category = "MetaSound Input", meta = (AllowPrivateAccess))
bool bIsArray;
// The MetaSound Literal belonging to the initialized MetaSound input.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Category = "MetaSound Input", meta = (AllowPrivateAccess))
FMetasoundFrontendLiteral Literal;
// Returns the Literal Type belonging to the initialized MetaSound input.
UPROPERTY(BlueprintReadOnly, FieldNotify, Category = "MetaSound Input", meta = (AllowPrivateAccess))
EMetasoundFrontendLiteralType LiteralType;
UPROPERTY(Transient)
TObjectPtr<UMetaSoundBuilderBase> Builder;
public:
UE_API virtual void InitializeInput(UMetaSoundBuilderBase* InBuilder, const FMetasoundFrontendClassInput& InInput);
UE_API virtual void ResetInput();
FName GetInputName() const { return InputName; }
UE_API void SetIsInitialized(const bool bInIsInitialized);
UE_API void SetInputName(const FName& InInputName);
UE_API void SetDataType(const FName& InDataType);
UE_API void SetIsArray(const bool bInIsArray);
// Returns the value of this input's MetaSound Literal as a text value.
UFUNCTION(BlueprintCallable, FieldNotify, Category = "Audio|MetaSound Input Viewmodel")
UE_API FText GetLiteralValueAsText() const;
UE_API void SetLiteral(const FMetasoundFrontendLiteral& InLiteral);
};
/**
* Viewmodel class for MetaSound outputs. Allows widgets in UMG to bind to data from a MetaSound output. Useful for driving visual parameters
* using MetaSound outputs.
*/
UCLASS(MinimalAPI, DisplayName = "MetaSound Output Viewmodel")
class UMetaSoundOutputViewModel : public UMVVMViewModelBase
{
GENERATED_BODY()
protected:
// True if this MetaSoundOutputViewModel has been initialized.
UPROPERTY(BlueprintReadOnly, FieldNotify, Category = "MetaSound Output", meta = (AllowPrivateAccess))
bool bIsInitialized = false;
// Sets the name of the initialized MetaSound output.
UPROPERTY(BlueprintReadWrite, EditAnywhere, FieldNotify, Setter, Category = "MetaSound Output", meta = (AllowPrivateAccess))
FName OutputName;
// Returns the data type of the initialized MetaSound output.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, Category = "MetaSound Output", meta = (AllowPrivateAccess))
FName DataType;
// True if the initialized MetaSound output is an array.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter = "SetIsArray", Category = "MetaSound Output", meta = (AllowPrivateAccess))
bool bIsArray;
// The MetaSound Output belonging to the initialized MetaSound output.
UPROPERTY(BlueprintReadWrite, FieldNotify, Setter, DisplayName = "MetaSound Output", Category = "MetaSound Output", meta = (AllowPrivateAccess))
FMetaSoundOutput MetaSoundOutput;
UPROPERTY(Transient)
TObjectPtr<UMetaSoundBuilderBase> Builder;
public:
UE_API virtual void InitializeOutput(UMetaSoundBuilderBase* InBuilder, const FMetasoundFrontendClassOutput& InOutput);
UE_API virtual void ResetOutput();
FName GetOutputName() const { return OutputName; }
UE_API void SetIsInitialized(const bool bInIsInitialized);
UE_API void SetOutputName(const FName& InOutputName);
UE_API void SetDataType(const FName& InDataType);
UE_API void SetIsArray(const bool bInIsArray);
UE_API void SetMetaSoundOutput(const FMetaSoundOutput& InMetaSoundOutput);
UFUNCTION()
UE_API void OnOutputValueChanged(FName InOutputName, const FMetaSoundOutput& InOutput);
};
#undef UE_API