// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "ControlRigBlueprintGeneratedClass.h" #include "UObject/ObjectMacros.h" #include "Engine/Blueprint.h" #include "Engine/Texture2D.h" #include "ControlRigDefines.h" #include "Rigs/RigHierarchyContainer.h" #include "Rigs/RigHierarchy.h" #include "Interfaces/Interface_PreviewMeshProvider.h" #include "ControlRigGizmoLibrary.h" #include "ControlRigSchema.h" #include "RigVMCore/RigVMStatistics.h" #include "RigVMModel/RigVMClient.h" #include "ControlRigValidationPass.h" #include "RigVMBlueprintLegacy.h" #include "Rigs/RigModuleDefines.h" #include "ModularRigModel.h" #include "ControlRigAsset.h" #if WITH_EDITOR #include "Kismet2/CompilerResultsLog.h" #include "Overrides/SOverrideListWidget.h" #endif #include "ControlRigBlueprintLegacy.generated.h" class URigVMBlueprintGeneratedClass; UCLASS(MinimalAPI, BlueprintType, meta=(IgnoreClassThumbnail)) class UControlRigBlueprint : public URigVMBlueprint, public IControlRigAssetInterface, public IInterface_PreviewMeshProvider, public IRigHierarchyProvider { GENERATED_UCLASS_BODY() public: CONTROLRIGDEVELOPER_API UControlRigBlueprint(); // --- IControlRigAssetInterface interface --- virtual FRigVMAssetInterfacePtr GetRigVMAssetInterface() override { return FRigVMAssetInterfacePtr(this); } virtual FModularRigModel& GetModularRigModel() override { return ModularRigModel; } virtual URigHierarchy* GetHierarchy() const override { return Hierarchy; } virtual URigHierarchy* GetHierarchy() override { return Hierarchy; } virtual TSoftObjectPtr& GetPreviewSkeletalMesh() override { return PreviewSkeletalMesh; } virtual bool& GetAllowMultipleInstances() override { return bAllowMultipleInstances; } virtual TMap& GetArrayConnectionMap() override { return ArrayConnectionMap; } virtual EControlRigType& GetControlRigType() override { return ControlRigType; } virtual FString& GetCustomThumbnail() override { return CustomThumbnail; } virtual float& GetDebugBoneRadius() override { return DebugBoneRadius; } virtual FRigVMDrawContainer& GetDrawContainer() override { return DrawContainer; } virtual bool& GetExposesAnimatableControls() override { return bExposesAnimatableControls; } virtual FRigHierarchySettings& GetHierarchySettings() override { return HierarchySettings; } virtual FRigInfluenceMapPerEvent& GetInfluences() override { return Influences; } virtual FName& GetItemTypeDisplayName() override { return ItemTypeDisplayName; } virtual FModularRigSettings& GetModularRigSettings() override { return ModularRigSettings; } virtual FRigModuleSettings& GetRigModuleSettings() override { return RigModuleSettings; } virtual TArray& GetModuleReferenceData() override { return ModuleReferenceData; } virtual TArray>& GetShapeLibraries() override { return ShapeLibraries; } virtual TSoftObjectPtr& GetSourceCurveImport() override { return SourceCurveImport; } virtual TSoftObjectPtr& GetSourceHierarchyImport() override { return SourceHierarchyImport; } virtual bool& GetSupportsControls() override { return bSupportsControls; } virtual bool& GetSupportsInversion() override { return bSupportsInversion; } virtual TObjectPtr& GetValidator() override { return Validator; } // --- IRigVMClientHost interface --- virtual UClass* GetRigVMSchemaClass() const override { return IControlRigAssetInterface::GetRigVMSchemaClass(); } virtual UScriptStruct* GetRigVMExecuteContextStruct() const override { return IControlRigAssetInterface::GetRigVMExecuteContextStruct(); } CONTROLRIGDEVELOPER_API virtual UClass* GetRigVMEdGraphClass() const override { return IControlRigAssetInterface::GetRigVMEdGraphClass(); } CONTROLRIGDEVELOPER_API virtual UClass* GetRigVMEdGraphNodeClass() const override { return IControlRigAssetInterface::GetRigVMEdGraphNodeClass(); } CONTROLRIGDEVELOPER_API virtual UClass* GetRigVMEdGraphSchemaClass() const override { return IControlRigAssetInterface::GetRigVMEdGraphSchemaClass(); } CONTROLRIGDEVELOPER_API virtual UClass* GetRigVMEditorSettingsClass() const override { return IControlRigAssetInterface::GetRigVMEditorSettingsClass(); } // URigVMBlueprint interface UE_DEPRECATED(5.7, "Please use GetRigVMGeneratedClassPrototype") virtual UClass* GetRigVMBlueprintGeneratedClassPrototype() const { return UControlRigBlueprintGeneratedClass::StaticClass(); } virtual UClass* GetRigVMGeneratedClassPrototype() const override { return UControlRigBlueprintGeneratedClass::StaticClass(); } CONTROLRIGDEVELOPER_API virtual TArray GeneratePythonCommands(const FString InNewBlueprintName) override { return IControlRigAssetInterface::GeneratePythonCommands(InNewBlueprintName); } CONTROLRIGDEVELOPER_API virtual void GetPreloadDependencies(TArray& OutDeps) override; #if WITH_EDITOR CONTROLRIGDEVELOPER_API virtual const FLazyName& GetPanelPinFactoryName() const override { return IControlRigAssetInterface::GetPanelPinFactoryName(); } CONTROLRIGDEVELOPER_API virtual IRigVMEditorModule* GetEditorModule() const override { return IControlRigAssetInterface::GetEditorModule(); } #endif CONTROLRIGDEVELOPER_API virtual void Serialize(FArchive& Ar) override; virtual void SerializeSuper(FArchive& Ar) override { return URigVMBlueprint::SerializeSuper(Ar); } #if WITH_EDITOR // UBlueprint interface CONTROLRIGDEVELOPER_API virtual UClass* GetBlueprintClass() const override { return IControlRigAssetInterface::GetBlueprintClass(); } CONTROLRIGDEVELOPER_API virtual UClass* RegenerateClass(UClass* ClassToRegenerate, UObject* PreviousCDO) override; virtual bool RequiresForceLoadMembersSuper(UObject* InObject) const override { return URigVMBlueprint::RequiresForceLoadMembersSuper(InObject); } virtual bool SupportedByDefaultBlueprintFactory() const override { return IControlRigAssetInterface::SupportedByDefaultBlueprintFactory(); } virtual bool IsValidForBytecodeOnlyRecompile() const override { return IControlRigAssetInterface::IsValidForBytecodeOnlyRecompile(); } CONTROLRIGDEVELOPER_API virtual void GetTypeActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override { return IControlRigAssetInterface::GetTypeActions(ActionRegistrar); } CONTROLRIGDEVELOPER_API virtual void GetInstanceActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override { return IControlRigAssetInterface::GetInstanceActions(ActionRegistrar); } CONTROLRIGDEVELOPER_API virtual void PreSave(FObjectPreSaveContext ObjectSaveContext) override; CONTROLRIGDEVELOPER_API virtual void PostLoad() override; CONTROLRIGDEVELOPER_API virtual void PostTransacted(const FTransactionObjectEvent& TransactionEvent) override; CONTROLRIGDEVELOPER_API virtual void PostDuplicate(bool bDuplicateForPIE) override; CONTROLRIGDEVELOPER_API virtual void PostRename(UObject* OldOuter, const FName OldName) override; CONTROLRIGDEVELOPER_API virtual bool RequiresForceLoadMembers(UObject* InObject) const override { return IControlRigAssetInterface::RequiresForceLoadMembers(InObject); } virtual bool SupportsGlobalVariables() const override { return IControlRigAssetInterface::SupportsGlobalVariables(); } virtual bool SupportsLocalVariables() const override { return IControlRigAssetInterface::SupportsLocalVariables(); } virtual bool SupportsFunctions() const override { return IControlRigAssetInterface::SupportsFunctions(); } virtual bool SupportsEventGraphs() const override { return IControlRigAssetInterface::SupportsEventGraphs(); } // UObject interface CONTROLRIGDEVELOPER_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; CONTROLRIGDEVELOPER_API virtual void PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent) override; #endif // #if WITH_EDITOR UFUNCTION(BlueprintCallable, Category = "VM") CONTROLRIGDEVELOPER_API virtual UClass* GetControlRigClass() const { return IControlRigAssetInterface::GetControlRigClass(); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") UControlRig* CreateControlRig() { return IControlRigAssetInterface::CreateControlRig(); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") UControlRig* GetDebuggedControlRig() { return IControlRigAssetInterface::GetDebuggedControlRig(); } /** IInterface_PreviewMeshProvider interface */ UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API virtual void SetPreviewMesh(USkeletalMesh* PreviewMesh, bool bMarkAsDirty = true) override { return IControlRigAssetInterface::SetPreviewMesh(PreviewMesh, bMarkAsDirty); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API virtual USkeletalMesh* GetPreviewMesh() const override { return IControlRigAssetInterface::GetPreviewMesh(); } UFUNCTION(BlueprintPure, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API virtual bool IsControlRigModule() const { return IControlRigAssetInterface::IsControlRigModule(); } #if WITH_EDITORONLY_DATA UFUNCTION(BlueprintCallable, meta = (DisplayName = "TurnIntoControlRigModule", ScriptName = "TurnIntoControlRigModule"), Category = "Control Rig Blueprint") bool TurnIntoControlRigModule_Blueprint() { return IControlRigAssetInterface::TurnIntoControlRigModule(); } UFUNCTION(BlueprintPure, meta = (DisplayName = "CanTurnIntoStandaloneRig", ScriptName = "CanTurnIntoStandaloneRig"), Category = "Control Rig Blueprint") bool CanTurnIntoStandaloneRig_Blueprint() const { return IControlRigAssetInterface::CanTurnIntoStandaloneRig(); } UFUNCTION(BlueprintCallable, meta = (DisplayName = "TurnIntoStandaloneRig", ScriptName = "TurnIntoStandaloneRig"), Category = "Control Rig Blueprint") bool TurnIntoStandaloneRig_Blueprint() { return IControlRigAssetInterface::TurnIntoStandaloneRig(); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API TArray ConvertHierarchyElementsToSpawnerNodes(URigHierarchy* InHierarchy, TArray InKeys, bool bRemoveElements = true) { return IControlRigAssetInterface::ConvertHierarchyElementsToSpawnerNodes(InHierarchy, InKeys, bRemoveElements); } #endif // WITH_EDITORONLY_DATA UFUNCTION(BlueprintPure, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API UTexture2D* GetRigModuleIcon() const { return IControlRigAssetInterface::GetRigModuleIcon(); } UPROPERTY(EditAnywhere, Category = "Modular Rig") FModularRigSettings ModularRigSettings; UPROPERTY(EditAnywhere, Category = "Hierarchy") FRigHierarchySettings HierarchySettings; UPROPERTY(EditAnywhere, Category = "Hierarchy", AssetRegistrySearchable) FRigModuleSettings RigModuleSettings; // This relates to FAssetThumbnailPool::CustomThumbnailTagName and allows // the thumbnail pool to show the thumbnail of the icon rather than the // rig itself to avoid deploying the 3D renderer. UPROPERTY(EditAnywhere, Category = "Hierarchy", AssetRegistrySearchable) FString CustomThumbnail; /** Asset searchable information module references in this rig */ UPROPERTY(AssetRegistrySearchable) TArray ModuleReferenceData; UPROPERTY() TMap ConnectionMap_DEPRECATED; UPROPERTY() TMap ArrayConnectionMap; UFUNCTION(BlueprintPure, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API TArray FindReferencesToModule() const { return IControlRigAssetInterface::FindReferencesToModule(); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API virtual void UpdateExposedModuleConnectors() const { return IControlRigAssetInterface::UpdateExposedModuleConnectors(); } protected: /** Asset searchable information about exposed public functions on this rig */ UPROPERTY(AssetRegistrySearchable) TArray PublicFunctions_DEPRECATED; CONTROLRIGDEVELOPER_API virtual void SetupDefaultObjectDuringCompilation(URigVMHost* InCDO) override { return IControlRigAssetInterface::SetupDefaultObjectDuringCompilation(InCDO); } public: CONTROLRIGDEVELOPER_API virtual void SetupPinRedirectorsForBackwardsCompatibility() override { return IControlRigAssetInterface::SetupPinRedirectorsForBackwardsCompatibility(); } UFUNCTION(BlueprintCallable, Category = "VM") static CONTROLRIGDEVELOPER_API TArray GetCurrentlyOpenRigBlueprints(); #if WITH_EDITORONLY_DATA UPROPERTY() TSoftObjectPtr GizmoLibrary_DEPRECATED; UPROPERTY(EditAnywhere, Category = Shapes) TArray> ShapeLibraries; UPROPERTY(transient, DuplicateTransient, meta = (DisplayName = "VM Statistics", DisplayAfter = "VMCompileSettings")) FRigVMStatistics Statistics_DEPRECATED; #endif UPROPERTY(EditAnywhere, Category = "Drawing") FRigVMDrawContainer DrawContainer; UPROPERTY(EditAnywhere, Category = "Influence Map") FRigInfluenceMapPerEvent Influences; public: #if WITH_EDITORONLY_DATA UPROPERTY() FRigHierarchyContainer HierarchyContainer_DEPRECATED; #endif UPROPERTY(BlueprintReadOnly, Category = "Hierarchy") TObjectPtr Hierarchy; UFUNCTION(BlueprintCallable, Category = "Hierarchy") URigHierarchyController* GetHierarchyController() { return IControlRigAssetInterface::GetHierarchyController(); } UPROPERTY(BlueprintReadOnly, Category = "Modules") FModularRigModel ModularRigModel; UFUNCTION(BlueprintCallable, Category = "Modules") CONTROLRIGDEVELOPER_API virtual UModularRigController* GetModularRigController() { return IControlRigAssetInterface::GetModularRigController(); } UFUNCTION(BlueprintCallable, Category = "Control Rig Blueprint") CONTROLRIGDEVELOPER_API virtual void RecompileModularRig() { return IControlRigAssetInterface::RecompileModularRig(); } UPROPERTY(AssetRegistrySearchable) EControlRigType ControlRigType; UPROPERTY(AssetRegistrySearchable) FName ItemTypeDisplayName = TEXT("Control Rig"); private: /** Whether or not this rig has an Inversion Event */ UPROPERTY(AssetRegistrySearchable) bool bSupportsInversion; /** Whether or not this rig has Controls on It */ UPROPERTY(AssetRegistrySearchable) bool bSupportsControls; /** The default skeletal mesh to use when previewing this asset */ #if WITH_EDITORONLY_DATA UPROPERTY(AssetRegistrySearchable, EditAnywhere, Category="Control Rig Blueprint") TSoftObjectPtr PreviewSkeletalMesh; #endif /** The skeleton from import into a hierarchy */ UPROPERTY(DuplicateTransient, AssetRegistrySearchable, EditAnywhere, Category="Control Rig Blueprint") TSoftObjectPtr SourceHierarchyImport; /** The skeleton from import into a curve */ UPROPERTY(DuplicateTransient, AssetRegistrySearchable, EditAnywhere, Category="Control Rig Blueprint") TSoftObjectPtr SourceCurveImport; /** If set to true, this control rig has animatable controls */ UPROPERTY(AssetRegistrySearchable) bool bExposesAnimatableControls; public: /** If set to true, multiple control rig tracks can be created for the same rig in sequencer*/ UPROPERTY(EditAnywhere, Category="Sequencer", AssetRegistrySearchable) bool bAllowMultipleInstances = false; private: CONTROLRIGDEVELOPER_API virtual void PathDomainSpecificContentOnLoad() override { return IControlRigAssetInterface::PathDomainSpecificContentOnLoad(); } CONTROLRIGDEVELOPER_API virtual void GetBackwardsCompatibilityPublicFunctions(TArray& BackwardsCompatiblePublicFunctions, TMap& OldHeaders) override; protected: CONTROLRIGDEVELOPER_API virtual void CreateMemberVariablesOnLoad() override { return IControlRigAssetInterface::CreateMemberVariablesOnLoad(); } CONTROLRIGDEVELOPER_API virtual void PatchVariableNodesOnLoad() override; virtual void SetHierarchy(TObjectPtr InHierarchy) override { Hierarchy = InHierarchy; } private: UPROPERTY() TObjectPtr Validator; FRigHierarchyModifiedEvent HierarchyModifiedEvent; FOnRigVMRefreshEditorEvent ModularRigPreCompiled; FOnRigVMRefreshEditorEvent ModularRigCompiled; UPROPERTY(transient, DuplicateTransient) int32 ModulesRecompilationBracket = 0; #if WITH_EDITOR CONTROLRIGDEVELOPER_API virtual void HandlePackageDone() override { return IControlRigAssetInterface::HandlePackageDone(); } virtual void HandlePackageDoneSuper() override { return URigVMBlueprint::HandlePackageDone(); } CONTROLRIGDEVELOPER_API virtual void HandleConfigureRigVMController(const FRigVMClient* InClient, URigVMController* InControllerToConfigure) override { return IControlRigAssetInterface::HandleConfigureRigVMController(InClient, InControllerToConfigure); } #endif UPROPERTY() float DebugBoneRadius; friend class FControlRigBlueprintActions; };