From 6a22d27992559bd3162fc4e032e1f3db743d57c6 Mon Sep 17 00:00:00 2001 From: Mamadou Babaei Date: Thu, 23 Mar 2023 23:53:28 +0100 Subject: [PATCH] first attemp at extending the skeleton editor that also crashes the editor once opened --- .../Private/SGEditor/SGSkeletonEditor.cpp | 89 +++++++++++++++++++ .../SGEditor/SGSkeletonEditorCommands.cpp | 78 ++++++++++++++++ .../Private/SenseGloveEditorModule.cpp | 6 +- .../Private/SenseGloveEditorModule.h | 5 ++ .../Public/SGEditor/SGSkeletonEditor.h | 55 ++++++++++++ .../SGEditor/SGSkeletonEditorCommands.h | 54 +++++++++++ .../SenseGloveEditor.Build.cs | 9 +- 7 files changed, 292 insertions(+), 4 deletions(-) create mode 100644 Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp create mode 100644 Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditorCommands.cpp create mode 100644 Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h create mode 100644 Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h diff --git a/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp new file mode 100644 index 00000000..6228ae64 --- /dev/null +++ b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditor.cpp @@ -0,0 +1,89 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#include "SGEditor/SGSkeletonEditor.h" + +#include "ISkeletonEditor.h" +#include "ISkeletonEditorModule.h" +#include "Modules/ModuleManager.h" + +#include "SGEditor/SGSkeletonEditorCommands.h" + +#define LOCTEXT_NAMESPACE "SkeletonEditor" + +FSGSkeletonEditor::FSGSkeletonEditor() +{ +} + +void FSGSkeletonEditor::ExtendToolbar() +{ + if (EditorCommands.IsValid()) + { + EditorCommands.Reset(); + } + EditorCommands = MakeShared(); + EditorCommands->RegisterCommands(); + + if (ToolbarExtender.IsValid()) + { + ToolbarExtender.Reset(); + } + ToolbarExtender = MakeShared(); + + ISkeletonEditorModule& SkeletonEditorModule{ + FModuleManager::LoadModuleChecked("SkeletonEditor") + }; + TSharedPtr ExtensibilityManager{SkeletonEditorModule.GetToolBarExtensibilityManager()}; + + ToolbarExtender->AddToolBarExtension( + "SenseGlove", + EExtensionHook::After, + EditorCommands->CommandList, + FToolBarExtensionDelegate::CreateLambda([&](FToolBarBuilder& ToolbarBuilder)-> void + { + ToolbarBuilder.BeginSection("SenseGlove"); + { + ToolbarBuilder.AddToolBarButton(EditorCommands->UpdateSkeletonReferencePose, + NAME_None, + LOCTEXT("UpdateSkeletonReferencePose", + "Update Skeleton Reference Pose")); + } + ToolbarBuilder.EndSection(); + } + )); + ExtensibilityManager->AddExtender(ToolbarExtender); +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditorCommands.cpp b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditorCommands.cpp new file mode 100644 index 00000000..6c1feb99 --- /dev/null +++ b/Source/SenseGloveEditor/Private/SGEditor/SGSkeletonEditorCommands.cpp @@ -0,0 +1,78 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#include "SGEditor/SGSkeletonEditorCommands.h" + +#define LOCTEXT_NAMESPACE "SkeletonEditorCommands" + +FSGSkeletonEditorCommands::FSGSkeletonEditorCommands() + : TCommands( + TEXT("SkeletonEditor"), + NSLOCTEXT("Contexts", "SkeletonEditor", "Skeleton Editor"), + NAME_None, + FEditorStyle::GetStyleSetName()) +{ +} + +void FSGSkeletonEditorCommands::RegisterCommands() +{ + if (UpdateSkeletonReferencePose.IsValid()) + { + UpdateSkeletonReferencePose.Reset(); + } + UI_COMMAND(UpdateSkeletonReferencePose, + "Update Skeleton Reference Pose", + "Update the Skeleton's reference pose based on the current preview mesh", + EUserInterfaceActionType::Button, + FInputChord()); + + if (CommandList.IsValid()) + { + CommandList.Reset(); + } + CommandList = MakeShared(); + CommandList->MapAction(UpdateSkeletonReferencePose, + FExecuteAction::CreateLambda([&]()-> void + { + } + ), + FCanExecuteAction::CreateLambda([&]()-> bool + { + return false; + } + )); +} + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp index 1629c535..8c92b129 100644 --- a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp +++ b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.cpp @@ -34,6 +34,7 @@ #include "SenseGloveEditorModule.h" + #include "SGLog/SGLog.h" #define LOCTEXT_NAMESPACE "FSenseGloveEditorModule" @@ -41,6 +42,9 @@ void FSenseGloveEditorModule::StartupModule() { SGLOG("Starting up SenseGloveEditor module..."); + + SkeletonEditor = MakeShared(); + SkeletonEditor->ExtendToolbar(); } void FSenseGloveEditorModule::PreUnloadCallback() @@ -58,4 +62,4 @@ void FSenseGloveEditorModule::ShutdownModule() SGLOG("Shutting down SenseGloveEditor module..."); } -#undef LOCTEXT_NAMESPACE +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.h b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.h index 3f222571..695dc5ff 100644 --- a/Source/SenseGloveEditor/Private/SenseGloveEditorModule.h +++ b/Source/SenseGloveEditor/Private/SenseGloveEditorModule.h @@ -37,10 +37,15 @@ #include "Modules/ModuleInterface.h" +#include "SGEditor/SGSkeletonEditor.h" + #define LOCTEXT_NAMESPACE "SenseGloveEditor" class FSenseGloveEditorModule : public IModuleInterface { +private: + TSharedPtr SkeletonEditor; + public: virtual void StartupModule() override; virtual void PreUnloadCallback() override; diff --git a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h new file mode 100644 index 00000000..0d408080 --- /dev/null +++ b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditor.h @@ -0,0 +1,55 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#pragma once + +#include "EditorStyleSet.h" +#include "Framework/MultiBox/MultiBoxExtender.h" +#include "Templates/SharedPointer.h" + +class FSGSkeletonEditorCommands; + +class FSGSkeletonEditor +{ +private: + TSharedPtr ToolbarExtender; + TSharedPtr EditorCommands; + +public: + FSGSkeletonEditor(); + +public: + void ExtendToolbar(); +}; \ No newline at end of file diff --git a/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h new file mode 100644 index 00000000..86180eb4 --- /dev/null +++ b/Source/SenseGloveEditor/Public/SGEditor/SGSkeletonEditorCommands.h @@ -0,0 +1,54 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2023 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#pragma once + +#include "EditorStyleSet.h" +#include "Framework/Commands/Commands.h" +#include "Framework/Commands/UICommandList.h" +#include "Templates/SharedPointer.h" + +class FSGSkeletonEditorCommands final : public TCommands +{ +public: + TSharedPtr CommandList; + TSharedPtr UpdateSkeletonReferencePose; + +public: + FSGSkeletonEditorCommands(); + +public: + virtual void RegisterCommands() override; +}; \ No newline at end of file diff --git a/Source/SenseGloveEditor/SenseGloveEditor.Build.cs b/Source/SenseGloveEditor/SenseGloveEditor.Build.cs index 68dd8c08..4ee5bfc5 100644 --- a/Source/SenseGloveEditor/SenseGloveEditor.Build.cs +++ b/Source/SenseGloveEditor/SenseGloveEditor.Build.cs @@ -51,15 +51,18 @@ public class SenseGloveEditor : ModuleRules } ); -#if WITH_EDITOR PublicDependencyModuleNames.AddRange( new string[] { "AssetTools", + "EditorStyle", + "InputCore", + "SkeletonEditor", + "Slate", + "SlateCore", "UnrealEd", } ); -#endif PrivateDependencyModuleNames.AddRange( new string[] @@ -68,4 +71,4 @@ public class SenseGloveEditor : ModuleRules } ); } -} +} \ No newline at end of file