Kaynağa Gözat

Created a template that produces a Gem with Atom support (#15510)

* Added template to generate a gem with basic Atom support

Signed-off-by: Luis Sempé <[email protected]>
Luis Sempé 2 yıl önce
ebeveyn
işleme
be6dddc104
61 değiştirilmiş dosya ile 1993 ekleme ve 0 silme
  1. 1 0
      Templates/CMakeLists.txt
  2. 0 0
      Templates/GraphicsGem/Template/.gitignore
  3. 29 0
      Templates/GraphicsGem/Template/CMakeLists.txt
  4. 13 0
      Templates/GraphicsGem/Template/Code/${NameLower}_api_files.cmake
  5. 10 0
      Templates/GraphicsGem/Template/Code/${NameLower}_editor_api_files.cmake
  6. 14 0
      Templates/GraphicsGem/Template/Code/${NameLower}_editor_private_files.cmake
  7. 11 0
      Templates/GraphicsGem/Template/Code/${NameLower}_editor_shared_files.cmake
  8. 11 0
      Templates/GraphicsGem/Template/Code/${NameLower}_editor_tests_files.cmake
  9. 20 0
      Templates/GraphicsGem/Template/Code/${NameLower}_files.cmake
  10. 20 0
      Templates/GraphicsGem/Template/Code/${NameLower}_private_files.cmake
  11. 11 0
      Templates/GraphicsGem/Template/Code/${NameLower}_shared_files.cmake
  12. 11 0
      Templates/GraphicsGem/Template/Code/${NameLower}_tests_files.cmake
  13. 230 0
      Templates/GraphicsGem/Template/Code/CMakeLists.txt
  14. 40 0
      Templates/GraphicsGem/Template/Code/Include/${Name}/${Name}Bus.h
  15. 28 0
      Templates/GraphicsGem/Template/Code/Include/${Name}/${Name}FeatureProcessorInterface.h
  16. 26 0
      Templates/GraphicsGem/Template/Code/Include/${Name}/${Name}TypeIds.h
  17. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Android/${NameLower}_api_files.cmake
  18. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Android/${NameLower}_private_files.cmake
  19. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Android/${NameLower}_shared_files.cmake
  20. 11 0
      Templates/GraphicsGem/Template/Code/Platform/Android/PAL_android.cmake
  21. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_api_files.cmake
  22. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_editor_api_files.cmake
  23. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_private_files.cmake
  24. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_shared_files.cmake
  25. 11 0
      Templates/GraphicsGem/Template/Code/Platform/Linux/PAL_linux.cmake
  26. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_api_files.cmake
  27. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_editor_api_files.cmake
  28. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_private_files.cmake
  29. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_shared_files.cmake
  30. 11 0
      Templates/GraphicsGem/Template/Code/Platform/Mac/PAL_mac.cmake
  31. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_api_files.cmake
  32. 10 0
      Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_editor_api_files.cmake
  33. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_private_files.cmake
  34. 15 0
      Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_shared_files.cmake
  35. 11 0
      Templates/GraphicsGem/Template/Code/Platform/Windows/PAL_windows.cmake
  36. 10 0
      Templates/GraphicsGem/Template/Code/Platform/iOS/${NameLower}_api_files.cmake
  37. 15 0
      Templates/GraphicsGem/Template/Code/Platform/iOS/${NameLower}_private_files.cmake
  38. 15 0
      Templates/GraphicsGem/Template/Code/Platform/iOS/${NameLower}_shared_files.cmake
  39. 11 0
      Templates/GraphicsGem/Template/Code/Platform/iOS/PAL_ios.cmake
  40. 40 0
      Templates/GraphicsGem/Template/Code/Source/${Name}ModuleInterface.cpp
  41. 31 0
      Templates/GraphicsGem/Template/Code/Source/${Name}ModuleInterface.h
  42. 42 0
      Templates/GraphicsGem/Template/Code/Source/Clients/${Name}Module.cpp
  43. 89 0
      Templates/GraphicsGem/Template/Code/Source/Clients/${Name}SystemComponent.cpp
  44. 49 0
      Templates/GraphicsGem/Template/Code/Source/Clients/${Name}SystemComponent.h
  45. 37 0
      Templates/GraphicsGem/Template/Code/Source/Components/${Name}Component.cpp
  46. 30 0
      Templates/GraphicsGem/Template/Code/Source/Components/${Name}Component.h
  47. 117 0
      Templates/GraphicsGem/Template/Code/Source/Components/${Name}ComponentController.cpp
  48. 73 0
      Templates/GraphicsGem/Template/Code/Source/Components/${Name}ComponentController.h
  49. 37 0
      Templates/GraphicsGem/Template/Code/Source/Render/${Name}FeatureProcessor.cpp
  50. 33 0
      Templates/GraphicsGem/Template/Code/Source/Render/${Name}FeatureProcessor.h
  51. 49 0
      Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorModule.cpp
  52. 66 0
      Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorSystemComponent.cpp
  53. 41 0
      Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorSystemComponent.h
  54. 88 0
      Templates/GraphicsGem/Template/Code/Source/Tools/Components/Editor${Name}Component.cpp
  55. 51 0
      Templates/GraphicsGem/Template/Code/Source/Tools/Components/Editor${Name}Component.h
  56. 11 0
      Templates/GraphicsGem/Template/Code/Tests/Clients/${Name}Test.cpp
  57. 11 0
      Templates/GraphicsGem/Template/Code/Tests/Tools/${Name}EditorTest.cpp
  58. 18 0
      Templates/GraphicsGem/Template/Registry/assetprocessor_settings.setreg
  59. 32 0
      Templates/GraphicsGem/Template/gem.json
  60. 3 0
      Templates/GraphicsGem/Template/preview.png
  61. 285 0
      Templates/GraphicsGem/template.json

+ 1 - 0
Templates/CMakeLists.txt

@@ -19,5 +19,6 @@ ly_install_directory(
         DefaultComponent
         ScriptCanvasNode
         UnifiedMultiplayerGem
+        GraphicsGem
     VERBATIM
 )

+ 0 - 0
Templates/GraphicsGem/Template/.gitignore


+ 29 - 0
Templates/GraphicsGem/Template/CMakeLists.txt

@@ -0,0 +1,29 @@
+#
+# 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
+#
+#
+
+# Query the gem name from the gem.json file if possible
+# otherwise fallback to using ${Name}
+o3de_find_ancestor_gem_root(gem_path gem_name "${CMAKE_CURRENT_SOURCE_DIR}")
+if (NOT gem_name)
+    set(gem_name "${Name}")
+endif()
+
+# Fallback to using the current source CMakeLists.txt directory as the gem root path
+if (NOT gem_path)
+    set(gem_path ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+set(gem_json ${gem_path}/gem.json)
+
+o3de_restricted_path(${gem_json} gem_restricted_path gem_parent_relative_path)
+
+o3de_pal_dir(pal_dir ${CMAKE_CURRENT_SOURCE_DIR}/Platform/${PAL_PLATFORM_NAME} "${gem_restricted_path}" "${gem_path}" "${gem_parent_relative_path}")
+
+ly_add_external_target_path(${CMAKE_CURRENT_SOURCE_DIR}/3rdParty)
+
+add_subdirectory(Code)

+ 13 - 0
Templates/GraphicsGem/Template/Code/${NameLower}_api_files.cmake

@@ -0,0 +1,13 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Include/${Name}/${Name}Bus.h
+    Include/${Name}/${Name}TypeIds.h
+    Include/${Name}/${Name}FeatureProcessorInterface.h
+)

+ 10 - 0
Templates/GraphicsGem/Template/Code/${NameLower}_editor_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

+ 14 - 0
Templates/GraphicsGem/Template/Code/${NameLower}_editor_private_files.cmake

@@ -0,0 +1,14 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Source/Tools/${Name}EditorSystemComponent.cpp
+    Source/Tools/${Name}EditorSystemComponent.h
+    Source/Tools/Components/Editor${Name}Component.h
+    Source/Tools/Components/Editor${Name}Component.cpp
+)

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

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Source/Tools/${Name}EditorModule.cpp
+)

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

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Tests/Tools/${Name}EditorTest.cpp
+)

+ 20 - 0
Templates/GraphicsGem/Template/Code/${NameLower}_files.cmake

@@ -0,0 +1,20 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Include/${Name}/${Name}FeatureProcessorInterface.h
+    Source/Components/${Name}Component.cpp
+    Source/Components/${Name}Component.h
+    Source/Components/${Name}ComponentController.cpp
+    Source/Components/${Name}ComponentController.h
+    Source/Components/${Name}SystemComponent.h
+    Source/Components/${Name}SystemComponent.cpp
+
+    Source/Render/${Name}FeatureProcessor.h
+    Source/Render/${Name}FeatureProcessor.cpp
+)

+ 20 - 0
Templates/GraphicsGem/Template/Code/${NameLower}_private_files.cmake

@@ -0,0 +1,20 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Source/${Name}ModuleInterface.cpp
+    Source/${Name}ModuleInterface.h
+    Source/Clients/${Name}SystemComponent.cpp
+    Source/Clients/${Name}SystemComponent.h
+    Source/Components/${Name}Component.h
+    Source/Components/${Name}Component.cpp
+    Source/Components/${Name}ComponentController.h
+    Source/Components/${Name}ComponentController.cpp
+    Source/Render/${Name}FeatureProcessor.h
+    Source/Render/${Name}FeatureProcessor.cpp
+)

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

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Source/Clients/${Name}Module.cpp
+)

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

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(FILES
+    Tests/Clients/${Name}Test.cpp
+)

+ 230 - 0
Templates/GraphicsGem/Template/Code/CMakeLists.txt

@@ -0,0 +1,230 @@
+#
+# 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
+#
+#
+
+# 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: o3de_pal_dir 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
+o3de_pal_dir(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} "${gem_restricted_path}" "${gem_path}" "${gem_parent_relative_path}")
+
+# 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)
+
+# Check to see if building the Gem Modules are supported for the current platform
+if(NOT PAL_TRAIT_${NameUpper}_SUPPORTED)
+    return()
+endif()
+
+# The ${gem_name}.API target declares the common interface that users of this gem should depend on in their targets
+ly_add_target(
+    NAME ${gem_name}.API INTERFACE
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${NameLower}_api_files.cmake
+        ${pal_dir}/${NameLower}_api_files.cmake
+    INCLUDE_DIRECTORIES
+        INTERFACE
+            Include
+    BUILD_DEPENDENCIES
+        INTERFACE
+           AZ::AzCore
+           Gem::Atom_RPI.Public
+           Gem::Atom_Feature_Common
+           Gem::Atom_Feature_Common.Public
+           Gem::Atom_Feature_Common.Static
+)
+
+# The ${gem_name}.Private.Object target is an internal target
+# It should not be used outside of this Gems CMakeLists.txt
+ly_add_target(
+    NAME ${gem_name}.Private.Object STATIC
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${NameLower}_private_files.cmake
+        ${pal_dir}/${NameLower}_private_files.cmake
+    TARGET_PROPERTIES
+        O3DE_PRIVATE_TARGET TRUE
+    INCLUDE_DIRECTORIES
+        PRIVATE
+            Include
+            Source
+    BUILD_DEPENDENCIES
+        PUBLIC
+            AZ::AzCore
+            AZ::AzFramework
+            Gem::Atom_RPI.Public
+            Gem::Atom_Utils.Static
+            Gem::Atom_Feature_Common
+            Gem::AtomLyIntegration_CommonFeatures.Static
+)
+
+# Here add ${gem_name} target, it depends on the Private Object library and Public API interface
+ly_add_target(
+    NAME ${gem_name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${NameLower}_shared_files.cmake
+        ${pal_dir}/${NameLower}_shared_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+        PRIVATE
+            Source
+    BUILD_DEPENDENCIES
+        PUBLIC
+            Gem::${gem_name}.API
+        PRIVATE
+            Gem::${gem_name}.Private.Object
+)
+
+# By default, we will specify that the above target ${gem_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 ${gem_name}.Clients NAMESPACE Gem TARGETS Gem::${gem_name})
+ly_create_alias(NAME ${gem_name}.Servers NAMESPACE Gem TARGETS Gem::${gem_name})
+ly_create_alias(NAME ${gem_name}.Unified NAMESPACE Gem TARGETS Gem::${gem_name})
+
+# For the Client and Server variants of ${gem_name} Gem, an alias to the ${gem_name}.API target will be made
+ly_create_alias(NAME ${gem_name}.Clients.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+ly_create_alias(NAME ${gem_name}.Servers.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+ly_create_alias(NAME ${gem_name}.Unified.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+
+# If we are on a host platform, we want to add the host tools targets like the ${gem_name}.Editor MODULE target
+if(PAL_TRAIT_BUILD_HOST_TOOLS)
+    # The ${gem_name}.Editor.API target can be used by other gems that want to interact with the ${gem_name}.Editor module
+    ly_add_target(
+        NAME ${gem_name}.Editor.API INTERFACE
+        NAMESPACE Gem
+        FILES_CMAKE
+            ${NameLower}_editor_api_files.cmake
+            ${pal_dir}/${NameLower}_editor_api_files.cmake
+        INCLUDE_DIRECTORIES
+            INTERFACE
+                Include
+        BUILD_DEPENDENCIES
+            INTERFACE
+                AZ::AzToolsFramework
+    )
+
+    # The ${gem_name}.Editor.Private.Object target is an internal target
+    # which is only to be used by this gems CMakeLists.txt and any subdirectories
+    # Other gems should not use this target
+    ly_add_target(
+        NAME ${gem_name}.Editor.Private.Object STATIC
+        NAMESPACE Gem
+        FILES_CMAKE
+            ${NameLower}_editor_private_files.cmake
+        TARGET_PROPERTIES
+            O3DE_PRIVATE_TARGET TRUE
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Include
+                Source
+        BUILD_DEPENDENCIES
+            PUBLIC
+                AZ::AzToolsFramework
+                $<TARGET_OBJECTS:Gem::${gem_name}.Private.Object>
+                Gem::Atom_Utils.Static
+                Gem::Atom_Feature_Common
+                Gem::AtomLyIntegration_CommonFeatures.Static                
+    )
+
+    ly_add_target(
+        NAME ${gem_name}.Editor GEM_MODULE
+        NAMESPACE Gem
+        AUTOMOC
+        FILES_CMAKE
+            ${NameLower}_editor_shared_files.cmake
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Source
+            PUBLIC
+                Include
+        BUILD_DEPENDENCIES
+            PUBLIC
+                Gem::${gem_name}.Editor.API
+            PRIVATE
+                Gem::${gem_name}.Editor.Private.Object
+    )
+
+    # By default, we will specify that the above target ${gem_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 ${gem_name}.Tools    NAMESPACE Gem TARGETS Gem::${gem_name}.Editor)
+    ly_create_alias(NAME ${gem_name}.Builders NAMESPACE Gem TARGETS Gem::${gem_name}.Editor)
+
+    # For the Tools and Builders variants of ${gem_name} Gem, an alias to the ${gem_name}.Editor API target will be made
+    ly_create_alias(NAME ${gem_name}.Tools.API NAMESPACE Gem TARGETS Gem::${gem_name}.Editor.API)
+    ly_create_alias(NAME ${gem_name}.Builders.API NAMESPACE Gem TARGETS Gem::${gem_name}.Editor.API)
+
+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 ${gem_name}.Tests
+    if(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED)
+        # We support ${gem_name}.Tests on this platform, add dependency on the Private Object target
+        ly_add_target(
+            NAME ${gem_name}.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
+            NAMESPACE Gem
+            FILES_CMAKE
+                ${NameLower}_tests_files.cmake
+            INCLUDE_DIRECTORIES
+                PRIVATE
+                    Tests
+                    Source
+                    Include
+            BUILD_DEPENDENCIES
+                PRIVATE
+                    AZ::AzTest
+                    AZ::AzFramework
+                    Gem::${gem_name}.Private.Object
+        )
+
+        # Add ${gem_name}.Tests to googletest
+        ly_add_googletest(
+            NAME Gem::${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 ${gem_name}.Editor.Tests on this platform, add ${gem_name}.Editor.Tests target which depends on
+            # private ${gem_name}.Editor.Private.Object target
+            ly_add_target(
+                NAME ${gem_name}.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
+                NAMESPACE Gem
+                FILES_CMAKE
+                    ${NameLower}_editor_tests_files.cmake
+                INCLUDE_DIRECTORIES
+                    PRIVATE
+                        Tests
+                        Source
+                        Include
+                BUILD_DEPENDENCIES
+                    PRIVATE
+                        AZ::AzTest
+                        Gem::${gem_name}.Editor.Private.Object
+            )
+
+            # Add ${gem_name}.Editor.Tests to googletest
+            ly_add_googletest(
+                NAME Gem::${gem_name}.Editor.Tests
+            )
+        endif()
+    endif()
+endif()

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

@@ -0,0 +1,40 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <${Name}/${Name}TypeIds.h>
+
+#include <AzCore/EBus/EBus.h>
+#include <AzCore/Interface/Interface.h>
+
+namespace ${Name}
+{
+    class ${Name}Requests
+    {
+    public:
+        AZ_RTTI(${Name}Requests, ${Name}RequestsTypeId);
+        virtual ~${Name}Requests() = default;
+        // Put your public methods here
+    };
+
+    class ${Name}BusTraits
+        : public AZ::EBusTraits
+    {
+    public:
+        //////////////////////////////////////////////////////////////////////////
+        // EBusTraits overrides
+        static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+        //////////////////////////////////////////////////////////////////////////
+    };
+
+    using ${Name}RequestBus = AZ::EBus<${Name}Requests, ${Name}BusTraits>;
+    using ${Name}Interface = AZ::Interface<${Name}Requests>;
+
+} // namespace ${Name}

+ 28 - 0
Templates/GraphicsGem/Template/Code/Include/${Name}/${Name}FeatureProcessorInterface.h

@@ -0,0 +1,28 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <AzCore/base.h>
+#include <Atom/RPI.Public/FeatureProcessor.h>
+
+namespace ${Name}
+{
+    class ${Name};
+
+    using ${Name}Handle = AZStd::shared_ptr<${Name}>;
+
+    // ${Name}FeatureProcessorInterface provides an interface to the feature processor for code outside of Atom
+    class ${Name}FeatureProcessorInterface
+        : public AZ::RPI::FeatureProcessor
+    {
+    public:
+        AZ_RTTI(${Name}FeatureProcessorInterface, "{${Random_Uuid}}", AZ::RPI::FeatureProcessor);
+
+    };
+}

+ 26 - 0
Templates/GraphicsGem/Template/Code/Include/${Name}/${Name}TypeIds.h

@@ -0,0 +1,26 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+namespace ${Name}
+{
+    // System Component TypeIds
+    inline constexpr const char* ${Name}SystemComponentTypeId = "${SysCompClassId}";
+    inline constexpr const char* ${Name}EditorSystemComponentTypeId = "${EditorSysCompClassId}";
+
+    // Module derived classes TypeIds
+    inline constexpr const char* ${Name}ModuleInterfaceTypeId = "{${Random_Uuid}}";
+    inline constexpr const char* ${Name}ModuleTypeId = "${ModuleClassId}";
+    // The Editor Module by default is mutually exclusive with the Client Module
+    // so they use the Same TypeId
+    inline constexpr const char* ${Name}EditorModuleTypeId = ${SanitizedCppName}ModuleTypeId;
+
+    // Interface TypeIds
+    inline constexpr const char* ${Name}RequestsTypeId = "{${Random_Uuid}}";
+} // namespace ${Name}

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Android/${NameLower}_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

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

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Android/${NameLower}_shared_files.cmake

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Android/PAL_android.cmake

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED FALSE)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_editor_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

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

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Linux/${NameLower}_shared_files.cmake

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Linux/PAL_linux.cmake

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED FALSE)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_editor_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

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

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Mac/${NameLower}_shared_files.cmake

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Mac/PAL_mac.cmake

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED FALSE)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_editor_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

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

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Windows/${NameLower}_shared_files.cmake

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/Windows/PAL_windows.cmake

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED FALSE)

+ 10 - 0
Templates/GraphicsGem/Template/Code/Platform/iOS/${NameLower}_api_files.cmake

@@ -0,0 +1,10 @@
+#
+# 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
+#
+#
+
+set(FILES
+)

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

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/iOS/${NameLower}_shared_files.cmake

@@ -0,0 +1,15 @@
+#
+# 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
+#
+#
+
+# 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/GraphicsGem/Template/Code/Platform/iOS/PAL_ios.cmake

@@ -0,0 +1,11 @@
+#
+# 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
+#
+#
+
+set(PAL_TRAIT_${NameUpper}_SUPPORTED TRUE)
+set(PAL_TRAIT_${NameUpper}_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_${NameUpper}_EDITOR_TEST_SUPPORTED FALSE)

+ 40 - 0
Templates/GraphicsGem/Template/Code/Source/${Name}ModuleInterface.cpp

@@ -0,0 +1,40 @@
+/*
+ * 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
+ *
+ */
+
+#include "${Name}ModuleInterface.h"
+#include <AzCore/Memory/Memory.h>
+
+#include <${Name}/${Name}TypeIds.h>
+
+#include <Clients/${Name}SystemComponent.h>
+
+namespace ${Name}
+{
+    AZ_TYPE_INFO_WITH_NAME_IMPL(${Name}ModuleInterface,
+        "${Name}ModuleInterface", ${Name}ModuleInterfaceTypeId);
+    AZ_RTTI_NO_TYPE_INFO_IMPL(${Name}ModuleInterface, AZ::Module);
+    AZ_CLASS_ALLOCATOR_IMPL(${Name}ModuleInterface, AZ::SystemAllocator);
+
+    ${Name}ModuleInterface::${Name}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(), {
+            ${Name}SystemComponent::CreateDescriptor(),
+            });
+    }
+
+    AZ::ComponentTypeList ${Name}ModuleInterface::GetRequiredSystemComponents() const
+    {
+        return AZ::ComponentTypeList{
+            azrtti_typeid<${Name}SystemComponent>(),
+        };
+    }
+} // namespace ${Name}

+ 31 - 0
Templates/GraphicsGem/Template/Code/Source/${Name}ModuleInterface.h

@@ -0,0 +1,31 @@
+/*
+ * 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
+ *
+ */
+
+#include <AzCore/Memory/Memory_fwd.h>
+#include <AzCore/Module/Module.h>
+#include <AzCore/RTTI/RTTIMacros.h>
+#include <AzCore/RTTI/TypeInfoSimple.h>
+
+namespace ${Name}
+{
+    class ${Name}ModuleInterface
+        : public AZ::Module
+    {
+    public:
+        AZ_TYPE_INFO_WITH_NAME_DECL(${Name}ModuleInterface)
+        AZ_RTTI_NO_TYPE_INFO_DECL()
+        AZ_CLASS_ALLOCATOR_DECL
+
+        ${Name}ModuleInterface();
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override;
+    };
+}// namespace ${Name}

+ 42 - 0
Templates/GraphicsGem/Template/Code/Source/Clients/${Name}Module.cpp

@@ -0,0 +1,42 @@
+/*
+ * 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
+ *
+ */
+
+#include <${Name}/${Name}TypeIds.h>
+#include <${Name}ModuleInterface.h>
+#include "${Name}SystemComponent.h"
+
+#include <AzCore/RTTI/RTTI.h>
+
+#include <Components/${Name}Component.h>
+
+namespace ${Name}
+{
+    class ${Name}Module
+        : public ${Name}ModuleInterface
+    {
+    public:
+        AZ_RTTI(${Name}Module, ${Name}ModuleTypeId, ${Name}ModuleInterface);
+        AZ_CLASS_ALLOCATOR(${Name}Module, AZ::SystemAllocator);
+
+        ${Name}Module()
+        {
+            m_descriptors.insert(m_descriptors.end(),
+                {
+                    ${Name}SystemComponent::CreateDescriptor(),
+                    ${Name}Component::CreateDescriptor(),
+                });
+        }
+
+        AZ::ComponentTypeList GetRequiredSystemComponents() const
+        {
+            return AZ::ComponentTypeList{ azrtti_typeid<${Name}SystemComponent>() };
+        }
+    };
+}// namespace ${Name}
+
+AZ_DECLARE_MODULE_CLASS(Gem_${Name}, ${Name}::${Name}Module)

+ 89 - 0
Templates/GraphicsGem/Template/Code/Source/Clients/${Name}SystemComponent.cpp

@@ -0,0 +1,89 @@
+/*
+ * 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
+ *
+ */
+
+#include "${Name}SystemComponent.h"
+
+#include <${Name}/${Name}TypeIds.h>
+
+#include <AzCore/Serialization/SerializeContext.h>
+
+#include <Atom/RPI.Public/FeatureProcessorFactory.h>
+
+#include <Render/${Name}FeatureProcessor.h>
+
+namespace ${Name}
+{
+    AZ_COMPONENT_IMPL(${Name}SystemComponent, "${Name}SystemComponent",
+        ${Name}SystemComponentTypeId);
+
+    void ${Name}SystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${Name}SystemComponent, AZ::Component>()
+                ->Version(0)
+                ;
+        }
+
+        ${Name}FeatureProcessor::Reflect(context);
+    }
+
+    void ${Name}SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC_CE("${Name}SystemService"));
+    }
+
+    void ${Name}SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC_CE("${Name}SystemService"));
+    }
+
+    void ${Name}SystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+        required.push_back(AZ_CRC_CE("RPISystem"));
+    }
+
+    void ${Name}SystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+    }
+
+    ${Name}SystemComponent::${Name}SystemComponent()
+    {
+        if (${Name}Interface::Get() == nullptr)
+        {
+            ${Name}Interface::Register(this);
+        }
+    }
+
+    ${Name}SystemComponent::~${Name}SystemComponent()
+    {
+        if (${Name}Interface::Get() == this)
+        {
+            ${Name}Interface::Unregister(this);
+        }
+    }
+
+    void ${Name}SystemComponent::Init()
+    {
+    }
+
+    void ${Name}SystemComponent::Activate()
+    {
+        ${Name}RequestBus::Handler::BusConnect();
+
+        AZ::RPI::FeatureProcessorFactory::Get()->RegisterFeatureProcessor<${Name}FeatureProcessor>();
+    }
+
+    void ${Name}SystemComponent::Deactivate()
+    {
+        AZ::RPI::FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<${Name}FeatureProcessor>();
+
+        ${Name}RequestBus::Handler::BusDisconnect();
+    }
+
+} // namespace ${Name}

+ 49 - 0
Templates/GraphicsGem/Template/Code/Source/Clients/${Name}SystemComponent.h

@@ -0,0 +1,49 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <AzCore/Component/Component.h>
+#include <AzCore/Component/TickBus.h>
+#include <${Name}/${Name}Bus.h>
+
+namespace ${Name}
+{
+    class ${Name}SystemComponent
+        : public AZ::Component
+        , protected ${Name}RequestBus::Handler
+    {
+    public:
+        AZ_COMPONENT_DECL(${Name}SystemComponent);
+
+        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);
+
+        ${Name}SystemComponent();
+        ~${Name}SystemComponent();
+
+    protected:
+        ////////////////////////////////////////////////////////////////////////
+        // ${Name}RequestBus interface implementation
+
+        ////////////////////////////////////////////////////////////////////////
+
+        ////////////////////////////////////////////////////////////////////////
+        // AZ::Component interface implementation
+        void Init() override;
+        void Activate() override;
+        void Deactivate() override;
+        ////////////////////////////////////////////////////////////////////////
+
+    };
+
+} // namespace ${Name}

+ 37 - 0
Templates/GraphicsGem/Template/Code/Source/Components/${Name}Component.cpp

@@ -0,0 +1,37 @@
+/*
+ * 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
+ *
+ */
+
+#include <Components/${Name}Component.h>
+#include <AzCore/RTTI/BehaviorContext.h>
+
+namespace ${Name}
+{
+    ${Name}Component::${Name}Component(const ${Name}ComponentConfig& config)
+        : BaseClass(config)
+    {
+    }
+
+    void ${Name}Component::Reflect(AZ::ReflectContext* context)
+    {
+        BaseClass::Reflect(context);
+
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${Name}Component, BaseClass>()
+                ->Version(0)
+                ;
+        }
+
+        if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
+        {
+            behaviorContext->ConstantProperty("${Name}ComponentTypeId", BehaviorConstant(AZ::Uuid(${Name}ComponentTypeId)))
+                ->Attribute(AZ::Script::Attributes::Module, "render")
+                ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common);
+        }
+    }
+}

+ 30 - 0
Templates/GraphicsGem/Template/Code/Source/Components/${Name}Component.h

@@ -0,0 +1,30 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <Components/${Name}ComponentController.h>
+#include <AzFramework/Components/ComponentAdapter.h>
+
+namespace ${Name}
+{
+    inline constexpr AZ::TypeId ${Name}ComponentTypeId { "{${Random_Uuid}}" };
+
+    class ${Name}Component final
+        : public AzFramework::Components::ComponentAdapter<${Name}ComponentController, ${Name}ComponentConfig>
+    {
+    public:
+        using BaseClass = AzFramework::Components::ComponentAdapter<${Name}ComponentController, ${Name}ComponentConfig>;
+        AZ_COMPONENT(${Name}Component, ${Name}ComponentTypeId, BaseClass);
+
+        ${Name}Component() = default;
+        ${Name}Component(const ${Name}ComponentConfig& config);
+
+        static void Reflect(AZ::ReflectContext* context);
+    };
+}

+ 117 - 0
Templates/GraphicsGem/Template/Code/Source/Components/${Name}ComponentController.cpp

@@ -0,0 +1,117 @@
+/*
+ * 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
+ *
+ */
+
+#include <Components/${Name}ComponentController.h>
+
+#include <AzCore/Asset/AssetManager.h>
+#include <AzCore/Asset/AssetManagerBus.h>
+#include <AzCore/Asset/AssetSerializer.h>
+#include <AzCore/Serialization/SerializeContext.h>
+
+#include <AzFramework/Entity/EntityContextBus.h>
+#include <AzFramework/Entity/EntityContext.h>
+#include <AzFramework/Scene/Scene.h>
+#include <AzFramework/Scene/SceneSystemInterface.h>
+
+#include <AzCore/RTTI/BehaviorContext.h>
+
+#include <Atom/RPI.Public/Scene.h>
+
+namespace ${Name}
+{
+    void ${Name}ComponentConfig::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${Name}ComponentConfig>()
+                ;
+        }
+    }
+
+    void ${Name}ComponentController::Reflect(AZ::ReflectContext* context)
+    {
+        ${Name}ComponentConfig::Reflect(context);
+
+        if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${Name}ComponentController>()
+                ->Version(0)
+                ->Field("Configuration", &${Name}ComponentController::m_configuration);
+
+            if (AZ::EditContext* editContext = serializeContext->GetEditContext())
+            {
+                editContext->Class<${Name}ComponentController>(
+                    "${Name}ComponentController", "")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                        ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &${Name}ComponentController::m_configuration, "Configuration", "")
+                        ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
+                    ;
+            }
+        }
+    }
+
+    void ${Name}ComponentController::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+        dependent.push_back(AZ_CRC_CE("TransformService"));
+    }
+
+    void ${Name}ComponentController::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC_CE("${Name}Service"));
+    }
+
+    void ${Name}ComponentController::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC_CE("${Name}Service"));
+    }
+
+    void ${Name}ComponentController::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+        required.push_back(AZ_CRC_CE("TransformService"));
+    }
+
+    ${Name}ComponentController::${Name}ComponentController(const ${Name}ComponentConfig& config)
+        : m_configuration(config)
+    {
+    }
+
+    void ${Name}ComponentController::Activate(AZ::EntityId entityId)
+    {
+        m_entityId = entityId;
+
+        AZ::TransformNotificationBus::Handler::BusConnect(m_entityId);
+
+        m_featureProcessor = AZ::RPI::Scene::GetFeatureProcessorForEntity<${Name}FeatureProcessorInterface>(entityId);
+        AZ_Assert(m_featureProcessor, "${Name}ComponentController was unable to find a ${Name}FeatureProcessor on the EntityContext provided.");
+
+    }
+
+    void ${Name}ComponentController::Deactivate()
+    {
+        AZ::TransformNotificationBus::Handler::BusDisconnect();
+    }
+
+    void ${Name}ComponentController::SetConfiguration(const ${Name}ComponentConfig& config)
+    {
+        m_configuration = config;
+    }
+
+    const ${Name}ComponentConfig& ${Name}ComponentController::GetConfiguration() const
+    {
+        return m_configuration;
+    }
+
+    void ${Name}ComponentController::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, [[maybe_unused]] const AZ::Transform& world)
+    {
+        if (!m_featureProcessor)
+        {
+            return;
+        }
+    }
+}

+ 73 - 0
Templates/GraphicsGem/Template/Code/Source/Components/${Name}ComponentController.h

@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <AzCore/Asset/AssetCommon.h>
+#include <AzCore/Component/Component.h>
+#include <AzCore/Component/TransformBus.h>
+
+#include <${Name}/${Name}FeatureProcessorInterface.h>
+
+namespace ${Name}
+{
+    class ${Name}ComponentConfig final
+        : public AZ::ComponentConfig
+    {
+    public:
+        AZ_RTTI(${Name}ComponentConfig, "{${Random_Uuid}}", ComponentConfig);
+        AZ_CLASS_ALLOCATOR(${Name}ComponentConfig, AZ::SystemAllocator);
+        static void Reflect(AZ::ReflectContext* context);
+
+        ${Name}ComponentConfig() = default;
+
+        AZ::u64 m_entityId{ AZ::EntityId::InvalidEntityId };
+    };
+
+    class ${Name}ComponentController final
+        : public AZ::Data::AssetBus::MultiHandler
+        , private AZ::TransformNotificationBus::Handler
+    {
+    public:
+        friend class Editor${Name}Component;
+
+        AZ_RTTI(${Name}ComponentController, "{${Random_Uuid}}");
+        AZ_CLASS_ALLOCATOR(${Name}ComponentController, AZ::SystemAllocator);
+
+        static void Reflect(AZ::ReflectContext* context);
+        static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
+        static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
+        static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
+        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
+
+        ${Name}ComponentController() = default;
+        ${Name}ComponentController(const ${Name}ComponentConfig& config);
+
+        void Activate(AZ::EntityId entityId);
+        void Deactivate();
+        void SetConfiguration(const ${Name}ComponentConfig& config);
+        const ${Name}ComponentConfig& GetConfiguration() const;
+
+    private:
+
+        AZ_DISABLE_COPY(${Name}ComponentController);
+
+        // TransformNotificationBus overrides
+        void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override;
+
+        // handle for this probe in the feature processor
+        ${Name}Handle m_handle;
+
+        ${Name}FeatureProcessorInterface* m_featureProcessor = nullptr;
+        AZ::TransformInterface* m_transformInterface = nullptr;
+        AZ::EntityId m_entityId;
+        
+        ${Name}ComponentConfig m_configuration;
+
+    };
+}

+ 37 - 0
Templates/GraphicsGem/Template/Code/Source/Render/${Name}FeatureProcessor.cpp

@@ -0,0 +1,37 @@
+/*
+ * 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
+ *
+ */
+
+#include "${Name}FeatureProcessor.h"
+
+namespace ${Name}
+{
+    void ${Name}FeatureProcessor::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext
+                ->Class<${Name}FeatureProcessor, FeatureProcessor>()
+                ;
+        }
+    }
+
+    void ${Name}FeatureProcessor::Activate()
+    {
+
+    }
+
+    void ${Name}FeatureProcessor::Deactivate()
+    {
+        
+    }
+
+    void ${Name}FeatureProcessor::Simulate([[maybe_unused]] const FeatureProcessor::SimulatePacket& packet)
+    {
+        
+    }    
+}

+ 33 - 0
Templates/GraphicsGem/Template/Code/Source/Render/${Name}FeatureProcessor.h

@@ -0,0 +1,33 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <${Name}/${Name}FeatureProcessorInterface.h>
+
+namespace ${Name}
+{
+    class ${Name}FeatureProcessor final
+        : public ${Name}FeatureProcessorInterface
+    {
+    public:
+        AZ_RTTI(${Name}FeatureProcessor, "{${Random_Uuid}}", ${Name}FeatureProcessorInterface);
+        AZ_CLASS_ALLOCATOR(${Name}FeatureProcessor, AZ::SystemAllocator)
+
+        static void Reflect(AZ::ReflectContext* context);
+
+        ${Name}FeatureProcessor() = default;
+        virtual ~${Name}FeatureProcessor() = default;
+
+        // FeatureProcessor overrides
+        void Activate() override;
+        void Deactivate() override;
+        void Simulate(const FeatureProcessor::SimulatePacket& packet) override;
+
+    };
+}

+ 49 - 0
Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorModule.cpp

@@ -0,0 +1,49 @@
+/*
+ * 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
+ *
+ */
+
+#include <${Name}/${Name}TypeIds.h>
+#include <${Name}ModuleInterface.h>
+#include "${Name}EditorSystemComponent.h"
+#include "Components/Editor${Name}Component.h"
+
+namespace ${Name}
+{
+    class ${Name}EditorModule
+        : public ${Name}ModuleInterface
+    {
+    public:
+        AZ_RTTI(${Name}EditorModule, ${Name}EditorModuleTypeId, ${Name}ModuleInterface);
+        AZ_CLASS_ALLOCATOR(${Name}EditorModule, AZ::SystemAllocator);
+
+        ${Name}EditorModule()
+        {
+            // 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(), {
+                ${Name}EditorSystemComponent::CreateDescriptor(),
+                ${Name}Component::CreateDescriptor(),
+                Editor${Name}Component::CreateDescriptor(),
+            });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         * Non-SystemComponents should not be added here
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList {
+                azrtti_typeid<${Name}EditorSystemComponent>(),
+            };
+        }
+    };
+}// namespace ${Name}
+
+AZ_DECLARE_MODULE_CLASS(Gem_${Name}, ${Name}::${Name}EditorModule)

+ 66 - 0
Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorSystemComponent.cpp

@@ -0,0 +1,66 @@
+/*
+ * 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
+ *
+ */
+
+#include <AzCore/Serialization/SerializeContext.h>
+#include "${Name}EditorSystemComponent.h"
+
+#include <${Name}/${Name}TypeIds.h>
+
+namespace ${Name}
+{
+    AZ_COMPONENT_IMPL(${Name}EditorSystemComponent, "${Name}EditorSystemComponent",
+        ${Name}EditorSystemComponentTypeId, BaseSystemComponent);
+
+    void ${Name}EditorSystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<${Name}EditorSystemComponent, ${Name}SystemComponent>()
+                ->Version(0);
+        }
+    }
+
+    ${Name}EditorSystemComponent::${Name}EditorSystemComponent() = default;
+
+    ${Name}EditorSystemComponent::~${Name}EditorSystemComponent() = default;
+
+    void ${Name}EditorSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        BaseSystemComponent::GetProvidedServices(provided);
+        provided.push_back(AZ_CRC_CE("${Name}SystemEditorService"));
+    }
+
+    void ${Name}EditorSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        BaseSystemComponent::GetIncompatibleServices(incompatible);
+        incompatible.push_back(AZ_CRC_CE("${Name}SystemEditorService"));
+    }
+
+    void ${Name}EditorSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+        BaseSystemComponent::GetRequiredServices(required);
+    }
+
+    void ${Name}EditorSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+        BaseSystemComponent::GetDependentServices(dependent);
+    }
+
+    void ${Name}EditorSystemComponent::Activate()
+    {
+        ${Name}SystemComponent::Activate();
+        AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
+    }
+
+    void ${Name}EditorSystemComponent::Deactivate()
+    {
+        AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect();
+        ${Name}SystemComponent::Deactivate();
+    }
+
+} // namespace ${Name}

+ 41 - 0
Templates/GraphicsGem/Template/Code/Source/Tools/${Name}EditorSystemComponent.h

@@ -0,0 +1,41 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <AzToolsFramework/API/ToolsApplicationAPI.h>
+
+#include <Clients/${Name}SystemComponent.h>
+
+namespace ${Name}
+{
+    /// System component for ${Name} editor
+    class ${Name}EditorSystemComponent
+        : public ${Name}SystemComponent
+        , protected AzToolsFramework::EditorEvents::Bus::Handler
+    {
+        using BaseSystemComponent = ${Name}SystemComponent;
+    public:
+        AZ_COMPONENT_DECL(${Name}EditorSystemComponent);
+
+        static void Reflect(AZ::ReflectContext* context);
+
+        ${Name}EditorSystemComponent();
+        ~${Name}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;
+    };
+} // namespace ${Name}

+ 88 - 0
Templates/GraphicsGem/Template/Code/Source/Tools/Components/Editor${Name}Component.cpp

@@ -0,0 +1,88 @@
+/*
+ * 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
+ *
+ */
+
+#include <Tools/Components/Editor${Name}Component.h>
+#include <AzFramework/StringFunc/StringFunc.h>
+#include <AzToolsFramework/API/ToolsApplicationAPI.h>
+#include <AzToolsFramework/Entity/EditorEntityInfoBus.h>
+#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
+#include <AzCore/Component/Entity.h>
+#include <AzCore/IO/SystemFile.h>
+
+namespace ${Name}
+{
+    void Editor${Name}Component::Reflect(AZ::ReflectContext* context)
+    {
+        BaseClass::Reflect(context);
+
+        if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<Editor${Name}Component, BaseClass>()
+                ;
+
+            if (AZ::EditContext* editContext = serializeContext->GetEditContext())
+            {
+                editContext->Class<Editor${Name}Component>(
+                    "${Name}", "The ${Name} component")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                        ->Attribute(AZ::Edit::Attributes::Category, "Graphics")
+                        ->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
+                        ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.svg")
+                        ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
+                        ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                        ->Attribute(AZ::Edit::Attributes::HelpPageURL, "")
+                    ;
+            }
+        }
+
+        if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
+        {
+            behaviorContext->ConstantProperty(${Name}EditorSystemComponentTypeId, BehaviorConstant(AZ::Uuid(${Name}EditorSystemComponentTypeId)))
+                ->Attribute(AZ::Script::Attributes::Module, "render")
+                ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation);
+        }
+    }
+
+    Editor${Name}Component::Editor${Name}Component()
+    {
+    }
+
+    Editor${Name}Component::Editor${Name}Component(const ${Name}ComponentConfig& config)
+        : BaseClass(config)
+    {
+    }
+
+    void Editor${Name}Component::Activate()
+    {
+        BaseClass::Activate();
+        AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(GetEntityId());
+        AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(GetEntityId());
+        AZ::TickBus::Handler::BusConnect();
+        AzToolsFramework::EditorEntityInfoNotificationBus::Handler::BusConnect();
+
+        AZ::u64 entityId = (AZ::u64)GetEntityId();
+        m_controller.m_configuration.m_entityId = entityId;
+    }
+
+    void Editor${Name}Component::Deactivate()
+    {
+        AzToolsFramework::EditorEntityInfoNotificationBus::Handler::BusDisconnect();
+        AZ::TickBus::Handler::BusDisconnect();
+        AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect();
+        AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect();
+        BaseClass::Deactivate();
+    }
+
+    void Editor${Name}Component::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
+    {
+        if (!m_controller.m_featureProcessor)
+        {
+            return;
+        }
+    }
+}

+ 51 - 0
Templates/GraphicsGem/Template/Code/Source/Tools/Components/Editor${Name}Component.h

@@ -0,0 +1,51 @@
+/*
+ * 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
+ *
+ */
+
+#pragma once
+
+#include <AzCore/Component/TickBus.h>
+#include <AzFramework/Entity/EntityDebugDisplayBus.h>
+#include <AzToolsFramework/API/ComponentEntitySelectionBus.h>
+#include <AzToolsFramework/Entity/EditorEntityInfoBus.h>
+#include <AzToolsFramework/ToolsComponents/EditorComponentAdapter.h>
+#include <Components/${Name}Component.h>
+
+#include <${Name}/${Name}TypeIds.h>
+
+namespace ${Name}
+{
+    inline constexpr AZ::TypeId EditorComponentTypeId { "{${Random_Uuid}}" };
+
+    class Editor${Name}Component final
+        : public AzToolsFramework::Components::EditorComponentAdapter<${Name}ComponentController, ${Name}Component, ${Name}ComponentConfig>
+        , private AzToolsFramework::EditorComponentSelectionRequestsBus::Handler
+        , private AzFramework::EntityDebugDisplayEventBus::Handler
+        , private AZ::TickBus::Handler
+        , private AzToolsFramework::EditorEntityInfoNotificationBus::Handler
+    {
+    public:
+        using BaseClass = AzToolsFramework::Components::EditorComponentAdapter<${Name}ComponentController, ${Name}Component, ${Name}ComponentConfig>;
+        AZ_EDITOR_COMPONENT(Editor${Name}Component, EditorComponentTypeId, BaseClass);
+
+        static void Reflect(AZ::ReflectContext* context);
+
+        Editor${Name}Component();
+        Editor${Name}Component(const ${Name}ComponentConfig& config);
+
+        // AZ::Component overrides
+        void Activate() override;
+        void Deactivate() override;
+
+    private:
+
+        // AZ::TickBus overrides
+        void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
+
+
+    };
+}

+ 11 - 0
Templates/GraphicsGem/Template/Code/Tests/Clients/${Name}Test.cpp

@@ -0,0 +1,11 @@
+/*
+ * 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
+ *
+ */
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 11 - 0
Templates/GraphicsGem/Template/Code/Tests/Tools/${Name}EditorTest.cpp

@@ -0,0 +1,11 @@
+/*
+ * 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
+ *
+ */
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 18 - 0
Templates/GraphicsGem/Template/Registry/assetprocessor_settings.setreg

@@ -0,0 +1,18 @@
+{
+    "Amazon": {
+        "AssetProcessor": {
+            "Settings": {
+                "ScanFolder ${Name}/Assets": {
+                    "watch": "@GEMROOT:${Name}@/Assets",
+                    "recursive": 1,
+                    "order": 101
+                },
+                "ScanFolder ${Name}/Registry": {
+                    "watch": "@GEMROOT:${Name}@/Registry",
+                    "recursive": 1,
+                    "order": 102
+                }
+            }
+        }
+    }
+}

+ 32 - 0
Templates/GraphicsGem/Template/gem.json

@@ -0,0 +1,32 @@
+{
+    "gem_name": "${Name}",
+    "version": "${Version}",
+    "display_name": "${DisplayName}",
+    "license": "${License}",
+    "license_url": "${LicenseURL}",
+    "origin": "${Origin}",
+    "origin_url": "${OriginURL}",
+    "type": "Code",
+    "summary": "${Summary}",
+    "canonical_tags": [
+        "Gem"
+    ],
+    "user_tags": [
+        "${UserTags}"
+    ],
+    "platforms": [
+        "${Platforms}"
+    ],
+    "icon_path": "${IconPath}",
+    "requirements": "${Requirements}",
+    "documentation_url": "${DocumentationURL}",
+    "dependencies": [
+        "Atom_RPI",
+        "Atom"
+    ],
+    "repo_uri": "${RepoURI}",
+    "compatible_engines": [
+    ],
+    "engine_api_dependencies":[
+    ]
+}

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

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:248e3ffe1fc9ffc02afb2ba8914e222a5a5d13ac45a48b98c95ee062e959a94c
+size 4475

+ 285 - 0
Templates/GraphicsGem/template.json

@@ -0,0 +1,285 @@
+{
+    "template_name": "GraphicsGem",
+    "template_restricted_platform_relative_path": "Templates/GraphicsGem",
+    "restricted_name": "o3de",
+    "restricted_platform_relative_path": "Templates/GraphicsGem",
+    "license": "Apache-2.0 or MIT",
+    "license_url": "https://github.com/o3de/o3de/blob/development/LICENSE.txt",
+    "display_name": "Graphics Gem Template",
+    "summary": "This is a gem template that has Atom rendering support",
+    "canonical_tags": [
+        "Template",
+        "Gem"
+    ],
+    "user_tags": [
+        "Rendering",
+        "Graphics",
+        "Atom"
+    ],
+    "icon_path": "preview.png",
+    "copyFiles": [
+        {
+            "file": ".gitignore",
+            "isTemplated": false
+        },
+        {
+            "file": "CMakeLists.txt",
+            "isTemplated": true
+        },
+        {
+            "file": "gem.json",
+            "isTemplated": true
+        },
+        {
+            "file": "preview.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Code/CMakeLists.txt",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_editor_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_editor_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_editor_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_editor_tests_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/${NameLower}_tests_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Include/${Name}/${Name}Bus.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Include/${Name}/${Name}FeatureProcessorInterface.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Include/${Name}/${Name}FeatureProcessorInterface.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Include/${Name}/${Name}TypeIds.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/${Name}ModuleInterface.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/${Name}ModuleInterface.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Android/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Android/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Android/${NameLower}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Android/PAL_android.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/iOS/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/iOS/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/iOS/${NameLower}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/iOS/PAL_ios.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Linux/${NameLower}_editor_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Linux/PAL_linux.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_editor_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Mac/${NameLower}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Mac/PAL_mac.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_private_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_editor_api_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Windows/${NameLower}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Platform/Windows/PAL_windows.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Clients/${Name}Module.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Clients/${Name}SystemComponent.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Clients/${Name}SystemComponent.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Components/${Name}Component.h",
+            "isTemplated": true
+        },        
+        {
+            "file": "Code/Source/Components/${Name}Component.cpp",
+            "isTemplated": true
+        },        
+        {
+            "file": "Code/Source/Components/${Name}ComponentController.h",
+            "isTemplated": true
+        },        
+        {
+            "file": "Code/Source/Components/${Name}ComponentController.cpp",
+            "isTemplated": true
+        },        
+        {
+            "file": "Code/Source/Tools/Components/Editor${Name}Component.h",
+            "isTemplated": true
+        },        
+        {
+            "file": "Code/Source/Tools/Components/Editor${Name}Component.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Render/${Name}FeatureProcessor.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Render/${Name}FeatureProcessor.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Tools/${Name}EditorModule.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Tools/${Name}EditorSystemComponent.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Code/Source/Tools/${Name}EditorSystemComponent.h",
+            "isTemplated": true
+        }
+    ],
+    "createDirectories": [
+        {
+            "dir": "Assets"
+        },
+        {
+            "dir": "Code"
+        },
+        {
+            "dir": "Code/Include"
+        },
+        {
+            "dir": "Code/Include/${Name}"
+        },
+        {
+            "dir": "Code/Platform"
+        },
+        {
+            "dir": "Code/Platform/Android"
+        },
+        {
+            "dir": "Code/Platform/Linux"
+        },
+        {
+            "dir": "Code/Platform/Mac"
+        },
+        {
+            "dir": "Code/Platform/Windows"
+        },
+        {
+            "dir": "Code/Platform/iOS"
+        },
+        {
+            "dir": "Code/Source"
+        },
+        {
+            "dir": "Registry"
+        }
+    ]
+}
+