// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #include "PersonaPrivatePCH.h" #include "PersonaModule.h" #include "Persona.h" #include "BlueprintUtilities.h" #include "AnimGraphDefinitions.h" #include "Toolkits/ToolkitManager.h" #include "Runtime/AssetRegistry/Public/AssetRegistryModule.h" #include "PropertyEditorModule.h" #include "SkeletalMeshSocketDetails.h" #include "AnimNotifyDetails.h" #include "AnimGraphNodeDetails.h" #include "AnimInstanceDetails.h" IMPLEMENT_MODULE( FPersonaModule, Persona ); const FName PersonaAppName = FName(TEXT("PersonaApp")); void FPersonaModule::StartupModule() { MenuExtensibilityManager = MakeShareable(new FExtensibilityManager); ToolBarExtensibilityManager = MakeShareable(new FExtensibilityManager); // Load all blueprint animnotifies from asset registry so they are available from drop downs in anim segment detail views { FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")); // Collect a full list of assets with the specified class TArray AssetData; AssetRegistryModule.Get().GetAssetsByClass(UBlueprint::StaticClass()->GetFName(), AssetData); const FName BPParentClassName( TEXT( "ParentClass" ) ); const FString BPAnimNotify( TEXT("Class'/Script/Engine.AnimNotify'" )); for (int32 AssetIndex = 0; AssetIndex < AssetData.Num(); ++AssetIndex) { FString TagValue = AssetData[ AssetIndex ].TagsAndValues.FindRef(BPParentClassName); if (TagValue == BPAnimNotify) { FString BlueprintPath = AssetData[AssetIndex].ObjectPath.ToString(); LoadObject(NULL, *BlueprintPath, NULL, 0, NULL); } } } { FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); PropertyModule.RegisterCustomClassLayout( "SkeletalMeshSocket", FOnGetDetailCustomizationInstance::CreateStatic( &FSkeletalMeshSocketDetails::MakeInstance ) ); PropertyModule.RegisterCustomClassLayout( "EditorNotifyObject", FOnGetDetailCustomizationInstance::CreateStatic(&FAnimNotifyDetails::MakeInstance)); PropertyModule.RegisterCustomClassLayout( "AnimGraphNode_Base", FOnGetDetailCustomizationInstance::CreateStatic( &FAnimGraphNodeDetails::MakeInstance ) ); PropertyModule.RegisterCustomClassLayout( "AnimInstance", FOnGetDetailCustomizationInstance::CreateStatic(&FAnimInstanceDetails::MakeInstance)); PropertyModule.RegisterCustomPropertyTypeLayout( "InputScaleBias", FOnGetPropertyTypeCustomizationInstance::CreateStatic( &FInputScaleBiasCustomization::MakeInstance ) ); PropertyModule.RegisterCustomPropertyTypeLayout( "BoneReference", FOnGetPropertyTypeCustomizationInstance::CreateStatic( &FBoneReferenceCustomization::MakeInstance ) ); } } void FPersonaModule::ShutdownModule() { MenuExtensibilityManager.Reset(); ToolBarExtensibilityManager.Reset(); // unregsiter when shut down if(FModuleManager::Get().IsModuleLoaded("PropertyEditor")) { FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); PropertyModule.UnregisterCustomClassLayout("SkeletalMeshSocket"); PropertyModule.UnregisterCustomClassLayout("EditorNotifyObject"); PropertyModule.UnregisterCustomClassLayout("AnimGraphNode_Base"); PropertyModule.UnregisterCustomPropertyTypeLayout("InputScaleBias"); PropertyModule.UnregisterCustomPropertyTypeLayout("BoneReference"); } } TSharedRef FPersonaModule::CreatePersona( const EToolkitMode::Type Mode, const TSharedPtr< IToolkitHost >& InitToolkitHost, class USkeleton* Skeleton, class UAnimBlueprint* Blueprint, class UAnimationAsset* AnimationAsset, class USkeletalMesh * Mesh ) { TSharedRef< FPersona > NewPersona( new FPersona() ); NewPersona->InitPersona( Mode, InitToolkitHost, Skeleton, Blueprint, AnimationAsset, Mesh ); return NewPersona; }