Browse Source

新增EzAbilityEditor启动Asset功能

maboren 3 months ago
parent
commit
992ed6c43b

+ 3 - 2
Ability/Plugins/EzAbility/Source/EzAbilityEditor/EzAbilityEditor.Build.cs

@@ -44,8 +44,9 @@ public class EzAbilityEditor : ModuleRules
 				"StructUtilsEngine",
 				"StructUtilsEditor",
 				"GameplayTags",
-				"EzAbility"
-			}
+				"EzAbility",
+                "Kismet"
+            }
 			);
 			
 		

+ 63 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Private/AssetDefinition_EZAbilityAsset.cpp

@@ -0,0 +1,63 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+
+#include "AssetDefinition_EZAbilityAsset.h"
+#include "EZAbilityBlueprint.h"
+#include "EzAbilityEditor.h"
+#include "ThumbnailRendering/SceneThumbnailInfo.h"
+
+
+#define LOCTEXT_NAMESPACE "AssetDefinition_AbilityAsset"
+
+// UThumbnailInfo* UAssetDefinition_AbilityAsset::LoadThumbnailInfo(const FAssetData& InAssetData) const
+// {
+// 	return UE::Editor::FindOrCreateThumbnailInfo(InAssetData.GetAsset(), USceneThumbnailInfo::StaticClass());
+// }
+
+
+FText UAssetDefinition_EZAbilityAsset::GetAssetDisplayName() const
+{
+	/* 在没有缩略图的情况下写在图标上的 */
+	return LOCTEXT("UAssetDefinition_EZAbilityAsset", "Ability Asset");
+}
+
+TSoftClassPtr<UObject> UAssetDefinition_EZAbilityAsset::GetAssetClass() const
+{
+	/* 没有这个不能创建目录 */
+	return UEZAbilityBlueprint::StaticClass();
+}
+
+FLinearColor UAssetDefinition_EZAbilityAsset::GetAssetColor() const
+{
+	return FLinearColor(FColor(201, 29, 85));
+}
+
+FText UAssetDefinition_EZAbilityAsset::GetAssetDescription(const FAssetData& AssetData) const
+{
+	/* 鼠标移到Asset的描述 */
+	return LOCTEXT("UAssetDefinition_EZAbilityAsset", "Data of all abilities.");
+}
+
+TConstArrayView<FAssetCategoryPath> UAssetDefinition_EZAbilityAsset::GetAssetCategories() const
+{
+	static const auto Categories = { FAssetCategoryPath(LOCTEXT("Ability","AbilityAsset")) };
+	return Categories;
+}
+
+EAssetCommandResult UAssetDefinition_EZAbilityAsset::OpenAssets(const FAssetOpenArgs& OpenArgs) const
+{
+	//Super::OpenAssets(OpenArgs);
+
+	FEzAbilityEditorModule& AbilityEditorModule = FModuleManager::LoadModuleChecked<FEzAbilityEditorModule>("EzAbilityEditor");//这里是Module的名称
+	for (UEZAbilityBlueprint* AbilityAsset : OpenArgs.LoadObjects<UEZAbilityBlueprint>())
+	{
+		UAssetEditorSubsystem* AssetEditorSubsystem = GEditor->GetEditorSubsystem<UAssetEditorSubsystem>();
+
+		/* 此处是初始化Asset界面的重要位置 */
+		AbilityEditorModule.CreateEzAbilityEditor(EToolkitMode::Standalone, OpenArgs.ToolkitHost, AbilityAsset);
+	}
+
+	return EAssetCommandResult::Handled;
+}
+
+#undef LOCTEXT_NAMESPACE

+ 54 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Private/EZAbilityAssetFactory.cpp

@@ -0,0 +1,54 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+
+#include "EZAbilityAssetFactory.h"
+#include "EZAbilityBlueprint.h"
+#include "EZAbility.h"
+#include "Kismet2/KismetEditorUtilities.h"
+
+
+#define LOCTEXT_NAMESPACE "EZAbilityAssetFactory"
+
+UEZAbilityAssetFactory::UEZAbilityAssetFactory()
+{
+	/* Asset必须和Definit一致 */
+	SupportedClass = UEZAbilityBlueprint::StaticClass();
+}
+
+UObject* UEZAbilityAssetFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
+{
+	UEZAbilityBlueprint* AbilityBlueprint = nullptr;
+
+	AbilityBlueprint = CastChecked<UEZAbilityBlueprint>(FKismetEditorUtilities::CreateBlueprint(UEzAbility::StaticClass(), InParent, Name, BPTYPE_Normal, UEZAbilityBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass(), NAME_None));
+
+	return	AbilityBlueprint;
+}
+
+bool UEZAbilityAssetFactory::CanCreateNew() const
+{
+	return true;
+}
+
+FString UEZAbilityAssetFactory::GetDefaultNewAssetName() const
+{
+	return FString(TEXT("NewAbility"));
+}
+
+FText UEZAbilityAssetFactory::GetDisplayName() const
+{
+	/* 选项中的名字 */
+	return LOCTEXT("Ability", "Ability Asset");
+}
+
+bool UEZAbilityAssetFactory::ShouldShowInNewMenu() const
+{
+	return true;
+}
+
+FText UEZAbilityAssetFactory::GetToolTip() const
+{
+	return LOCTEXT("Ability_Tooltip", "Data used by the ability set to grant gameplay abilities.");
+}
+
+
+#undef LOCTEXT_NAMESPACE

+ 5 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Private/EZAbilityBlueprint.cpp

@@ -0,0 +1,5 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+
+#include "EZAbilityBlueprint.h"
+

+ 12 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Private/EzAbilityEditor.cpp

@@ -1,11 +1,23 @@
 // Copyright Epic Games, Inc. All Rights Reserved.
 
 #include "EzAbilityEditor.h"
+#include "EzAbility.h"
+#include "EZAbilityBlueprint.h"
+#include "EzAbilityGraphEditor.h"
 
 DEFINE_LOG_CATEGORY(LogEzAbilityEditor);
 
 #define LOCTEXT_NAMESPACE "FEzAbilityEditorModule"
 
+const FName FEzAbilityEditorModule::AbilityEditorAppId(TEXT("AbilityEditorApp"));
+
+TSharedRef<class FEzAbilityEditor> FEzAbilityEditorModule::CreateEzAbilityEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, class UEZAbilityBlueprint* EzAbilityAsset)
+{
+	TSharedRef< FEzAbilityEditor > NewAbilityEditor(new FEzAbilityEditor());
+	NewAbilityEditor->InitEzAbilityEditor(Mode, InitToolkitHost,EzAbilityAsset);
+	return NewAbilityEditor;
+}
+
 void FEzAbilityEditorModule::StartupModule()
 {
 	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module

+ 225 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Private/EzAbilityGraphEditor.cpp

@@ -0,0 +1,225 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+
+// #include "FDialogueDeductionGraphEditor.h"
+// #include "FDialogueDeEditorApplicationMode.h"
+// #include "DialogueDeductionModule.h"
+#include "EzAbilityGraphEditor.h"
+#include "Kismet2/BlueprintEditorUtils.h"
+//#include "DialogueDeductionEdGraph.h"
+#include "SBlueprintEditorToolbar.h"
+#include "Kismet2/DebuggerCommands.h"
+#include "WorkflowOrientedApp/WorkflowUObjectDocuments.h"
+#include "EditorStyleSet.h"
+#include "../Public/EZAbilityBlueprint.h"
+//#include "DialogueEditorTabs.h"
+//#include "SEditorViewport.h"
+//#include "SDialogueEditorViewport.h"
+
+
+#define LOCTEXT_NAMESPACE "EzAbilityEditor"
+
+const FName FEzAbilityEditor::EzAbilityEditorMode(TEXT("AbilityEditor"));
+// 
+// UMBRData* FDialogueDeductionGraphEditor::GetDialogueDeduction() const
+// {
+// 	return TestDataAsset;
+// }
+
+
+FEzAbilityEditor::FEzAbilityEditor()
+{
+}
+
+FEzAbilityEditor::~FEzAbilityEditor()
+{
+}
+
+void FEzAbilityEditor::InitEzAbilityEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost,  UEZAbilityBlueprint* InEzAbilityAsset)
+{
+	EzAbilityDataAsset = InEzAbilityAsset;
+
+	if (!Toolbar.IsValid())
+	{
+		Toolbar = MakeShareable(new FBlueprintEditorToolbar(SharedThis(this)));
+	}
+
+	GetToolkitCommands()->Append(FPlayWorldCommands::GlobalPlayWorldActions.ToSharedRef());
+
+	CreateDefaultCommands();
+	//BindCommands();
+	RegisterMenus();
+
+	//CreateInternalWidgets();
+
+
+	TArray<UObject*> ObjectsToEdit;
+	ObjectsToEdit.Add((UObject*)EzAbilityDataAsset);
+
+	const bool bCreateDefaultStandaloneMenu = true;
+	const bool bCreateDefaultToolbar = true;
+
+	InitAssetEditor(Mode, InitToolkitHost, FEzAbilityEditorModule::AbilityEditorAppId, FTabManager::FLayout::NullLayout, bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, ObjectsToEdit);
+
+	TArray<UBlueprint*> EditedBlueprints;
+	EditedBlueprints.Add((UBlueprint*)EzAbilityDataAsset);
+
+	CommonInitialization(EditedBlueprints, false);		/* 构建Tab 没有的情况下 CreateDefaultTabContents 下个智能指针会崩溃*/
+
+	//AddApplicationMode(EzAbilityEditorMode, MakeShareable(new FDialogueDeEditorApplicationMode(SharedThis(this))));
+
+	RegenerateMenusAndToolbars();
+
+	SetCurrentMode(EzAbilityEditorMode);
+
+	PostLayoutBlueprintEditorInitialization();
+}
+
+// void FDialogueDeductionGraphEditor::CreateInternalWidgets()
+// {
+// 	FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
+// 	FDetailsViewArgs DetailsViewArgs;
+// 	DetailsViewArgs.bUpdatesFromSelection = false;
+// 	DetailsViewArgs.bLockable = false;
+// 	DetailsViewArgs.bAllowSearch = true;
+// 	DetailsViewArgs.NameAreaSettings = FDetailsViewArgs::HideNameArea;
+// 	DetailsViewArgs.bHideSelectionTip = false;
+// 	DetailsViewArgs.NotifyHook = this;
+// 	DetailsViewArgs.DefaultsOnlyVisibility = EEditDefaultsOnlyNodeVisibility::Hide;
+// 	DetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs);
+// 	DetailsView->SetObject(NULL);
+// 	//DetailsView->OnFinishedChangingProperties().AddSP(this, &FDialogueGraphEditor::OnFinishedChangingProperties);
+// }
+// 
+// FText FDialogueDeductionGraphEditor::GetLocalizedMode(FName InMode)
+// {
+// 	static TMap< FName, FText > LocModes;
+// 
+// 	if (LocModes.Num() == 0)
+// 	{
+// 		LocModes.Add(DialogueEditorMode, LOCTEXT("DialogueEditorMode", "Dialogue Graph"));
+// 	}
+// 
+// 	check(InMode != NAME_None);
+// 	const FText* OutDesc = LocModes.Find(InMode);
+// 	check(OutDesc);
+// 	return *OutDesc;
+// }
+// 
+// void FDialogueDeductionGraphEditor::InitDialogueEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, UMBRData* InDialogue)
+// {
+// 	TestDataAsset = InDialogue;
+// 	
+// 	if (!Toolbar.IsValid())
+// 	{
+// 		Toolbar = MakeShareable(new FBlueprintEditorToolbar(SharedThis(this)));
+// 	}
+// 
+// 	GetToolkitCommands()->Append(FPlayWorldCommands::GlobalPlayWorldActions.ToSharedRef());
+// 
+// 	CreateDefaultCommands();
+// 	//BindCommands();
+// 	RegisterMenus();
+// 
+// 	CreateInternalWidgets();
+// 
+// 
+// 	TArray<UObject*> ObjectsToEdit;
+// 	ObjectsToEdit.Add((UObject*)TestDataAsset);
+// 
+// 	const bool bCreateDefaultStandaloneMenu = true;
+// 	const bool bCreateDefaultToolbar = true;
+// 
+// 	InitAssetEditor(Mode, InitToolkitHost, FDialogueDeductionModule::DialogueEditorAppId, FTabManager::FLayout::NullLayout, bCreateDefaultStandaloneMenu, bCreateDefaultToolbar, ObjectsToEdit);
+// 
+// 	TArray<UBlueprint*> EditedBlueprints;
+// 	EditedBlueprints.Add((UBlueprint*)TestDataAsset);
+// 
+// 	CommonInitialization(EditedBlueprints, false);		/* 构建Tab 没有的情况下 CreateDefaultTabContents 下个智能指针会崩溃*/
+// 
+// 	AddApplicationMode(DialogueEditorMode, MakeShareable(new FDialogueDeEditorApplicationMode(SharedThis(this))));
+// 
+// 	RegenerateMenusAndToolbars();
+// 
+// 	SetCurrentMode(DialogueEditorMode);
+// 
+// 	PostLayoutBlueprintEditorInitialization();
+// 
+// // 	FLevelEditorModule& LevelEditor = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
+// // 	LevelEditor.OnMapChanged().AddRaw(this, &FDialogueGraphEditor::OnWorldChange);
+// }
+// 
+// 
+// void FDialogueDeductionGraphEditor::RestoreDialogueGraph()
+// {
+// 	//此处为打开一个图表
+// 	UDialogueDeductionEdGraph* TestEdGraph =Cast<UDialogueDeductionEdGraph>( FBlueprintEditorUtils::CreateNewGraph((UObject*)TestDataAsset, TEXT("Dialogue Graph"), UDialogueDeductionEdGraph::StaticClass(), UEdGraphSchema::StaticClass()));
+// 
+// 	bool bNewGraph = true;
+// 
+// 	FBlueprintEditorUtils::AddUbergraphPage((UBlueprint*)TestDataAsset, TestEdGraph);
+// 
+// 
+// 	TSharedRef<FTabPayload_UObject> Payload = FTabPayload_UObject::Make(TestEdGraph);
+// 	TSharedPtr<SDockTab> DocumentTab = DocumentManager->OpenDocument(Payload, bNewGraph ? FDocumentTracker::OpenNewDocument : FDocumentTracker::RestorePreviousDocument);
+// 
+// 	if (TestDataAsset->LastEditedDocuments.Num() > 0)
+// 	{
+// 		TSharedRef<SGraphEditor> GraphEditor = StaticCastSharedRef<SGraphEditor>(DocumentTab->GetContent());
+// 		GraphEditor->SetViewLocation(TestDataAsset->LastEditedDocuments[0].SavedViewOffset, TestDataAsset->LastEditedDocuments[0].SavedZoomAmount);
+// 	}
+// }
+// 
+// 
+// TSharedRef<SDockTab> FDialogueDeductionGraphEditor::SpawnTab_Viewport(const FSpawnTabArgs& Args)
+// {
+// 	TSharedPtr<FDialogueDeductionGraphEditor> DialogueEditorPtr = SharedThis(this);
+// 
+// // 	return SNew(SDockTab)
+// // 		.Label(LOCTEXT("ViewportTab_Title", "Viewport"))
+// // 		[
+// // 			SAssignNew(DialogueViewportWidget, SDialogueViewportWidget, DialogueEditorPtr)
+// // 			.Dialogue(DialogueBeingEdited)
+// // 		];
+// 
+// // 	return SNew(SDockTab)
+// // 		[
+// // 			SNew(STextBlock)
+// // 			.Text(FText::FromString("Hello, New Tab Content !"))
+// // 		];
+// 
+// 	//TSharedPtr<FDialogueEditor> DialogueEditorPtr = SharedThis(this);
+// 	return SNew(SDockTab)
+// 		.Label(LOCTEXT("Viewport01Tab_Title", "Viewport01"))
+// 		[
+// 			//SAssignNew(DialogueEditorViewport, SDialogueEditorViewport)
+// 			//.TestMBR(TestDataAsset)
+// 			SAssignNew(DialogueEditorViewport, SDialogueEditorViewport)
+// 			.TestMBR(TestDataAsset)
+// 		];
+// }
+// 
+// void FDialogueDeductionGraphEditor::RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager)
+// {
+// 	DocumentManager->SetTabManager(InTabManager);
+// 
+// 	//FWorkflowCentricApplication::RegisterTabSpawners(InTabManager);
+// 
+// 	WorkspaceMenuCategory = InTabManager->AddLocalWorkspaceMenuCategory(LOCTEXT("WorkspaceMenu_AAAA", "Environment Query Editor"));
+// 	auto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();
+// 
+// 	InTabManager->RegisterTabSpawner(FDialogueEditorTabs::DialogueView, FOnSpawnTab::CreateSP(this, &FDialogueDeductionGraphEditor::SpawnTab_Viewport))
+// 		.SetDisplayName(LOCTEXT("ViewportTab", "Viewport"))
+// 		.SetGroup(WorkspaceMenuCategoryRef)
+// 		.SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Viewports"));
+// 
+// }
+// 
+// 
+// void FDialogueDeductionGraphEditor::RegisterToolbarTab(const TSharedRef<class FTabManager>& InTabManager)
+// {
+// 	//FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
+// 	RegisterTabSpawners(InTabManager);
+// }
+
+#undef LOCTEXT_NAMESPACE

+ 28 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Public/AssetDefinition_EZAbilityAsset.h

@@ -0,0 +1,28 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "AssetDefinitionDefault.h"
+#include "AssetDefinition_EZAbilityAsset.generated.h"
+
+/**
+ * 
+ */
+UCLASS()
+class EZABILITYEDITOR_API UAssetDefinition_EZAbilityAsset : public UAssetDefinitionDefault
+{
+	GENERATED_BODY()
+
+public:
+
+	FText GetAssetDisplayName() const override final;
+	TSoftClassPtr<UObject> GetAssetClass() const override final;
+	FLinearColor GetAssetColor() const override final;
+	FText GetAssetDescription(const FAssetData& AssetData) const override final;
+	TConstArrayView<FAssetCategoryPath> GetAssetCategories() const override final;
+	virtual EAssetCommandResult OpenAssets(const FAssetOpenArgs& OpenArgs) const override;
+
+	// 	virtual UThumbnailInfo* LoadThumbnailInfo(const FAssetData& InAssetData) const override;
+	
+};

+ 28 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Public/EZAbilityAssetFactory.h

@@ -0,0 +1,28 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Factories/Factory.h"
+#include "EZAbilityAssetFactory.generated.h"
+
+/**
+ * 
+ */
+UCLASS()
+class EZABILITYEDITOR_API UEZAbilityAssetFactory : public UFactory
+{
+	GENERATED_BODY()
+
+	UEZAbilityAssetFactory();
+
+	virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
+	virtual bool CanCreateNew() const override;
+	virtual FString GetDefaultNewAssetName() const override;
+	virtual FText GetDisplayName() const override;
+
+	virtual bool ShouldShowInNewMenu() const override;
+	//virtual uint32 GetMenuCategories() const override;
+	virtual FText GetToolTip() const override;
+	
+};

+ 17 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Public/EZAbilityBlueprint.h

@@ -0,0 +1,17 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Engine/Blueprint.h"
+#include "EZAbilityBlueprint.generated.h"
+
+/**
+ * 
+ */
+UCLASS()
+class EZABILITYEDITOR_API UEZAbilityBlueprint : public UBlueprint
+{
+	GENERATED_BODY()
+	
+};

+ 6 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Public/EzAbilityEditor.h

@@ -12,6 +12,12 @@ public:
 	/** IModuleInterface implementation */
 	virtual void StartupModule() override;
 	virtual void ShutdownModule() override;
+
+public:
+
+	static const FName AbilityEditorAppId;
+
+	virtual TSharedRef<class FEzAbilityEditor> CreateEzAbilityEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost, class UEZAbilityBlueprint* EzAbilityAsset);
 };
 
 EZABILITYEDITOR_API DECLARE_LOG_CATEGORY_EXTERN(LogEzAbilityEditor, Log, All);

+ 59 - 0
Ability/Plugins/EzAbility/Source/EzAbilityEditor/Public/EzAbilityGraphEditor.h

@@ -0,0 +1,59 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "BlueprintEditor.h"
+//#include "SDialogueEditorViewport.h"
+#include "Widgets/Input/SButton.h"
+/**
+ * 
+ */
+ class UEzAbility;
+ class UEZAbilityBlueprint;
+
+class  FEzAbilityEditor : public FBlueprintEditor
+{
+public:
+	FEzAbilityEditor();
+	~FEzAbilityEditor();
+
+	void InitEzAbilityEditor(const EToolkitMode::Type Mode, const TSharedPtr< class IToolkitHost >& InitToolkitHost,  UEZAbilityBlueprint* InEzAbilityAsset);
+
+private:
+
+	TObjectPtr<UEZAbilityBlueprint>		EzAbilityDataAsset;
+
+	static const FName					EzAbilityEditorMode;
+// 	/* ͼ±í */
+// 	void RestoreEzAbilityGraph();
+// 
+// 	//virtual void RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager) override;
+// private:
+// 	/**The Dialogue asset being edited*/
+// 	UMBRData* TestDataAsset;
+// 
+// 	/** Creates all internal widgets for the tabs to point at */
+// 	void CreateInternalWidgets();
+// 
+// 	/** Property View */
+// 	TSharedPtr<class IDetailsView> DetailsView;
+// 
+// 	TSharedPtr<SDialogueEditorViewport>		DialogueEditorViewport;
+// 
+// 	TSharedPtr<class SButton>	TestButton;
+// 
+// public:
+// 
+// 	static FText GetLocalizedMode(FName InMode);
+// 
+// 	static const FName DialogueEditorMode;
+// 
+// 	UMBRData* GetDialogueDeduction() const;
+// 
+// 	TSharedRef<SDockTab> SpawnTab_Viewport(const FSpawnTabArgs& Args);
+// 
+// 	virtual void RegisterTabSpawners(const TSharedRef<class FTabManager>& InTabManager) override;
+// 	void RegisterToolbarTab(const TSharedRef<class FTabManager>& InTabManager);
+	//virtual FName GetToolkitFName() const override { return "CustomNormalDistributionEditor"; }
+};