Răsfoiți Sursa

Added gem template for custom tool in C++.

Signed-off-by: Chris Galvan <[email protected]>
Chris Galvan 3 ani în urmă
părinte
comite
f83c8bcb5a
51 a modificat fișierele cu 1466 adăugiri și 0 ștergeri
  1. 22 0
      Templates/CustomTool/Template/CMakeLists.txt
  2. 15 0
      Templates/CustomTool/Template/Code/${NameLower}_editor_files.cmake
  3. 11 0
      Templates/CustomTool/Template/Code/${NameLower}_editor_shared_files.cmake
  4. 11 0
      Templates/CustomTool/Template/Code/${NameLower}_editor_tests_files.cmake
  5. 14 0
      Templates/CustomTool/Template/Code/${NameLower}_files.cmake
  6. 11 0
      Templates/CustomTool/Template/Code/${NameLower}_shared_files.cmake
  7. 11 0
      Templates/CustomTool/Template/Code/${NameLower}_tests_files.cmake
  8. 168 0
      Templates/CustomTool/Template/Code/CMakeLists.txt
  9. 40 0
      Templates/CustomTool/Template/Code/Include/${Name}/${Name}Bus.h
  10. 15 0
      Templates/CustomTool/Template/Code/Platform/Android/${NameLower}_android_files.cmake
  11. 15 0
      Templates/CustomTool/Template/Code/Platform/Android/${NameLower}_shared_android_files.cmake
  12. 11 0
      Templates/CustomTool/Template/Code/Platform/Android/PAL_android.cmake
  13. 15 0
      Templates/CustomTool/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake
  14. 15 0
      Templates/CustomTool/Template/Code/Platform/Linux/${NameLower}_shared_linux_files.cmake
  15. 11 0
      Templates/CustomTool/Template/Code/Platform/Linux/PAL_linux.cmake
  16. 15 0
      Templates/CustomTool/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake
  17. 15 0
      Templates/CustomTool/Template/Code/Platform/Mac/${NameLower}_shared_mac_files.cmake
  18. 11 0
      Templates/CustomTool/Template/Code/Platform/Mac/PAL_mac.cmake
  19. 15 0
      Templates/CustomTool/Template/Code/Platform/Windows/${NameLower}_shared_windows_files.cmake
  20. 15 0
      Templates/CustomTool/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake
  21. 11 0
      Templates/CustomTool/Template/Code/Platform/Windows/PAL_windows.cmake
  22. 15 0
      Templates/CustomTool/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake
  23. 15 0
      Templates/CustomTool/Template/Code/Platform/iOS/${NameLower}_shared_ios_files.cmake
  24. 11 0
      Templates/CustomTool/Template/Code/Platform/iOS/PAL_ios.cmake
  25. 5 0
      Templates/CustomTool/Template/Code/Source/${Name}.qrc
  26. 55 0
      Templates/CustomTool/Template/Code/Source/${Name}EditorModule.cpp
  27. 78 0
      Templates/CustomTool/Template/Code/Source/${Name}EditorSystemComponent.cpp
  28. 45 0
      Templates/CustomTool/Template/Code/Source/${Name}EditorSystemComponent.h
  29. 25 0
      Templates/CustomTool/Template/Code/Source/${Name}Module.cpp
  30. 45 0
      Templates/CustomTool/Template/Code/Source/${Name}ModuleInterface.h
  31. 92 0
      Templates/CustomTool/Template/Code/Source/${Name}SystemComponent.cpp
  32. 56 0
      Templates/CustomTool/Template/Code/Source/${Name}SystemComponent.h
  33. 44 0
      Templates/CustomTool/Template/Code/Source/${Name}Widget.cpp
  34. 28 0
      Templates/CustomTool/Template/Code/Source/${Name}Widget.h
  35. 1 0
      Templates/CustomTool/Template/Code/Source/toolbar_icon.svg
  36. 13 0
      Templates/CustomTool/Template/Code/Tests/${Name}EditorTest.cpp
  37. 13 0
      Templates/CustomTool/Template/Code/Tests/${Name}Test.cpp
  38. 8 0
      Templates/CustomTool/Template/Platform/Android/android_gem.cmake
  39. 3 0
      Templates/CustomTool/Template/Platform/Android/android_gem.json
  40. 8 0
      Templates/CustomTool/Template/Platform/Linux/linux_gem.cmake
  41. 3 0
      Templates/CustomTool/Template/Platform/Linux/linux_gem.json
  42. 8 0
      Templates/CustomTool/Template/Platform/Mac/mac_gem.cmake
  43. 3 0
      Templates/CustomTool/Template/Platform/Mac/mac_gem.json
  44. 8 0
      Templates/CustomTool/Template/Platform/Windows/windows_gem.cmake
  45. 3 0
      Templates/CustomTool/Template/Platform/Windows/windows_gem.json
  46. 8 0
      Templates/CustomTool/Template/Platform/iOS/ios_gem.cmake
  47. 3 0
      Templates/CustomTool/Template/Platform/iOS/ios_gem.json
  48. 17 0
      Templates/CustomTool/Template/gem.json
  49. 3 0
      Templates/CustomTool/Template/preview.png
  50. 382 0
      Templates/CustomTool/template.json
  51. 1 0
      engine.json

+ 22 - 0
Templates/CustomTool/Template/CMakeLists.txt

@@ -0,0 +1,22 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(o3de_gem_path ${CMAKE_CURRENT_LIST_DIR})
+set(o3de_gem_json ${o3de_gem_path}/gem.json)
+o3de_read_json_key(o3de_gem_name ${o3de_gem_json} "gem_name")
+o3de_restricted_path(${o3de_gem_json} o3de_gem_restricted_path)
+
+ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} "${o3de_gem_restricted_path}" ${o3de_gem_path} ${o3de_gem_name})
+
+# Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the
+# project cmake for this platform.
+include(${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_gem.cmake)
+
+ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty)
+
+add_subdirectory(Code)

+ 15 - 0
Templates/CustomTool/Template/Code/${NameLower}_editor_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Source/${Name}EditorSystemComponent.cpp
+    Source/${Name}EditorSystemComponent.h
+    Source/${Name}Widget.cpp
+    Source/${Name}Widget.h
+    Source/${Name}.qrc
+)

+ 11 - 0
Templates/CustomTool/Template/Code/${NameLower}_editor_shared_files.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Source/${Name}EditorModule.cpp
+)

+ 11 - 0
Templates/CustomTool/Template/Code/${NameLower}_editor_tests_files.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Tests/${Name}EditorTest.cpp
+)

+ 14 - 0
Templates/CustomTool/Template/Code/${NameLower}_files.cmake

@@ -0,0 +1,14 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Include/${Name}/${Name}Bus.h
+    Source/${Name}ModuleInterface.h
+    Source/${Name}SystemComponent.cpp
+    Source/${Name}SystemComponent.h
+)

+ 11 - 0
Templates/CustomTool/Template/Code/${NameLower}_shared_files.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Source/${Name}Module.cpp
+)

+ 11 - 0
Templates/CustomTool/Template/Code/${NameLower}_tests_files.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(FILES
+    Tests/${Name}Test.cpp
+)

+ 168 - 0
Templates/CustomTool/Template/Code/CMakeLists.txt

@@ -0,0 +1,168 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Currently we are in the Code folder: ${CMAKE_CURRENT_LIST_DIR}
+# Get the platform specific folder ${pal_dir} for the current folder: ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}
+# Note: ly_get_list_relative_pal_filename will take care of the details for us, as this may be a restricted platform
+#       in which case it will see if that platform is present here or in the restricted folder.
+#       i.e. It could here in our gem : Gems/${Name}/Code/Platform/<platorm_name>  or
+#            <restricted_folder>/<platform_name>/Gems/${Name}/Code
+ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${o3de_gem_restricted_path} ${o3de_gem_path} ${o3de_gem_name})
+
+# Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the
+# traits for this platform. Traits for a platform are defines for things like whether or not something in this gem
+# is supported by this platform.
+include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+# Add the ${Name}.Static target
+# Note: We include the common files and the platform specific files which are set in ${NameLower}_common_files.cmake
+# and in ${pal_dir}/${NameLower}_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+ly_add_target(
+    NAME ${Name}.Static STATIC
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${NameLower}_files.cmake
+        ${pal_dir}/${NameLower}_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+        PRIVATE
+            Source
+    BUILD_DEPENDENCIES
+        PUBLIC
+            AZ::AzCore
+            AZ::AzFramework
+)
+
+# Here add ${Name} target, it depends on the ${Name}.Static
+ly_add_target(
+    NAME ${Name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${NameLower}_shared_files.cmake
+        ${pal_dir}/${NameLower}_shared_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+        PRIVATE
+            Source
+    BUILD_DEPENDENCIES
+        PRIVATE
+            Gem::${Name}.Static
+)
+
+# By default, we will specify that the above target ${Name} would be used by
+# Client and Server type targets when this gem is enabled.  If you don't want it
+# active in Clients or Servers by default, delete one of both of the following lines:
+ly_create_alias(NAME ${Name}.Clients NAMESPACE Gem TARGETS Gem::${Name})
+ly_create_alias(NAME ${Name}.Servers NAMESPACE Gem TARGETS Gem::${Name})
+
+# If we are on a host platform, we want to add the host tools targets like the ${Name}.Editor target which
+# will also depend on ${Name}.Static
+if(PAL_TRAIT_BUILD_HOST_TOOLS)
+    ly_add_target(
+        NAME ${Name}.Editor.Static STATIC
+        NAMESPACE Gem
+        AUTOMOC
+        AUTORCC
+        FILES_CMAKE
+            ${NameLower}_editor_files.cmake
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Source
+            PUBLIC
+                Include
+        BUILD_DEPENDENCIES
+            PUBLIC
+                AZ::AzToolsFramework
+                Gem::${Name}.Static
+    )
+
+    ly_add_target(
+        NAME ${Name}.Editor GEM_MODULE
+        NAMESPACE Gem
+        AUTOMOC
+        FILES_CMAKE
+            ${NameLower}_editor_shared_files.cmake
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Source
+            PUBLIC
+                Include
+        BUILD_DEPENDENCIES
+            PUBLIC
+                Gem::${Name}.Editor.Static
+    )
+
+    # By default, we will specify that the above target ${Name} would be used by
+    # Tool and Builder type targets when this gem is enabled.  If you don't want it
+    # active in Tools or Builders by default, delete one of both of the following lines:
+    ly_create_alias(NAME ${Name}.Tools    NAMESPACE Gem TARGETS Gem::${Name}.Editor)
+    ly_create_alias(NAME ${Name}.Builders NAMESPACE Gem TARGETS Gem::${Name}.Editor)
+
+
+endif()
+
+################################################################################
+# Tests
+################################################################################
+# See if globally, tests are supported
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
+    # We globally support tests, see if we support tests on this platform for ${Name}.Static
+    if(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED)
+        # We support ${Name}.Tests on this platform, add ${Name}.Tests target which depends on ${Name}.Static
+        ly_add_target(
+            NAME ${Name}.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
+            NAMESPACE Gem
+            FILES_CMAKE
+                ${NameLower}_files.cmake
+                ${NameLower}_tests_files.cmake
+            INCLUDE_DIRECTORIES
+                PRIVATE
+                    Tests
+                    Source
+            BUILD_DEPENDENCIES
+                PRIVATE
+                    AZ::AzTest
+                    AZ::AzFramework
+                    Gem::${Name}.Static
+        )
+
+        # Add ${Name}.Tests to googletest
+        ly_add_googletest(
+            NAME Gem::${Name}.Tests
+        )
+    endif()
+
+    # If we are a host platform we want to add tools test like editor tests here
+    if(PAL_TRAIT_BUILD_HOST_TOOLS)
+        # We are a host platform, see if Editor tests are supported on this platform
+        if(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED)
+            # We support ${Name}.Editor.Tests on this platform, add ${Name}.Editor.Tests target which depends on ${Name}.Editor
+            ly_add_target(
+                NAME ${Name}.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
+                NAMESPACE Gem
+                FILES_CMAKE
+                    ${NameLower}_editor_tests_files.cmake
+                INCLUDE_DIRECTORIES
+                    PRIVATE
+                        Tests
+                        Source
+                BUILD_DEPENDENCIES
+                    PRIVATE
+                        AZ::AzTest
+                        Gem::${Name}.Editor
+            )
+
+            # Add ${Name}.Editor.Tests to googletest
+            ly_add_googletest(
+                NAME Gem::${Name}.Editor.Tests
+            )
+        endif()
+    endif()
+endif()

+ 40 - 0
Templates/CustomTool/Template/Code/Include/${Name}/${Name}Bus.h

@@ -0,0 +1,40 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#include <AzCore/EBus/EBus.h>
+#include <AzCore/Interface/Interface.h>
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}Requests
+    {
+    public:
+        AZ_RTTI(${SanitizedCppName}Requests, "{${Random_Uuid}}");
+        virtual ~${SanitizedCppName}Requests() = default;
+        // Put your public methods here
+    };
+    
+    class ${SanitizedCppName}BusTraits
+        : public AZ::EBusTraits
+    {
+    public:
+        //////////////////////////////////////////////////////////////////////////
+        // EBusTraits overrides
+        static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+        //////////////////////////////////////////////////////////////////////////
+    };
+
+    using ${SanitizedCppName}RequestBus = AZ::EBus<${SanitizedCppName}Requests, ${SanitizedCppName}BusTraits>;
+    using ${SanitizedCppName}Interface = AZ::Interface<${SanitizedCppName}Requests>;
+
+} // namespace ${SanitizedCppName}

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Android/${NameLower}_android_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Android
+# i.e. ../Source/Android/${Name}Android.cpp
+#      ../Source/Android/${Name}Android.h
+#      ../Include/Android/${Name}Android.h
+
+set(FILES
+)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Android/${NameLower}_shared_android_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Android
+# i.e. ../Source/Android/${Name}Android.cpp
+#      ../Source/Android/${Name}Android.h
+#      ../Include/Android/${Name}Android.h
+
+set(FILES
+)

+ 11 - 0
Templates/CustomTool/Template/Code/Platform/Android/PAL_android.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED TRUE)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Linux/${NameLower}_linux_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/${Name}Linux.cpp
+#      ../Source/Linux/${Name}Linux.h
+#      ../Include/Linux/${Name}Linux.h
+
+set(FILES
+)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Linux/${NameLower}_shared_linux_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/${Name}Linux.cpp
+#      ../Source/Linux/${Name}Linux.h
+#      ../Include/Linux/${Name}Linux.h
+
+set(FILES
+)

+ 11 - 0
Templates/CustomTool/Template/Code/Platform/Linux/PAL_linux.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED TRUE)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Mac/${NameLower}_mac_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/${Name}Mac.cpp
+#      ../Source/Mac/${Name}Mac.h
+#      ../Include/Mac/${Name}Mac.h
+
+set(FILES
+)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Mac/${NameLower}_shared_mac_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/${Name}Mac.cpp
+#      ../Source/Mac/${Name}Mac.h
+#      ../Include/Mac/${Name}Mac.h
+
+set(FILES
+)

+ 11 - 0
Templates/CustomTool/Template/Code/Platform/Mac/PAL_mac.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED TRUE)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Windows/${NameLower}_shared_windows_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/${Name}Windows.cpp
+#      ../Source/Windows/${Name}Windows.h
+#      ../Include/Windows/${Name}Windows.h
+
+set(FILES
+)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/Windows/${NameLower}_windows_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/${Name}Windows.cpp
+#      ../Source/Windows/${Name}Windows.h
+#      ../Include/Windows/${Name}Windows.h
+
+set(FILES
+)

+ 11 - 0
Templates/CustomTool/Template/Code/Platform/Windows/PAL_windows.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED TRUE)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/iOS/${NameLower}_ios_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for iOS
+# i.e. ../Source/iOS/${Name}iOS.cpp
+#      ../Source/iOS/${Name}iOS.h
+#      ../Include/iOS/${Name}iOS.h
+
+set(FILES
+)

+ 15 - 0
Templates/CustomTool/Template/Code/Platform/iOS/${NameLower}_shared_ios_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+# Platform specific files for iOS
+# i.e. ../Source/iOS/${Name}iOS.cpp
+#      ../Source/iOS/${Name}iOS.h
+#      ../Include/iOS/${Name}iOS.h
+
+set(FILES
+)

+ 11 - 0
Templates/CustomTool/Template/Code/Platform/iOS/PAL_ios.cmake

@@ -0,0 +1,11 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED TRUE)

+ 5 - 0
Templates/CustomTool/Template/Code/Source/${Name}.qrc

@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+    <qresource prefix="/${Name}">
+        <file alias="toolbar_icon.svg">toolbar_icon.svg</file>
+    </qresource>
+</RCC>

+ 55 - 0
Templates/CustomTool/Template/Code/Source/${Name}EditorModule.cpp

@@ -0,0 +1,55 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <${Name}ModuleInterface.h>
+#include <${Name}EditorSystemComponent.h>
+
+void Init${SanitizedCppName}Resources()
+{
+    // We must register our Qt resources (.qrc file) since this is being loaded from a separate module (gem)
+    Q_INIT_RESOURCE(${SanitizedCppName});
+}
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}EditorModule
+        : public ${SanitizedCppName}ModuleInterface
+    {
+    public:
+        AZ_RTTI(${SanitizedCppName}EditorModule, "${ModuleClassId}", ${SanitizedCppName}ModuleInterface);
+        AZ_CLASS_ALLOCATOR(${SanitizedCppName}EditorModule, AZ::SystemAllocator, 0);
+
+        ${SanitizedCppName}EditorModule()
+        {
+            Init${SanitizedCppName}Resources();
+
+            // Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
+            // Add ALL components descriptors associated with this gem to m_descriptors.
+            // This will associate the AzTypeInfo information for the components with the the SerializeContext, BehaviorContext and EditContext.
+            // This happens through the [MyComponent]::Reflect() function.
+            m_descriptors.insert(m_descriptors.end(), {
+                ${SanitizedCppName}EditorSystemComponent::CreateDescriptor(),
+            });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         * Non-SystemComponents should not be added here
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList {
+                azrtti_typeid<${SanitizedCppName}EditorSystemComponent>(),
+            };
+        }
+    };
+}// namespace ${SanitizedCppName}
+
+AZ_DECLARE_MODULE_CLASS(Gem_${SanitizedCppName}, ${SanitizedCppName}::${SanitizedCppName}EditorModule)

+ 78 - 0
Templates/CustomTool/Template/Code/Source/${Name}EditorSystemComponent.cpp

@@ -0,0 +1,78 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <AzCore/Serialization/SerializeContext.h>
+
+#include <AzToolsFramework/API/ViewPaneOptions.h>
+
+#include <${Name}Widget.h>
+#include <${Name}EditorSystemComponent.h>
+
+namespace ${SanitizedCppName}
+{
+    void ${SanitizedCppName}EditorSystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${SanitizedCppName}EditorSystemComponent, ${SanitizedCppName}SystemComponent>()
+                ->Version(0);
+        }
+    }
+
+    ${SanitizedCppName}EditorSystemComponent::${SanitizedCppName}EditorSystemComponent() = default;
+
+    ${SanitizedCppName}EditorSystemComponent::~${SanitizedCppName}EditorSystemComponent() = default;
+
+    void ${SanitizedCppName}EditorSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        BaseSystemComponent::GetProvidedServices(provided);
+        provided.push_back(AZ_CRC_CE("${SanitizedCppName}EditorService"));
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        BaseSystemComponent::GetIncompatibleServices(incompatible);
+        incompatible.push_back(AZ_CRC_CE("${SanitizedCppName}EditorService"));
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+        BaseSystemComponent::GetRequiredServices(required);
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+        BaseSystemComponent::GetDependentServices(dependent);
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::Activate()
+    {
+        ${SanitizedCppName}SystemComponent::Activate();
+        AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::Deactivate()
+    {
+        AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect();
+        ${SanitizedCppName}SystemComponent::Deactivate();
+    }
+
+    void ${SanitizedCppName}EditorSystemComponent::NotifyRegisterViews()
+    {
+        AzToolsFramework::ViewPaneOptions options;
+        options.paneRect = QRect(100, 100, 500, 400);
+        options.showOnToolsToolbar = true;
+        options.toolbarIcon = ":/${Name}/toolbar_icon.svg";
+
+        // Register our custom widget as a dockable tool with the Editor
+        AzToolsFramework::RegisterViewPane<${SanitizedCppName}Widget>("${Name}", "Tools", options);
+    }
+
+} // namespace ${SanitizedCppName}

+ 45 - 0
Templates/CustomTool/Template/Code/Source/${Name}EditorSystemComponent.h

@@ -0,0 +1,45 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#include <${Name}SystemComponent.h>
+
+#include <AzToolsFramework/Entity/EditorEntityContextBus.h>
+
+namespace ${SanitizedCppName}
+{
+    /// System component for ${SanitizedCppName} editor
+    class ${SanitizedCppName}EditorSystemComponent
+        : public ${SanitizedCppName}SystemComponent
+        , private AzToolsFramework::EditorEvents::Bus::Handler
+    {
+        using BaseSystemComponent = ${SanitizedCppName}SystemComponent;
+    public:
+        AZ_COMPONENT(${SanitizedCppName}EditorSystemComponent, "${EditorSysCompClassId}", BaseSystemComponent);
+        static void Reflect(AZ::ReflectContext* context);
+
+        ${SanitizedCppName}EditorSystemComponent();
+        ~${SanitizedCppName}EditorSystemComponent();
+
+    private:
+        static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
+        static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
+        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
+        static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
+
+        // AZ::Component
+        void Activate() override;
+        void Deactivate() override;
+
+        // AzToolsFramework::EditorEventsBus overrides ...
+        void NotifyRegisterViews() override;
+    };
+} // namespace ${SanitizedCppName}

+ 25 - 0
Templates/CustomTool/Template/Code/Source/${Name}Module.cpp

@@ -0,0 +1,25 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <${Name}ModuleInterface.h>
+#include <${Name}SystemComponent.h>
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}Module
+        : public ${SanitizedCppName}ModuleInterface
+    {
+    public:
+        AZ_RTTI(${SanitizedCppName}Module, "${ModuleClassId}", ${SanitizedCppName}ModuleInterface);
+        AZ_CLASS_ALLOCATOR(${SanitizedCppName}Module, AZ::SystemAllocator, 0);
+    };
+}// namespace ${SanitizedCppName}
+
+AZ_DECLARE_MODULE_CLASS(Gem_${SanitizedCppName}, ${SanitizedCppName}::${SanitizedCppName}Module)

+ 45 - 0
Templates/CustomTool/Template/Code/Source/${Name}ModuleInterface.h

@@ -0,0 +1,45 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <AzCore/Memory/SystemAllocator.h>
+#include <AzCore/Module/Module.h>
+#include <${Name}SystemComponent.h>
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}ModuleInterface
+        : public AZ::Module
+    {
+    public:
+        AZ_RTTI(${SanitizedCppName}ModuleInterface, "{${Random_Uuid}}", AZ::Module);
+        AZ_CLASS_ALLOCATOR(${SanitizedCppName}ModuleInterface, AZ::SystemAllocator, 0);
+
+        ${SanitizedCppName}ModuleInterface()
+        {
+            // Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
+            // Add ALL components descriptors associated with this gem to m_descriptors.
+            // This will associate the AzTypeInfo information for the components with the the SerializeContext, BehaviorContext and EditContext.
+            // This happens through the [MyComponent]::Reflect() function.
+            m_descriptors.insert(m_descriptors.end(), {
+                ${SanitizedCppName}SystemComponent::CreateDescriptor(),
+                });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList{
+                azrtti_typeid<${SanitizedCppName}SystemComponent>(),
+            };
+        }
+    };
+}// namespace ${SanitizedCppName}

+ 92 - 0
Templates/CustomTool/Template/Code/Source/${Name}SystemComponent.cpp

@@ -0,0 +1,92 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <${Name}SystemComponent.h>
+
+#include <AzCore/Serialization/SerializeContext.h>
+#include <AzCore/Serialization/EditContext.h>
+#include <AzCore/Serialization/EditContextConstants.inl>
+
+namespace ${SanitizedCppName}
+{
+    void ${SanitizedCppName}SystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serialize->Class<${SanitizedCppName}SystemComponent, AZ::Component>()
+                ->Version(0)
+                ;
+
+            if (AZ::EditContext* ec = serialize->GetEditContext())
+            {
+                ec->Class<${SanitizedCppName}SystemComponent>("${SanitizedCppName}", "[Description of functionality provided by this System Component]")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                        ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System"))
+                        ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                    ;
+            }
+        }
+    }
+
+    void ${SanitizedCppName}SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC_CE("${SanitizedCppName}Service"));
+    }
+
+    void ${SanitizedCppName}SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC_CE("${SanitizedCppName}Service"));
+    }
+
+    void ${SanitizedCppName}SystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+    }
+
+    void ${SanitizedCppName}SystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+    }
+
+    ${SanitizedCppName}SystemComponent::${SanitizedCppName}SystemComponent()
+    {
+        if (${SanitizedCppName}Interface::Get() == nullptr)
+        {
+            ${SanitizedCppName}Interface::Register(this);
+        }
+    }
+
+    ${SanitizedCppName}SystemComponent::~${SanitizedCppName}SystemComponent()
+    {
+        if (${SanitizedCppName}Interface::Get() == this)
+        {
+            ${SanitizedCppName}Interface::Unregister(this);
+        }
+    }
+
+    void ${SanitizedCppName}SystemComponent::Init()
+    {
+    }
+
+    void ${SanitizedCppName}SystemComponent::Activate()
+    {
+        ${SanitizedCppName}RequestBus::Handler::BusConnect();
+        AZ::TickBus::Handler::BusConnect();
+    }
+
+    void ${SanitizedCppName}SystemComponent::Deactivate()
+    {
+        AZ::TickBus::Handler::BusDisconnect();
+        ${SanitizedCppName}RequestBus::Handler::BusDisconnect();
+    }
+
+    void ${SanitizedCppName}SystemComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
+    {
+    }
+
+} // namespace ${SanitizedCppName}

+ 56 - 0
Templates/CustomTool/Template/Code/Source/${Name}SystemComponent.h

@@ -0,0 +1,56 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#include <AzCore/Component/Component.h>
+#include <AzCore/Component/TickBus.h>
+#include <${Name}/${Name}Bus.h>
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}SystemComponent
+        : public AZ::Component
+        , protected ${SanitizedCppName}RequestBus::Handler
+        , public AZ::TickBus::Handler
+    {
+    public:
+        AZ_COMPONENT(${SanitizedCppName}SystemComponent, "${SysCompClassId}");
+
+        static void Reflect(AZ::ReflectContext* context);
+
+        static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
+        static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
+        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
+        static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
+
+        ${SanitizedCppName}SystemComponent();
+        ~${SanitizedCppName}SystemComponent();
+
+    protected:
+        ////////////////////////////////////////////////////////////////////////
+        // ${SanitizedCppName}RequestBus interface implementation
+
+        ////////////////////////////////////////////////////////////////////////
+
+        ////////////////////////////////////////////////////////////////////////
+        // AZ::Component interface implementation
+        void Init() override;
+        void Activate() override;
+        void Deactivate() override;
+        ////////////////////////////////////////////////////////////////////////
+
+        ////////////////////////////////////////////////////////////////////////
+        // AZTickBus interface implementation
+        void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
+        ////////////////////////////////////////////////////////////////////////
+    };
+
+} // namespace ${SanitizedCppName}

+ 44 - 0
Templates/CustomTool/Template/Code/Source/${Name}Widget.cpp

@@ -0,0 +1,44 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <AzCore/Utils/Utils.h>
+
+#include <QLabel>
+#include <QVBoxLayout>
+
+#include <${Name}Widget.h>
+
+namespace ${SanitizedCppName}
+{
+    ${SanitizedCppName}Widget::${SanitizedCppName}Widget(QWidget* parent)
+        : QWidget(parent)
+    {
+        setWindowTitle(QObject::tr("${Name}"));
+
+        QVBoxLayout* mainLayout = new QVBoxLayout(this);
+
+        QLabel* introLabel = new QLabel(QObject::tr("Put your cool stuff here!"), this);
+        mainLayout->addWidget(introLabel, 0, Qt::AlignCenter);
+
+        QString helpText = QString(
+            "For help getting started, visit the <a href=\"https://o3de.org/docs/tools-ui/ui-dev-intro/\">UI Development</a> documentation<br/>or come ask a question in the <a href=\"https://discord.gg/R77Wss3kHe\">sig-ui-ux channel</a> on Discord");
+
+        QLabel* helpLabel = new QLabel(this);
+        helpLabel->setTextFormat(Qt::RichText);
+        helpLabel->setText(helpText);
+        helpLabel->setOpenExternalLinks(true);
+
+        mainLayout->addWidget(helpLabel, 0, Qt::AlignCenter);
+
+        setLayout(mainLayout);
+    }
+}
+
+#include <moc_${Name}Widget.cpp>

+ 28 - 0
Templates/CustomTool/Template/Code/Source/${Name}Widget.h

@@ -0,0 +1,28 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#if !defined(Q_MOC_RUN)
+#include <AzToolsFramework/API/ToolsApplicationAPI.h>
+
+#include <QWidget>
+#endif
+
+namespace ${SanitizedCppName}
+{
+    class ${SanitizedCppName}Widget
+        : public QWidget
+    {
+        Q_OBJECT
+    public:
+        explicit ${SanitizedCppName}Widget(QWidget* parent = nullptr);
+    };
+} 

+ 1 - 0
Templates/CustomTool/Template/Code/Source/toolbar_icon.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><g><rect fill="none" height="24" width="24"/><path d="M19,3H5C3.89,3,3,3.9,3,5v14c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V5C21,3.9,20.11,3,19,3z M19,19H5V7h14V19z M13.5,13 c0,0.83-0.67,1.5-1.5,1.5s-1.5-0.67-1.5-1.5c0-0.83,0.67-1.5,1.5-1.5S13.5,12.17,13.5,13z M12,9c-2.73,0-5.06,1.66-6,4 c0.94,2.34,3.27,4,6,4s5.06-1.66,6-4C17.06,10.66,14.73,9,12,9z M12,15.5c-1.38,0-2.5-1.12-2.5-2.5c0-1.38,1.12-2.5,2.5-2.5 c1.38,0,2.5,1.12,2.5,2.5C14.5,14.38,13.38,15.5,12,15.5z"/></g></svg>

+ 13 - 0
Templates/CustomTool/Template/Code/Tests/${Name}EditorTest.cpp

@@ -0,0 +1,13 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 13 - 0
Templates/CustomTool/Template/Code/Tests/${Name}Test.cpp

@@ -0,0 +1,13 @@
+// {BEGIN_LICENSE}
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+// {END_LICENSE}
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 8 - 0
Templates/CustomTool/Template/Platform/Android/android_gem.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/CustomTool/Template/Platform/Android/android_gem.json

@@ -0,0 +1,3 @@
+{
+    "Tags": ["Android"],
+}

+ 8 - 0
Templates/CustomTool/Template/Platform/Linux/linux_gem.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/CustomTool/Template/Platform/Linux/linux_gem.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Linux"]
+}

+ 8 - 0
Templates/CustomTool/Template/Platform/Mac/mac_gem.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/CustomTool/Template/Platform/Mac/mac_gem.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Mac"]
+}

+ 8 - 0
Templates/CustomTool/Template/Platform/Windows/windows_gem.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/CustomTool/Template/Platform/Windows/windows_gem.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Windows"]
+}

+ 8 - 0
Templates/CustomTool/Template/Platform/iOS/ios_gem.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/CustomTool/Template/Platform/iOS/ios_gem.json

@@ -0,0 +1,3 @@
+{
+    "Tags": ["iOS"]
+}

+ 17 - 0
Templates/CustomTool/Template/gem.json

@@ -0,0 +1,17 @@
+{
+    "gem_name": "${Name}",
+    "display_name": "${Name}",
+    "license": "What license ${Name} uses goes here: i.e. https://opensource.org/licenses/MIT",
+    "origin": "The primary repo for ${Name} goes here: i.e. http://www.mydomain.com",
+    "type": "Code",
+    "summary": "A short description of ${Name}.",
+    "canonical_tags": [
+        "Gem"
+    ],
+    "user_tags": [
+        "${Name}"
+    ],
+    "icon_path": "preview.png",
+    "requirements": "",
+    "restricted_name": "gems"
+}

+ 3 - 0
Templates/CustomTool/Template/preview.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ac9dd09bde78f389e3725ac49d61eff109857e004840bc0bc3881739df9618d
+size 2217

+ 382 - 0
Templates/CustomTool/template.json

@@ -0,0 +1,382 @@
+{
+    "template_name": "CustomTool",
+    "origin": "The primary repo for CustomTool goes here: i.e. http://www.mydomain.com",
+    "license": "What license CustomTool uses goes here: i.e. https://opensource.org/licenses/MIT",
+    "display_name": "CustomTool",
+    "summary": "A gem template for a custom tool in C++ that gets registered with the Editor.",
+    "canonical_tags": [],
+    "user_tags": [
+        "CustomTool"
+    ],
+    "icon_path": "preview.png",
+    "copyFiles": [
+        {
+            "file": "CMakeLists.txt",
+            "origin": "CMakeLists.txt",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_editor_files.cmake",
+            "origin": "Code/${NameLower}_editor_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_editor_shared_files.cmake",
+            "origin": "Code/${NameLower}_editor_shared_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_editor_tests_files.cmake",
+            "origin": "Code/${NameLower}_editor_tests_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_files.cmake",
+            "origin": "Code/${NameLower}_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_shared_files.cmake",
+            "origin": "Code/${NameLower}_shared_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/${NameLower}_tests_files.cmake",
+            "origin": "Code/${NameLower}_tests_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/CMakeLists.txt",
+            "origin": "Code/CMakeLists.txt",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Include/${Name}/${Name}Bus.h",
+            "origin": "Code/Include/${Name}/${Name}Bus.h",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Android/${NameLower}_android_files.cmake",
+            "origin": "Code/Platform/Android/${NameLower}_android_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Android/${NameLower}_shared_android_files.cmake",
+            "origin": "Code/Platform/Android/${NameLower}_shared_android_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Android/PAL_android.cmake",
+            "origin": "Code/Platform/Android/PAL_android.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_linux_files.cmake",
+            "origin": "Code/Platform/Linux/${NameLower}_linux_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_shared_linux_files.cmake",
+            "origin": "Code/Platform/Linux/${NameLower}_shared_linux_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Linux/PAL_linux.cmake",
+            "origin": "Code/Platform/Linux/PAL_linux.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_mac_files.cmake",
+            "origin": "Code/Platform/Mac/${NameLower}_mac_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_shared_mac_files.cmake",
+            "origin": "Code/Platform/Mac/${NameLower}_shared_mac_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Mac/PAL_mac.cmake",
+            "origin": "Code/Platform/Mac/PAL_mac.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_shared_windows_files.cmake",
+            "origin": "Code/Platform/Windows/${NameLower}_shared_windows_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_windows_files.cmake",
+            "origin": "Code/Platform/Windows/${NameLower}_windows_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/Windows/PAL_windows.cmake",
+            "origin": "Code/Platform/Windows/PAL_windows.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/iOS/${NameLower}_ios_files.cmake",
+            "origin": "Code/Platform/iOS/${NameLower}_ios_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/iOS/${NameLower}_shared_ios_files.cmake",
+            "origin": "Code/Platform/iOS/${NameLower}_shared_ios_files.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Platform/iOS/PAL_ios.cmake",
+            "origin": "Code/Platform/iOS/PAL_ios.cmake",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}.qrc",
+            "origin": "Code/Source/${Name}.qrc",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}EditorModule.cpp",
+            "origin": "Code/Source/${Name}EditorModule.cpp",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}EditorSystemComponent.cpp",
+            "origin": "Code/Source/${Name}EditorSystemComponent.cpp",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}EditorSystemComponent.h",
+            "origin": "Code/Source/${Name}EditorSystemComponent.h",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}Module.cpp",
+            "origin": "Code/Source/${Name}Module.cpp",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}ModuleInterface.h",
+            "origin": "Code/Source/${Name}ModuleInterface.h",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}SystemComponent.cpp",
+            "origin": "Code/Source/${Name}SystemComponent.cpp",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}SystemComponent.h",
+            "origin": "Code/Source/${Name}SystemComponent.h",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}Widget.cpp",
+            "origin": "Code/Source/${Name}Widget.cpp",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/${Name}Widget.h",
+            "origin": "Code/Source/${Name}Widget.h",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Source/toolbar_icon.svg",
+            "origin": "Code/Source/toolbar_icon.svg",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Tests/${Name}EditorTest.cpp",
+            "origin": "Code/Tests/${Name}EditorTest.cpp",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Code/Tests/${Name}Test.cpp",
+            "origin": "Code/Tests/${Name}Test.cpp",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Android/android_gem.cmake",
+            "origin": "Platform/Android/android_gem.cmake",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Android/android_gem.json",
+            "origin": "Platform/Android/android_gem.json",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Linux/linux_gem.cmake",
+            "origin": "Platform/Linux/linux_gem.cmake",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Linux/linux_gem.json",
+            "origin": "Platform/Linux/linux_gem.json",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Mac/mac_gem.cmake",
+            "origin": "Platform/Mac/mac_gem.cmake",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Mac/mac_gem.json",
+            "origin": "Platform/Mac/mac_gem.json",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Windows/windows_gem.cmake",
+            "origin": "Platform/Windows/windows_gem.cmake",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/Windows/windows_gem.json",
+            "origin": "Platform/Windows/windows_gem.json",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/iOS/ios_gem.cmake",
+            "origin": "Platform/iOS/ios_gem.cmake",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "Platform/iOS/ios_gem.json",
+            "origin": "Platform/iOS/ios_gem.json",
+            "isTemplated": false,
+            "isOptional": false
+        },
+        {
+            "file": "gem.json",
+            "origin": "gem.json",
+            "isTemplated": true,
+            "isOptional": false
+        },
+        {
+            "file": "preview.png",
+            "origin": "preview.png",
+            "isTemplated": false,
+            "isOptional": false
+        }
+    ],
+    "createDirectories": [
+        {
+            "dir": "Assets",
+            "origin": "Assets"
+        },
+        {
+            "dir": "Code",
+            "origin": "Code"
+        },
+        {
+            "dir": "Code/Include",
+            "origin": "Code/Include"
+        },
+        {
+            "dir": "Code/Include/${Name}",
+            "origin": "Code/Include/${Name}"
+        },
+        {
+            "dir": "Code/Platform",
+            "origin": "Code/Platform"
+        },
+        {
+            "dir": "Code/Platform/Android",
+            "origin": "Code/Platform/Android"
+        },
+        {
+            "dir": "Code/Platform/Linux",
+            "origin": "Code/Platform/Linux"
+        },
+        {
+            "dir": "Code/Platform/Mac",
+            "origin": "Code/Platform/Mac"
+        },
+        {
+            "dir": "Code/Platform/Windows",
+            "origin": "Code/Platform/Windows"
+        },
+        {
+            "dir": "Code/Platform/iOS",
+            "origin": "Code/Platform/iOS"
+        },
+        {
+            "dir": "Code/Source",
+            "origin": "Code/Source"
+        },
+        {
+            "dir": "Code/Tests",
+            "origin": "Code/Tests"
+        },
+        {
+            "dir": "Platform",
+            "origin": "Platform"
+        },
+        {
+            "dir": "Platform/Android",
+            "origin": "Platform/Android"
+        },
+        {
+            "dir": "Platform/Linux",
+            "origin": "Platform/Linux"
+        },
+        {
+            "dir": "Platform/Mac",
+            "origin": "Platform/Mac"
+        },
+        {
+            "dir": "Platform/Windows",
+            "origin": "Platform/Windows"
+        },
+        {
+            "dir": "Platform/iOS",
+            "origin": "Platform/iOS"
+        }
+    ]
+}

+ 1 - 0
engine.json

@@ -92,6 +92,7 @@
     "templates": [
     "templates": [
         "Templates/AssetGem",
         "Templates/AssetGem",
         "Templates/DefaultGem",
         "Templates/DefaultGem",
+        "Templates/CustomTool",
         "Templates/DefaultProject",
         "Templates/DefaultProject",
         "Templates/MinimalProject"
         "Templates/MinimalProject"
     ]
     ]