2020-12-14 15:48:27 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# pragma once
2021-07-12 15:44:53 -04:00
# include "Engine/Engine.h"
2020-12-14 15:48:27 -04:00
# include "MetasoundAssetBase.h"
2023-04-04 19:14:26 -04:00
# include "MetasoundDocumentInterface.h"
2021-06-16 14:11:49 -04:00
# include "Subsystems/EngineSubsystem.h"
2020-12-14 15:48:27 -04:00
# include "UObject/Object.h"
2021-12-10 20:37:31 -05:00
# include "Templates/Function.h"
2021-06-16 14:11:49 -04:00
2021-06-16 11:21:13 -04:00
2021-08-09 15:13:40 -04:00
// Forward Declarations
class UAssetManager ;
2021-06-16 11:21:13 -04:00
2020-12-14 15:48:27 -04:00
namespace Metasound
{
/** Interface for an entry into the Metasound-UObject Registry.
*
2021-11-22 15:55:50 -05:00
* An entry provides information linking a FMetasoundFrontendClassInterface to a UClass .
2020-12-14 15:48:27 -04:00
* It also provides methods for accessing the FMetasoundAssetBase from a UObject .
*/
class IMetasoundUObjectRegistryEntry
{
public :
virtual ~ IMetasoundUObjectRegistryEntry ( ) = default ;
2023-03-07 17:01:52 -05:00
UE_DEPRECATED ( 5.3 , " Interfaces queries are no longer restricted to a single UObjectRegistryEntry. Options set upon registering interface determines supported UClasses. " )
virtual const FMetasoundFrontendVersion & GetInterfaceVersion ( ) const
{
static const FMetasoundFrontendVersion InterfaceVersion ;
return InterfaceVersion ;
}
2020-12-14 15:48:27 -04:00
/** UClass associated with this entry. */
virtual UClass * GetUClass ( ) const = 0 ;
/** Returns true if the UObject is of a Class which is a child of this UClass associated with this entry. */
virtual bool IsChildClass ( const UObject * InObject ) const = 0 ;
/** Returns true if the UClass is a child of this UClass associated with this entry. */
virtual bool IsChildClass ( const UClass * InClass ) const = 0 ;
2023-04-04 19:14:26 -04:00
/** Returns whether entry's class is a serialized asset or a transient type */
virtual bool IsAssetType ( ) const = 0 ;
2020-12-14 15:48:27 -04:00
/** Attempts to cast the UObject to an FMetasoundAssetBase */
virtual FMetasoundAssetBase * Cast ( UObject * InObject ) const = 0 ;
/** Attempts to cast the UObject to an FMetasoundAssetBase */
virtual const FMetasoundAssetBase * Cast ( const UObject * InObject ) const = 0 ;
/** Creates a new object of the UClass type. */
2023-03-07 17:01:52 -05:00
UE_DEPRECATED ( 5.3 , " NewObject is now done via the MetaSoundBuilder system. Attempting to create a MetaSound via this call will now always fail. " )
virtual UObject * NewObject ( UPackage * InPackage , const FName & InName ) const
{
checkNoEntry ( ) ;
return nullptr ;
}
2020-12-14 15:48:27 -04:00
private :
IMetasoundUObjectRegistryEntry ( ) = default ;
/** Only the TMetasoundUObjectRegistryEntry can construct this class. */
template < typename UClassType >
friend class TMetasoundUObjectRegistryEntry ;
} ;
2021-11-22 15:55:50 -05:00
/** An entry into the Metasound-UObject registry.
2020-12-14 15:48:27 -04:00
*
2023-04-04 19:14:26 -04:00
* @ Tparam UClassType A class which derives from UObject and IMetaSoundDocumentInterface .
* @ Tparam IsAssetType If true , type derives from FMetasoundAssetBase and is considered a serializable , playable asset .
2020-12-14 15:48:27 -04:00
*/
template < typename UClassType >
class TMetasoundUObjectRegistryEntry : public IMetasoundUObjectRegistryEntry
{
2023-04-04 19:14:26 -04:00
// Ensure that this is a subclass of IMetaSoundDocumentInterface and UObject.
static_assert ( std : : is_base_of < IMetaSoundDocumentInterface , UClassType > : : value , " UClass must be derived from IMetaSoundDocumentInterface " ) ;
2020-12-14 15:48:27 -04:00
static_assert ( std : : is_base_of < UObject , UClassType > : : value , " UClass must be derived from UObject " ) ;
public :
2023-03-07 17:01:52 -05:00
TMetasoundUObjectRegistryEntry ( ) = default ;
2020-12-14 15:48:27 -04:00
virtual ~ TMetasoundUObjectRegistryEntry ( ) = default ;
UClass * GetUClass ( ) const override
{
return UClassType : : StaticClass ( ) ;
}
2023-04-04 19:14:26 -04:00
virtual bool IsChildClass ( const UObject * InObject ) const override
2020-12-14 15:48:27 -04:00
{
if ( nullptr ! = InObject )
{
return InObject - > IsA ( UClassType : : StaticClass ( ) ) ;
}
return false ;
}
2023-04-04 19:14:26 -04:00
virtual bool IsChildClass ( const UClass * InClass ) const override
2020-12-14 15:48:27 -04:00
{
if ( nullptr ! = InClass )
{
return InClass - > IsChildOf ( UClassType : : StaticClass ( ) ) ;
}
return false ;
}
2023-04-04 19:14:26 -04:00
virtual bool IsAssetType ( ) const override
2020-12-14 15:48:27 -04:00
{
2023-04-04 19:14:26 -04:00
return std : : is_base_of < FMetasoundAssetBase , UClassType > : : value ;
2020-12-14 15:48:27 -04:00
}
2023-04-04 19:14:26 -04:00
virtual FMetasoundAssetBase * Cast ( UObject * InObject ) const override
2020-12-14 15:48:27 -04:00
{
2023-04-04 19:14:26 -04:00
if constexpr ( ! std : : is_base_of < FMetasoundAssetBase , UClassType > : : value )
2020-12-14 15:48:27 -04:00
{
return nullptr ;
}
2023-04-04 19:14:26 -04:00
else
{
if ( InObject )
{
return static_cast < FMetasoundAssetBase * > ( CastChecked < UClassType > ( InObject ) ) ;
}
return nullptr ;
}
}
virtual const FMetasoundAssetBase * Cast ( const UObject * InObject ) const override
{
if constexpr ( ! std : : is_base_of < FMetasoundAssetBase , UClassType > : : value )
{
return nullptr ;
}
else
{
if ( InObject )
{
return static_cast < const FMetasoundAssetBase * > ( CastChecked < const UClassType > ( InObject ) ) ;
}
return nullptr ;
}
2020-12-14 15:48:27 -04:00
}
} ;
2021-11-22 15:55:50 -05:00
/** IMetasoundUObjectRegistry contains IMetasoundUObjectRegistryEntries.
2020-12-14 15:48:27 -04:00
*
* Registered UObject classes can utilize the Metasound Editor . It also enables
2021-01-13 10:48:59 -04:00
* the creation of a UObject directly from a FMetasoundFrontendDocument .
2020-12-14 15:48:27 -04:00
*/
class METASOUNDENGINE_API IMetasoundUObjectRegistry
{
public :
virtual ~ IMetasoundUObjectRegistry ( ) = default ;
/** Return static singleton instance of the registry. */
static IMetasoundUObjectRegistry & Get ( ) ;
/** Adds an entry to the registry. */
2023-03-07 17:01:52 -05:00
virtual void RegisterUClass ( TUniquePtr < IMetasoundUObjectRegistryEntry > & & InEntry ) = 0 ;
2020-12-14 15:48:27 -04:00
2023-03-07 17:01:52 -05:00
UE_DEPRECATED ( 5.3 , " Interfaces are no longer registered with the UObject registry as interfaces now support multiple UClasses that are registered with the interface registry. " )
virtual void RegisterUClassInterface ( TUniquePtr < IMetasoundUObjectRegistryEntry > & & InEntry ) { }
2020-12-14 15:48:27 -04:00
2023-03-07 17:01:52 -05:00
UE_DEPRECATED ( 5.3 , " Interfaces are no longer registered with the UObject registry as interfaces now support multiple UClasses that are registered with the interface registry. " )
virtual TArray < const IMetasoundUObjectRegistryEntry * > FindInterfaceEntriesByName ( FName InName ) const { return { } ; }
UE_DEPRECATED ( 5.3 , " Interfaces are no longer registered with the UObject registry as interfaces now support multiple UClasses that are registered with the interface registry. " )
virtual TArray < UClass * > FindSupportedInterfaceClasses ( const FMetasoundFrontendVersion & InInterfaceVersion ) const { return { } ; }
2021-11-22 15:55:50 -05:00
/** Creates a new object from a MetaSound document.
2020-12-14 15:48:27 -04:00
*
* @ param InClass - A registered UClass to create .
2021-06-08 10:52:31 -04:00
* @ param InDocument - The FMetasoundFrontendDocument to use when creating the class .
2021-11-22 15:55:50 -05:00
* @ param InInterfaceVersion - The version of the FMetasoundFrontendClassInterface to use when creating the class .
2020-12-14 15:48:27 -04:00
* @ param InPath - If in editor , the created asset will be stored at this content path .
*
* @ return A new object . A nullptr on error .
*/
2023-03-07 17:01:52 -05:00
UE_DEPRECATED ( 5.3 , " UObject registry form of NewObject is no longer used. Use UMetaSoundBuilderSubsystem to author MetaSounds instead. " )
virtual UObject * NewObject ( UClass * InClass , const FMetasoundFrontendDocument & InDocument , const FString & InPath ) const { return nullptr ; }
2020-12-14 15:48:27 -04:00
2021-12-10 20:37:31 -05:00
/** Iterate all registered UClasses that serve as MetaSound assets.*/
2023-04-04 19:14:26 -04:00
virtual void IterateRegisteredUClasses ( TFunctionRef < void ( UClass & ) > InFunc , bool bAssetTypesOnly = true ) const = 0 ;
2021-12-10 20:37:31 -05:00
2020-12-14 15:48:27 -04:00
/** Returns true if the InObject is of a class or child class which is registered. */
virtual bool IsRegisteredClass ( UObject * InObject ) const = 0 ;
2023-04-04 19:14:26 -04:00
/** Returns true if the InClass matches a class or child class which is registered. */
virtual bool IsRegisteredClass ( const UClass & InClass ) const = 0 ;
2020-12-14 15:48:27 -04:00
/** Returns casts the UObject to a FMetasoundAssetBase if the UObject is of a registered type.
* If the UObject ' s UClass is not registered , then a nullptr is returned .
*/
virtual FMetasoundAssetBase * GetObjectAsAssetBase ( UObject * InObject ) const = 0 ;
/** Returns casts the UObject to a FMetasoundAssetBase if the UObject is of a registered type.
* If the UObject ' s UClass is not registered , then a nullptr is returned .
*/
virtual const FMetasoundAssetBase * GetObjectAsAssetBase ( const UObject * InObject ) const = 0 ;
} ;
2021-06-16 11:21:13 -04:00
} // namespace Metasound