Parcourir la source

StudioTools core (dccsi) and WingPro Gem

Signed-off-by: Jonny Galloway <[email protected]>
Jonny Galloway il y a 2 ans
Parent
commit
56c1ee6b16
100 fichiers modifiés avec 3758 ajouts et 0 suppressions
  1. 0 0
      Gems/IDE/PyCharm/README.md
  2. 0 0
      Gems/IDE/VScode/README.md
  3. 1 0
      Gems/IDE/WingPro/.gitignore
  4. 15 0
      Gems/IDE/WingPro/CHANGELOG.md
  5. 18 0
      Gems/IDE/WingPro/CMakeLists.txt
  6. 96 0
      Gems/IDE/WingPro/Code/CMakeLists.txt
  7. 31 0
      Gems/IDE/WingPro/Code/Include/wingpro/wingproBus.h
  8. 4 0
      Gems/IDE/WingPro/Code/Platform/Linux/PAL_linux.cmake
  9. 3 0
      Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_api_files.cmake
  10. 8 0
      Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_private_files.cmake
  11. 8 0
      Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_shared_files.cmake
  12. 4 0
      Gems/IDE/WingPro/Code/Platform/Mac/PAL_mac.cmake
  13. 3 0
      Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_api_files.cmake
  14. 8 0
      Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_private_files.cmake
  15. 8 0
      Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_shared_files.cmake
  16. 4 0
      Gems/IDE/WingPro/Code/Platform/Windows/PAL_windows.cmake
  17. 3 0
      Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_api_files.cmake
  18. 8 0
      Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_private_files.cmake
  19. 8 0
      Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_shared_files.cmake
  20. 1 0
      Gems/IDE/WingPro/Code/Source/Tools/toolbar_icon.svg
  21. 5 0
      Gems/IDE/WingPro/Code/Source/Tools/wingpro.qrc
  22. 50 0
      Gems/IDE/WingPro/Code/Source/Tools/wingproEditorModule.cpp
  23. 59 0
      Gems/IDE/WingPro/Code/Source/Tools/wingproEditorSystemComponent.cpp
  24. 31 0
      Gems/IDE/WingPro/Code/Source/Tools/wingproEditorSystemComponent.h
  25. 27 0
      Gems/IDE/WingPro/Code/Source/wingproModuleInterface.h
  26. 4 0
      Gems/IDE/WingPro/Code/Tests/Tools/wingproEditorTest.cpp
  27. 5 0
      Gems/IDE/WingPro/Code/wingpro_editor_api_files.cmake
  28. 7 0
      Gems/IDE/WingPro/Code/wingpro_editor_private_files.cmake
  29. 4 0
      Gems/IDE/WingPro/Code/wingpro_editor_shared_files.cmake
  30. 4 0
      Gems/IDE/WingPro/Code/wingpro_editor_tests_files.cmake
  31. 9 0
      Gems/IDE/WingPro/Editor/Scripts/__init__.py
  32. 22 0
      Gems/IDE/WingPro/Editor/Scripts/bootstrap.py
  33. 44 0
      Gems/IDE/WingPro/Editor/Scripts/wingpro_dialog.py
  34. 418 0
      Gems/IDE/WingPro/README.md
  35. 18 0
      Gems/IDE/WingPro/Registry/assetprocessor_settings.setreg
  36. 2 0
      Gems/IDE/WingPro/Tools/.solutions/.gitignore
  37. 13 0
      Gems/IDE/WingPro/Tools/.solutions/DCCsi_8x.wpr
  38. 46 0
      Gems/IDE/WingPro/Tools/Env/Win/Dev.bat
  39. 79 0
      Gems/IDE/WingPro/Tools/Env/Win/Dev.bat.example
  40. 78 0
      Gems/IDE/WingPro/Tools/Env/Win/Wing.bat
  41. 149 0
      Gems/IDE/WingPro/Tools/win_launch_wingide.bat
  42. 31 0
      Gems/IDE/WingPro/gem.json
  43. 3 0
      Gems/IDE/WingPro/preview.png
  44. 168 0
      Gems/IDE/WingPro/wingpro/__init__.py
  45. 223 0
      Gems/IDE/WingPro/wingpro/config.py
  46. 79 0
      Gems/IDE/WingPro/wingpro/constants.py
  47. 83 0
      Gems/IDE/WingPro/wingpro/discovery.py
  48. 15 0
      Gems/IDE/WingPro/wingpro/settings.json
  49. 259 0
      Gems/IDE/WingPro/wingpro/start.py
  50. 12 0
      Gems/O3DE/StudioTools/.gitignore
  51. 15 0
      Gems/O3DE/StudioTools/CHANGELOG.md
  52. 18 0
      Gems/O3DE/StudioTools/CMakeLists.txt
  53. 96 0
      Gems/O3DE/StudioTools/Code/CMakeLists.txt
  54. 31 0
      Gems/O3DE/StudioTools/Code/Include/StudioTools/StudioToolsBus.h
  55. 4 0
      Gems/O3DE/StudioTools/Code/Platform/Linux/PAL_linux.cmake
  56. 3 0
      Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_api_files.cmake
  57. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_private_files.cmake
  58. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_shared_files.cmake
  59. 4 0
      Gems/O3DE/StudioTools/Code/Platform/Mac/PAL_mac.cmake
  60. 3 0
      Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_api_files.cmake
  61. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_private_files.cmake
  62. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_shared_files.cmake
  63. 4 0
      Gems/O3DE/StudioTools/Code/Platform/Windows/PAL_windows.cmake
  64. 3 0
      Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_api_files.cmake
  65. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_private_files.cmake
  66. 8 0
      Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_shared_files.cmake
  67. 27 0
      Gems/O3DE/StudioTools/Code/Source/StudioToolsModuleInterface.h
  68. 5 0
      Gems/O3DE/StudioTools/Code/Source/Tools/StudioTools.qrc
  69. 50 0
      Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorModule.cpp
  70. 59 0
      Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorSystemComponent.cpp
  71. 31 0
      Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorSystemComponent.h
  72. 1 0
      Gems/O3DE/StudioTools/Code/Source/Tools/toolbar_icon.svg
  73. 4 0
      Gems/O3DE/StudioTools/Code/Tests/Tools/StudioToolsEditorTest.cpp
  74. 5 0
      Gems/O3DE/StudioTools/Code/studiotools_editor_api_files.cmake
  75. 7 0
      Gems/O3DE/StudioTools/Code/studiotools_editor_private_files.cmake
  76. 4 0
      Gems/O3DE/StudioTools/Code/studiotools_editor_shared_files.cmake
  77. 4 0
      Gems/O3DE/StudioTools/Code/studiotools_editor_tests_files.cmake
  78. 24 0
      Gems/O3DE/StudioTools/Configs/settings.json
  79. 10 0
      Gems/O3DE/StudioTools/Configs/settings.local.json.example
  80. 9 0
      Gems/O3DE/StudioTools/Editor/Scripts/__init__.py
  81. 22 0
      Gems/O3DE/StudioTools/Editor/Scripts/bootstrap.py
  82. 44 0
      Gems/O3DE/StudioTools/Editor/Scripts/studiotools_dialog.py
  83. 18 0
      Gems/O3DE/StudioTools/Registry/assetprocessor_settings.setreg
  84. 2 0
      Gems/O3DE/StudioTools/Tools/Env/Win/.gitignore
  85. 73 0
      Gems/O3DE/StudioTools/Tools/Env/Win/Dev.bat
  86. 74 0
      Gems/O3DE/StudioTools/Tools/Env/Win/Dev.bat.example
  87. 79 0
      Gems/O3DE/StudioTools/Tools/Env/Win/Launch_O3DE_PY.bat
  88. 81 0
      Gems/O3DE/StudioTools/Tools/Env/Win/Launch_O3DE_PY_Cmd.bat
  89. 154 0
      Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Core.bat
  90. 93 0
      Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Python.bat
  91. 58 0
      Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Qt.bat
  92. 141 0
      Gems/O3DE/StudioTools/Tools/Env/Win/readme.md
  93. 78 0
      Gems/O3DE/StudioTools/Tools/dccsi.cmd
  94. 99 0
      Gems/O3DE/StudioTools/Tools/python.cmd
  95. 35 0
      Gems/O3DE/StudioTools/Tools/python.sh
  96. 13 0
      Gems/O3DE/StudioTools/Tools/return_sys_version_major.py
  97. 13 0
      Gems/O3DE/StudioTools/Tools/return_sys_version_minor.py
  98. 1 0
      Gems/O3DE/StudioTools/dccsi/__init__.py
  99. 30 0
      Gems/O3DE/StudioTools/gem.json
  100. 3 0
      Gems/O3DE/StudioTools/preview.png

+ 0 - 0
Gems/IDE/stub → Gems/IDE/PyCharm/README.md


+ 0 - 0
Gems/O3DE/stub → Gems/IDE/VScode/README.md


+ 1 - 0
Gems/IDE/WingPro/.gitignore

@@ -0,0 +1 @@
+wingdbstub.py

+ 15 - 0
Gems/IDE/WingPro/CHANGELOG.md

@@ -0,0 +1,15 @@
+# Changelog
+
+All notable changes to this O3DE WingPro Gem will be documented in this file.
+
+## [0.0.0] - 2023-01-19
+
+### Added:
+
+- Gem scaffold
+
+- CHANGELOG.md
+
+### Changed:
+
+- CHANGELOG.md

+ 18 - 0
Gems/IDE/WingPro/CMakeLists.txt

@@ -0,0 +1,18 @@
+
+# Query the gem name from the gem.json file if possible
+# otherwise fallback to using wingpro
+o3de_find_ancestor_gem_root(gempath gem_name "${CMAKE_CURRENT_SOURCE_DIR}")
+if (NOT gem_name)
+    set(gem_name "wingpro")
+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} o3de_gem_restricted_path)
+
+add_subdirectory(Code)

+ 96 - 0
Gems/IDE/WingPro/Code/CMakeLists.txt

@@ -0,0 +1,96 @@
+
+# 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/wingpro/Code/Platform/<platorm_name>  or
+#            <restricted_folder>/<platform_name>/Gems/wingpro/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)
+
+
+# If we are on a host platform, we want to add the host tools targets like the ${gem_name}.Editor target which
+# will also depend on ${gem_name}.Editor.API 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
+            wingpro_editor_api_files.cmake
+            ${pal_dir}/wingpro_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
+        AUTORCC
+        FILES_CMAKE
+            wingpro_editor_private_files.cmake
+        TARGET_PROPERTIES
+            O3DE_PRIVATE_TARGET TRUE
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Include
+                Source
+        BUILD_DEPENDENCIES
+            PUBLIC
+                AZ::AzToolsFramework
+    )
+
+    ly_add_target(
+        NAME ${gem_name}.Editor GEM_MODULE
+        NAMESPACE Gem
+        AUTOMOC
+        FILES_CMAKE
+            wingpro_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
+        RUNTIME_DEPENDENCIES
+            Gem::QtForPython.Editor
+    )
+
+    # 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}.Editor.Tests
+
+    # If we are a host platform we want to add tools test like editor tests here
+    if(PAL_TRAIT_BUILD_HOST_TOOLS)
+    endif()
+endif()

+ 31 - 0
Gems/IDE/WingPro/Code/Include/wingpro/wingproBus.h

@@ -0,0 +1,31 @@
+
+#pragma once
+
+#include <AzCore/EBus/EBus.h>
+#include <AzCore/Interface/Interface.h>
+
+namespace wingpro
+{
+    class wingproRequests
+    {
+    public:
+        AZ_RTTI(wingproRequests, "{89A445E9-5FBB-4508-8FB2-1062FDF24B22}");
+        virtual ~wingproRequests() = default;
+        // Put your public methods here
+    };
+    
+    class wingproBusTraits
+        : public AZ::EBusTraits
+    {
+    public:
+        //////////////////////////////////////////////////////////////////////////
+        // EBusTraits overrides
+        static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+        //////////////////////////////////////////////////////////////////////////
+    };
+
+    using wingproRequestBus = AZ::EBus<wingproRequests, wingproBusTraits>;
+    using wingproInterface = AZ::Interface<wingproRequests>;
+
+} // namespace wingpro

+ 4 - 0
Gems/IDE/WingPro/Code/Platform/Linux/PAL_linux.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_WINGPRO_SUPPORTED TRUE)
+set(PAL_TRAIT_WINGPRO_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_WINGPRO_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/wingproLinux.cpp
+#      ../Source/Linux/wingproLinux.h
+#      ../Include/Linux/wingproLinux.h
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Linux/wingpro_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/wingproLinux.cpp
+#      ../Source/Linux/wingproLinux.h
+#      ../Include/Linux/wingproLinux.h
+
+set(FILES
+)

+ 4 - 0
Gems/IDE/WingPro/Code/Platform/Mac/PAL_mac.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_WINGPRO_SUPPORTED TRUE)
+set(PAL_TRAIT_WINGPRO_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_WINGPRO_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/wingproMac.cpp
+#      ../Source/Mac/wingproMac.h
+#      ../Include/Mac/wingproMac.h
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Mac/wingpro_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/wingproMac.cpp
+#      ../Source/Mac/wingproMac.h
+#      ../Include/Mac/wingproMac.h
+
+set(FILES
+)

+ 4 - 0
Gems/IDE/WingPro/Code/Platform/Windows/PAL_windows.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_WINGPRO_SUPPORTED TRUE)
+set(PAL_TRAIT_WINGPRO_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_WINGPRO_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/wingproWindows.cpp
+#      ../Source/Windows/wingproWindows.h
+#      ../Include/Windows/wingproWindows.h
+
+set(FILES
+)

+ 8 - 0
Gems/IDE/WingPro/Code/Platform/Windows/wingpro_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/wingproWindows.cpp
+#      ../Source/Windows/wingproWindows.h
+#      ../Include/Windows/wingproWindows.h
+
+set(FILES
+)

+ 1 - 0
Gems/IDE/WingPro/Code/Source/Tools/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>

+ 5 - 0
Gems/IDE/WingPro/Code/Source/Tools/wingpro.qrc

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

+ 50 - 0
Gems/IDE/WingPro/Code/Source/Tools/wingproEditorModule.cpp

@@ -0,0 +1,50 @@
+
+#include <wingproModuleInterface.h>
+#include "wingproEditorSystemComponent.h"
+#include <AzToolsFramework/API/PythonLoader.h>
+
+#include <QtGlobal>
+
+void InitwingproResources()
+{
+    // We must register our Qt resources (.qrc file) since this is being loaded from a separate module (gem)
+    Q_INIT_RESOURCE(wingpro);
+}
+
+namespace wingpro
+{
+    class wingproEditorModule
+        : public wingproModuleInterface
+        , public AzToolsFramework::EmbeddedPython::PythonLoader
+    {
+    public:
+        AZ_RTTI(wingproEditorModule, "{1D8ED570-EAC6-4E09-A8F6-6DC3EA9DD334}", wingproModuleInterface);
+        AZ_CLASS_ALLOCATOR(wingproEditorModule, AZ::SystemAllocator, 0);
+
+        wingproEditorModule()
+        {
+            InitwingproResources();
+
+            // 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(), {
+                wingproEditorSystemComponent::CreateDescriptor(),
+            });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         * Non-SystemComponents should not be added here
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList {
+                azrtti_typeid<wingproEditorSystemComponent>(),
+            };
+        }
+    };
+}// namespace wingpro
+
+AZ_DECLARE_MODULE_CLASS(Gem_wingpro, wingpro::wingproEditorModule)

+ 59 - 0
Gems/IDE/WingPro/Code/Source/Tools/wingproEditorSystemComponent.cpp

@@ -0,0 +1,59 @@
+
+#include <AzCore/Serialization/SerializeContext.h>
+#include "wingproEditorSystemComponent.h"
+
+namespace wingpro
+{
+    void wingproEditorSystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<wingproEditorSystemComponent, AZ::Component>();
+        }
+    }
+
+    wingproEditorSystemComponent::wingproEditorSystemComponent()
+    {
+        if (wingproInterface::Get() == nullptr)
+        {
+            wingproInterface::Register(this);
+        }
+    }
+
+    wingproEditorSystemComponent::~wingproEditorSystemComponent()
+    {
+        if (wingproInterface::Get() == this)
+        {
+            wingproInterface::Unregister(this);
+        }
+    }
+
+    void wingproEditorSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC_CE("wingproEditorService"));
+    }
+
+    void wingproEditorSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC_CE("wingproEditorService"));
+    }
+
+    void wingproEditorSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+    }
+
+    void wingproEditorSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+    }
+
+    void wingproEditorSystemComponent::Activate()
+    {
+        wingproRequestBus::Handler::BusConnect();
+    }
+
+    void wingproEditorSystemComponent::Deactivate()
+    {
+        wingproRequestBus::Handler::BusDisconnect();
+    }
+
+} // namespace wingpro

+ 31 - 0
Gems/IDE/WingPro/Code/Source/Tools/wingproEditorSystemComponent.h

@@ -0,0 +1,31 @@
+
+#pragma once
+#include <AzCore/Component/Component.h>
+#include <wingpro/wingproBus.h>
+
+
+namespace wingpro
+{
+    /// System component for wingpro editor
+    class wingproEditorSystemComponent
+        : public wingproRequestBus::Handler
+        , public AZ::Component
+    {
+    public:
+        AZ_COMPONENT(wingproEditorSystemComponent, "{70F38C41-B94A-4127-AB8E-B3B90641F680}");
+        static void Reflect(AZ::ReflectContext* context);
+
+        wingproEditorSystemComponent();
+        ~wingproEditorSystemComponent();
+
+    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();
+        void Deactivate();
+    };
+} // namespace wingpro

+ 27 - 0
Gems/IDE/WingPro/Code/Source/wingproModuleInterface.h

@@ -0,0 +1,27 @@
+
+#include <AzCore/Memory/SystemAllocator.h>
+#include <AzCore/Module/Module.h>
+
+namespace wingpro
+{
+    class wingproModuleInterface
+        : public AZ::Module
+    {
+    public:
+        AZ_RTTI(wingproModuleInterface, "{57BC8700-4497-4053-8496-BD8B563BA1F7}", AZ::Module);
+        AZ_CLASS_ALLOCATOR(wingproModuleInterface, AZ::SystemAllocator, 0);
+
+        wingproModuleInterface()
+        {
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList{
+            };
+        }
+    };
+}// namespace wingpro

+ 4 - 0
Gems/IDE/WingPro/Code/Tests/Tools/wingproEditorTest.cpp

@@ -0,0 +1,4 @@
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 5 - 0
Gems/IDE/WingPro/Code/wingpro_editor_api_files.cmake

@@ -0,0 +1,5 @@
+
+
+set(FILES
+    Include/wingpro/wingproBus.h
+)

+ 7 - 0
Gems/IDE/WingPro/Code/wingpro_editor_private_files.cmake

@@ -0,0 +1,7 @@
+
+set(FILES
+    Source/wingproModuleInterface.h
+    Source/Tools/wingproEditorSystemComponent.cpp
+    Source/Tools/wingproEditorSystemComponent.h
+    Source/Tools/wingpro.qrc
+)

+ 4 - 0
Gems/IDE/WingPro/Code/wingpro_editor_shared_files.cmake

@@ -0,0 +1,4 @@
+
+set(FILES
+    Source/Tools/wingproEditorModule.cpp
+)

+ 4 - 0
Gems/IDE/WingPro/Code/wingpro_editor_tests_files.cmake

@@ -0,0 +1,4 @@
+
+set(FILES
+    Tests/Tools/wingproEditorTest.cpp
+)

+ 9 - 0
Gems/IDE/WingPro/Editor/Scripts/__init__.py

@@ -0,0 +1,9 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+
+__ALL__ = ['bootstrap','wingpro_dialog']

+ 22 - 0
Gems/IDE/WingPro/Editor/Scripts/bootstrap.py

@@ -0,0 +1,22 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+"""wingpro\\editor\\scripts\\boostrap.py
+Generated from O3DE PythonToolGem Template"""
+
+import az_qt_helpers
+import azlmbr.editor as editor
+from wingpro_dialog import wingproDialog
+
+if __name__ == "__main__":
+    print("wingpro.boostrap, Generated from O3DE PythonToolGem Template")
+
+    # Register our custom widget as a dockable tool with the Editor under an Examples sub-menu
+    options = editor.ViewPaneOptions()
+    options.showOnToolsToolbar = True
+    options.toolbarIcon = ":/wingpro/toolbar_icon.svg"
+    az_qt_helpers.register_view_pane('wingpro', wingproDialog, category="Examples", options=options)

+ 44 - 0
Gems/IDE/WingPro/Editor/Scripts/wingpro_dialog.py

@@ -0,0 +1,44 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+"""wingpro\\editor\\scripts\\wingpro_dialog.py
+Generated from O3DE PythonToolGem Template"""
+
+from PySide2.QtCore import Qt
+from PySide2.QtWidgets import QDialog, QLabel, QVBoxLayout
+
+class wingproDialog(QDialog):
+    def __init__(self, parent=None):
+        super(wingproDialog, self).__init__(parent)
+
+        self.mainLayout = QVBoxLayout(self)
+
+        self.introLabel = QLabel("Put your cool stuff here!")
+
+        self.mainLayout.addWidget(self.introLabel, 0, Qt.AlignCenter)
+
+        self.helpText = str("For help getting started,"
+            "visit the <a href=\"https://o3de.org/docs/tools-ui/\">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")
+
+        self.helpLabel = QLabel()
+        self.helpLabel.setTextFormat(Qt.RichText)
+        self.helpLabel.setText(self.helpText)
+        self.helpLabel.setOpenExternalLinks(True)
+
+        self.mainLayout.addWidget(self.helpLabel, 0, Qt.AlignCenter)
+
+        self.setLayout(self.mainLayout)
+
+
+if __name__ == "__main__":
+    # Create a new instance of the tool if launched from the Python Scripts window,
+    # which allows for quick iteration without having to close/re-launch the Editor
+    test_dialog = wingproDialog()
+    test_dialog.setWindowTitle("wingpro")
+    test_dialog.show()
+    test_dialog.adjustSize()

+ 418 - 0
Gems/IDE/WingPro/README.md

@@ -0,0 +1,418 @@
+# O3DE DCCsi, Wing Pro IDE
+
+[Wing Pro](https://wingware.com/) is a Python IDE that can be used to develop, test, and debug Python code written for [Open 3D Engine (O3DE)](https://www.o3de.org/), an open source realtime3D engine, for video games and other uses cases.  Each IDE is different.  Wing is a popular IDE for many Technical Artists (TAs) because it's relatively easy to set up and works great with DCC apps like Maya with less configuration.  It is also pretty powerful and you can do a lot of data-driven configuration with it (which we will be covering some of.)  We aren't picking an IDE for you, that's a personal choice, we are just showing you how one like Wing can be set up to provide a better out-of-box developer experience (so that you don't have to do the setup and configuration yourself.)  In fact, we intend to do the same for other IDS like PyCharm and VScode (and maybe others in the future, join the o3de discord tech-art channel [come help us build the tooling foundation.](https://discord.com/channels/805939474655346758/842110573625081876))
+
+# Status: Prototype
+
+**Version**: 0.0.1
+
+**Support**: <u>Wing Pro 8+</u>, currently Windows only (other versions not tested but may work)
+
+## Getting Started
+
+1. If you do not already have Wing Pro installed, [download it now](https://wingware.com/downloads/wingpro).
+
+2. To get started using Wing as your Python IDE, please refer to the tutorial in Wing's Help menu or read the [Quickstart Guide](https://wingware.com/doc/howtos/quickstart).
+
+3. Setting up WingPro for working with O3DE, is pretty similar to using it with a Digital Content Creation tool (DCC).  Related Links: [Using Wing with Autodesk Maya](https://wingware.com/doc/howtos/maya)
+
+4. < to do configuration >
+
+5. < to do start service script >
+
+## Gem Structure
+
+This is an outline of the contents of this Gems folder structure
+
+| Folders / Files              | Description                                                                                                                                                                                 |
+| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `Assets`                     | An O3DE assets folder, if this Gem is enabled in a project, the assets in this folder will be available for use. When an assets folder is in a Gem like this, it's usually local test data. |
+| `Code`                       | O3DE boiler plate, used when Gem is included in a build, and ensures the Gem is loaded and scanned with the Editor starts.                                                                  |
+| `Editor`                     | Root folder for the Editor to scan for scripts (python)                                                                                                                                     |
+| Editor/Scripts/bootstrap.py  | The O3DE python entry-point for this Gem. This script is found and executed when the Editor starts.                                                                                         |
+| `Registry`                   | O3DE settings files (.setreg)                                                                                                                                                               |
+| `Tools`                      | A location for tooling files, for devs working with this Gem.                                                                                                                               |
+| Tools/Env/Win                | A data-driven .bat file based environment for Wing configuration (envars) to launch externally from CMD                                                                                     |
+| Tools/Env/Win/Dev.bat        | Deverloper envars                                                                                                                                                                           |
+| Tools/win_launch_wingide.bat | Starts wing from CMD using Env                                                                                                                                                              |
+| `wingpro`                    | python api package <br /> `import dccsi.ide.wingpro`                                                                                                                                        |
+| wingpro/config.py            | Dynaconf based configuration for this package                                                                                                                                               |
+| wingpro/settings.json        | Dynaconf default settings                                                                                                                                                                   |
+| wingpro/settings.local.json  | Dynaconf local developer settings                                                                                                                                                           |
+
+### Latest Features:
+
+- The latest version of Wing Pro 8 (8.3.3.1) is recommended, as there was a bug in the initial release that prevented Launch Configurations bound to a ENVAR to function properly (as described in this readme), which has been fixed. Wing Pro 9 likely works as well, you may just have to make slight adjustments to the configuration (covered in this document below)
+
+- The WingPro Gem can be added to your game project. See [Registering Gems to a Project](https://www.o3de.org/docs/user-guide/project-config/register-gems/), and [Adding and Removing Gems in a Project](https://www.o3de.org/docs/user-guide/project-config/add-remove-gems/) which you can do through the Project Manager (o3de.exe) With the WingPro Gem enabled, you can launch Wing Pro 8 via menus in the main Editor (and utilize any integration enhancements built with the wing api.)
+
+- The WingPro Gem has a dependency on the core StudioTools Gem
+
+- Some additional testing and improvements have been made and are in the in the current release (2210), including changes to better support Installer build folder patterns. See the [readme.md at the root of the DCCsi](https://github.com/o3de/o3de/blob/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/readme.md) for more information about advanced configuration.
+
+### Using with StudioTools
+
+The [DccScriptingInterface Gem](https://github.com/o3de/o3de/blob/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/readme.md) DCCsi includes some support for various DCC tools like Blender or Maya, as well as popular IDEs that Technical Artists use in development.  Using Wing Pro via the DCCsi is recommended as it streamlines some configuration, but it is not a hard requirement.
+
+![image](https://user-images.githubusercontent.com/23222931/201754413-fb78891c-9f42-4972-bf2c-e7db34120777.png)
+
+1. Enable the [DccScriptingInterface Gem](https://github.com/o3de/o3de/blob/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/readme.md) in your game project, using either the [O3DE Project Manager](https://www.o3de.org/docs/user-guide/project-config/project-manager/) or the o3de.py [commandline tools](https://www.o3de.org/docs/user-guide/project-config/add-remove-gems/)
+
+2. After adding a Gem, you should [configure and rebuild your project](https://www.o3de.org/docs/user-guide/build/configure-and-build/))
+
+3. You should now be able to utilize wing, here are several ways to start wing
+   
+   1. O3DE Editor > Menubar > StudioTools > IDE > Wing
+   
+   2. Using a .bat file: "DccScriptingInterface\Tools\IDE\Wing\win_launch_wingide.bat"
+   
+   3. From the commandline (seen below)
+
+To get started, you can launch Wing from a Win CMD prompt, first make sure your engine is initialized (if you are using an installer build, it already should be.)  If you are building from source, make sure Python is initialized before using Wing.
+
+```shell
+# First, ensure that your engine build has O3DE Python setup!
+> cd C:\path\to\o3de\
+> .\get_python.bat
+
+# change to the dccsi root
+cd C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface
+# python.cmd in this folder, wraps o3de python
+> .\python.cmd Tools\IDE\Wing\start.py
+```
+
+Note: You will also want to set up Wing for use as a external debugger (see the next Debugging section below)
+
+# Debugging
+
+When debugging Python code running under O3DE, the debug process is initiated from outside of Wing, and must connect to the IDE. This is done with wingdbstub according to the detailed instructions in the [Debugging Externally Launched Code](https://wingware.com/doc/debug/debugging-externally-launched-code) section of the manual.
+
+### wingstub.py (for debugging)
+
+This is necessary for attaching Wing as the debugger in scripts that are running
+
+1. Locate the DCCsi gem folder (see above)
+
+2. Locate your Wing IDE install, the default location is somewhere like:6
+   
+   1. `C:\Program Files (x86)\Wing Pro 8`
+   
+   2. Locate: `C:\Program Files (x86)\Wing Pro 8\wingdbstub.py`
+
+3. Copy the file `wingdbstub.py`
+
+4. It needs to be copied somewhere on the `PYTHONPATH`, for instance you could copy it here: `DccScriptingInterface\Tools\IDE\Wing\wingdbstub.py`
+
+5. Open the `wingdbstub.py` file in a text editor and modify line 96 to
+   
+   1. **kEmbedded = 1**
+
+6. After starting Wing, click on the bug icon in lower left of Wing's window and make sure that Accept Debug Connections is checked.
+   ![image](https://user-images.githubusercontent.com/23222931/201769216-91b95f69-868f-477b-b75d-f71b3dd7d98e.png)
+
+7. You can put the following code into a script you'd like to debug during execution
+
+```python
+import wingdbstub
+wingdbstub.Ensure()
+```
+
+#### HELP
+
+Trouble attaching debugger?  Open your firewall and add an exception for wing.
+
+- In Windows 10:  
+  - Win + S and search for **Windows Defender Firewall**
+  - Select **Allow an app or feature through Windows Defender Firewall**
+- In the allowed apps window:
+  - Verify there isn't already an entry for Wing by scrolling through
+  - Click on **Change Settings**
+  - Then click on **Allow another app...**
+- In the Add an app window:
+  - click on **Browse...** and point it to your wing executable
+    - `C:\Program Files (x86)\Wing Pro 8\bin\wing.exe`
+  - click on **Add**
+
+#### Notes:
+
+- Similar setup documentation for a DCC can be found here, [Using Wing with Autodesk Maya (link)](https://wingware.com/doc/howtos/maya)
+
+- If you install a new version of Wing, you should check the new version to see if the `wingdbstub.py` file has changed (use a diff tool?); if it has do the steps above again.
+
+- For debugging to work, on windows you likely will need to add the wing executable to **Windows Defender Firewall**. When you start wing for the first time it may prompt you to do this, otherwise may need to do it manually (see **HELP** below)
+
+# Detailed Overview
+
+O3DE has a Gem called the DccScriptingInterface (DCCsi) that helps user manage the usage of many popular Digital Content Creation tools (DCC) such as 3D modeling tools like Blender (and others.)
+
+Most modern DCC tools come with a Python interpreter and APIs to customize and extend the editor experience.  Likewise, O3DE has a Python Interpreter and APIs for automation.  Many professional game studios use this to create custom tools, workflows, pipelines and automation for content creation.  Technical Artists (TAs) often are the discipline doing this type of development work, and utilize Python to do so, but may not be as fluent in developer tools as a C++ engineer; thus there is an importance on having good development environments.  
+
+The DCCsi integrations are workflow integrations with the intent to provide an improved ease-of-use experience when these tools are used to author source content for O3DE.  The same can be said for IDEs and custom tooling. These novice to intermediate TAs that want to just jump in and start creating, but don't know how to get started, are the target audience for this integration... the goal is to get you up and running with minimal set up.
+
+The DCCsi helps with aspects such as, configuration and settings, launching DCC tools, and IDEs, and bootstrapping them with O3DE extensions (generally python scripts using the DCC tools APIs to automate tasks)
+
+#### Launch Configurations
+
+Many IDEs such as Wing allow you to configure one or more launch configurations, each configuration can be used to define an interpretter as well as other aspects such as a environment or additional commands.  With the DCCsi, we can use these to define each DCC applications python, so we can test code by running it in that iterpretter.  These are defined in a data-driven way by an EVAR in the launch environment. The ENVAR is set to a path string of the interpretter location:
+
+The project default is currently configured like this inside of wing:
+
+- `${O3DE_DEV}` = '${O3DE_DEV}\python\runtime\python-3.10.5-rev1-windows\python\python.exe'
+
+You can inspect the project default settings:
+
+`Wing > menubar > Project > Project properties ...`
+
+![image](https://user-images.githubusercontent.com/23222931/201771477-ba8c5ca1-b1b4-4cf3-885e-b142d60513b0.png)
+
+After starting Wing using the DCCsi project, you can inspect which Launch Configurations have been defined with the following menu:
+
+`Wing > menubar > Project > Launch Configurations`
+
+![image](https://user-images.githubusercontent.com/23222931/201770286-ad988b4b-ecde-451c-8379-93938c4b055c.png)
+
+- Supports O3DE Python as Launch Configuration:
+  
+  - `${DCCSI_PY_BASE}`
+
+- Supports Blender Python as a Launch Configuration:
+  
+  - `${DCCSI_PY_BLENDER}`
+
+- Supports MayaPy as a Launch Configuration:
+  
+  - `${DCCSI_PY_MAYA}`
+
+- Supports Substance3D Designer Python as a Launch Configuration:
+  
+  - `${DCCSI_PY_SUBSTANCE}`
+
+You can change the current Launch environment a couple of differenty ways:
+
+1. Globally, access the 'Launch Configuations' via the following menu:
+   
+   - `Wing > Python Shell (tab) > options > Use Environment > (select a launch environment)`
+
+2. On Script Executtion:
+   
+   - press the green Start button in the upper-right of the main toolbar ![image](https://user-images.githubusercontent.com/23222931/201775116-1030cf5b-9749-464e-9595-fbe7c09839cd.png)
+   - or the F5 button
+   - In the dialog box:
+     - set the primary pull down to `Use Selected Launch Configuration`
+     - set the second pulldown to the interpretter you'd like to run
+
+![image](https://user-images.githubusercontent.com/23222931/201775372-861a36e7-66c5-4b22-80e1-7b764c68d6c8.png)
+
+# Additional Information
+
+To use Wing, there may be things you need to do locally to get set up (and we may automate some of these steps in the future.)  
+
+## What to know ...
+
+The default location for the DCCsi Gem folder is something like:
+
+`C:/path/to/o3de/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface`
+
+But you are reading this, so you have already found it :)
+
+### General ...
+
+There are many ways to work with O3DE, especially as a developer. Here are some things to be aware of...
+
+- What type of user are you?  Are you a C++ engine developer, a Technical Artist (TA) working in source, or a TA on a game team using a pre-built engine; or a end user that is a novice with little python experience?
+
+- O3DE has it's own python interpreter, the python version and/or location could change as upgrades happen. We may want to use this O3DE python as the IDE interpreter when running our code (likewise we may want to use a compatible  DCC tools interpreter); and this is one reason why the env is data-driven and configurable.)
+  
+  - O3DE python is in a location such as: `c:\path\to\o3de\python\*`
+
+- O3DE builds it's own Qt dlls (and other binaries), provides it's own access to PySide2, installs python package dependencies during cmake configuration; we need to ensure we are bootstrapping access to these things, so we are developing and testing code with the same interpreter, using the same packages and code access, and operating in an environment similar to the editor! (and there are other ways to operate, like creating a standalone PySide2 gui application. A topic for another time perhaps.)
+
+- We also want to interface with a number of DCC applications, each with their own python interpreters and configuration concerns.  So we might want to use those python.exe's as the IDE interpreter, access their APIs, and manage compatible package dependencies; we might have common shared code running across these tools ... things can get out of hand and rather confusing quickly (this IDE integration attempts to solve some of this nightmare for you.)
+
+- Are you using the O3DE installer? The release, or the nightly? What platform are you on?  All of these decisions have an impact on development as well, and we want to be able to configure our development environments in a way that deals with the differences.
+  
+  - These will have different install locations (and these locations have changed over time as the engine matures.)
+    
+    - Nightly:  `C:\O3DE\0.0.0.0`
+    
+    - Release: `C:\O3DE\22.05.0`
+    
+    - You can customize the install location...
+  
+  - The installer is pre-built, so it has a known folder structure like this:
+    
+    - `C:\O3DE\0.0.0.0\bin\Windows\profile\Default\editor.exe`
+
+- But you might be building from source.  You might have multiple engine repos cloned locally, they may be on different branches.  You can build in an engine-centric way, or a project-centric way, and developers choose their cmake configuration and build folder.  Configuration needs to account for these many options.  This guide is geared towards developers, and developers need to be aware of these things.
+
+- Be aware of your development set up. Here is an example of a location a developer may work with locally on a day-to-day basis. This example would be a developer building from source, working on windows, building the Editor target in profile, with a custom build folder path, and building in an engine-centric way.  This might be common for a developer that does a lot of branch hoping.  If you have multiple test branches, and work with with multiple game projects, you might work this way.
+  
+  - `C:\depot\o3de-dev\build\bin\profile\editor.exe`
+
+- This is not a guide for actually developing python code and tools for the O3DE editor ([that does exist however](https://www.o3de.org/docs/learning-guide/tutorials/extend-the-editor/shape-example-py/)); this guide is focused on how Wing IDE is setup.
+
+- This guide likewise isn't focus very much on DCC tools or their configuration, however it does touch on these topics as they are concerned with Wing, like picking Blender, or MayaPy.exe as your IDE interpreter (aka Launch Configuration)
+
+- This is not an [O3DE build guide](https://www.o3de.org/docs/user-guide/build/configure-and-build/), it assumes you either have built from source (and know where your build folder is!), or that you have a pre-built install (and likewise know where that is located, and have some knowledge of the folder structure.)
+
+### Specifics ...
+
+Location of the DCCsi gem folder:
+
+    `C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface`
+
+In the root of the DCCsi, one of the files will start O3DE python, you can start here for running and testing code outside of an IDE or the Editor:
+
+   ` DccScriptingInterface\python.cmd`
+
+The actual interpreter that runs is somewhere like
+
+    `o3de\python\runtime\python-3.10.5-rev1-windows\python\python.exe`
+
+The folder for Wing developers is here:
+
+    `DccScriptingInterface\Tools\IDE\Wing`
+
+It's this last location we will be most concerned with.
+
+There is also a windows .bat launcher for Wing in this location:    `DccScriptingInterface\Tools\IDE\Wing\win_launch_wingide.bat`
+
+This is an alternative to launching from the editor menu, or using the scripted approach of starting wing from the dccsi cmd:
+
+    `.\python.cmd Tools\IDE\Wing\start.py`
+
+Development is a catch-22, sometimes the script framework is buggy and broken (or simply a change is wip), and you need a reliable fallback for your dev environment.  This is why there are multiple entry-points, with the .bat file as a fallback if other methods do not function correctly.
+
+# Advanced Setup ...
+
+Here are some more detailed set up instructions that hopefully help you better understand how Wing and the DCCsi are setup, and how you could modify or extend the configuration.
+
+## Configure O3DE .bat Env:
+
+This section is for developers who desire to configure and start via the .bat file
+
+    `DccScriptingInterface\Tools\IDE\Wing\win_launch_wingide.bat`
+
+To make sure we can alter the Wing environment, to work with your set up, you will want to locate this file:
+
+    `DccScriptingInterface\Tools\IDE\Wing\Env_Dev.bat.example`
+
+Then you will want to copy it, and rename the copy:
+
+    `DccScriptingInterface\Tools\IDE\Wing\Env_Dev.bat`
+
+What this file provides, is the ability and opportunity to make ENVAR settings and overrides prior to starting WingIDE from the .bat file launcher.  If you have already found that the launcher didn't work for you, this is a section you will want to pay attention to.
+
+These  ENVARs set/override  the default  located in the windows dev env:
+
+`DccScriptingInterface\Tools\Dev\Windows\Env_IDE_Wing.bat`
+
+You may find the following ENVARs useful to set:
+
+The default supported version is Wing 8 Pro, if your IDE is installed in the default location  you should not have to  set anything.  But  if you need  to configure the version and location you can set/override these ENVARs
+
+`set DCCSI_WING_VERSION_MAJOR=8`
+
+`set "WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%"`
+
+and this ENVARwill allow you to launch  with a different  wing  project file then the default
+
+`set "WING_PROJ=%PATH_DCCSIG%\Tools\IDE\Wing\.solutions\DCCsi_%DCCSI_WING_VERSION_MAJOR%x.wpr"`
+
+If you are using a version of Wing 7, these ENVARscan be set
+
+`set DCCSI_WING_VERSION_MAJOR=7`
+`set DCCSI_WING_VERSION_MINOR=2`
+
+`set "WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR%"`
+
+## Configure O3DE Dynamic Python Env
+
+There is a python driven approach to configuration, settings, bootstrapping and launching apps like Wing.  The files we will be most concerned with are:
+
+The primary settings file, which is distributed.  This has default settings defined.
+
+    `DccScriptingInterface\Tools\IDE\Wing\settings.json`
+
+This is a secondary settings file that can be manually made, or generated, for developers.  This file allows a developer to make local overrides to ENVARs and settings, overrides in this file will take precedence over the defaults.
+
+   ` DccScriptingInterface\Tools\IDE\Wing\settings.local.json`
+
+### Config.py and settings.local.json
+
+If you are starting Wing (or other tools) from the Editor menu's, then you may not need to do much configuration.  Because the Editor has a python framework, we can access data via `azlmbr` , and retrieve data such as the engine location (see the [dccsi editor  bootstrap.py]([o3de/bootstrap.py at development · o3de/o3de · GitHub](https://github.com/o3de/o3de/blob/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Editor/Scripts/bootstrap.py)) .)  You'll see paths and associated ENVARs are set such as:
+
+```python
+# base paths
+O3DE_DEV = Path(azlmbr.paths.engroot).resolve()
+PATH_O3DE_BIN = Path(azlmbr.paths.executableFolder).resolve()
+PATH_O3DE_PROJECT = Path(azlmbr.paths.projectroot).resolve()
+```
+
+These are propagated (as ENVARs) into the `Wing\config.py `
+
+There is additional support to start via scripting. This is the same setup that the Editor uses to start the external IDE application. It makes use of a `settings.json` (default settings), and `settings.local.json` (user settings and overrides) within the o3de DCCsi folder for Wing IDE. These are utilized along with the addition of a `config.py` and `start.py` in the folder. This follows the patterns similar to how Blender, or Maya, can be launched from the O3DE menus, or in a scripted manner rather then legacy windows .bat files.
+
+Additionally, if you are developer you may want or need to alter the default configuration, for instance if you are downloading and building from source, then you may not have a standard install path, or you may have a custom cmake build path for binaries - and since the DCCsi, DCC apps, and IDEs such as Wing want to work with engine data, we may need to define where these things are.  You can use the Wing `config.py` to generate a `settings.local.json` file from CLI.
+
+To generate a `settings.local.json` (which you can then modify with overrides to paths and other settings)::
+
+    1. Open a Windows Command Prompt (CMD)
+
+    2. Change directory to:
+
+```batch
+cd C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface
+```
+
+    3. Run the Wing `config.py` script:
+
+```batch
+.\python Tools\IDE\Wing\config.py
+```
+
+You can now open `settings.local.json` in a text editor and make modifications and resave before starting Maya.
+
+There two ways, a windows environment via .bat file, or a start.py script
+
+From .bat file, double-click the following file type to start Maya:`C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Tools\IDE\Wing\win_launch_wingide.bat`
+
+To start from script:
+
+    1. Open a Windows Command Prompt (CMD)
+
+    2. Change directory to:
+
+```batch
+cd C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface
+```
+
+    3. Run the Wing `start.py` script:
+
+```batch
+python Tools\IDE\Wing\start.py
+```
+
+# Revision Info:
+
+- This is the second working Proof of Concept. The first was a windows only .bat file based env and launchers. This new integration replaces that with data-driven configuration and settings, with python scripting to bootstrap and launch. (this provides a path to starting from within the main o3de Editor via a PySide2 menu)
+
+- This iteration is developer focused, such as a Technical Artist. It does not have some of the end-user functionality or creature comforts that you might want or expect, yet.
+
+- This version is only the integration patterns for configuration, settings, launch and bootstrapping. No additional tooling within Wing IDE is implemented yet, however Wing has it's own API and extensibility, so this could be an area for future work.
+
+- Currently only the latest version of Wing Pro 8 has been tested: 8.3.2.0 (rev 9d633cb1c4a7), Release (June 17, 2022).  We expect this and later versions of Wing Pro8 to work fine, inform us and help get it fixed if it doesn't.
+
+- Wing 7.x was previously supported, but it was python2.7 based and we are deprecating support for py2.7, and this includes deprecation of support for apps that are pre-py3 bound.
+
+- Previous versions of Wing may still work, however you will need to configure and/or modify the env yourself. This would also include version such as Wing Community Edition.
+
+- This readme.md is continually updated as changes are made.  Remember, this is experimental and still early, and refactoring to improve the core framework and scaffolding patterns undergo frequent revisions (but will be locked down over time.)
+
+---
+
+###### LICENSE INFO
+
+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

+ 18 - 0
Gems/IDE/WingPro/Registry/assetprocessor_settings.setreg

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

+ 2 - 0
Gems/IDE/WingPro/Tools/.solutions/.gitignore

@@ -0,0 +1,2 @@
+*.wpu
+!*.wpr

+ 13 - 0
Gems/IDE/WingPro/Tools/.solutions/DCCsi_8x.wpr

@@ -0,0 +1,13 @@
+#!wing
+#!version=8.0
+##################################################################
+# Wing project file                                              #
+##################################################################
+[project attributes]
+proj.directory-list = [{'dirloc': loc('../../../../..'),
+                        'excludes': (),
+                        'filter': '*',
+                        'include_hidden': False,
+                        'recursive': True,
+                        'watch_for_changes': True}]
+proj.file-type = 'shared'

+ 46 - 0
Gems/IDE/WingPro/Tools/Env/Win/Dev.bat

@@ -0,0 +1,46 @@
+@echo off
+
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+IF NOT "%DCCSI_WING_ENV_DEV_INIT%"=="1" (
+	echo.
+	echo _____________________________________________________________________
+	echo.
+	echo ~   O3DE StudioTools, WingPro Env Dev ...
+	echo ~   WingPro\Tools\Env\Dev.bat
+	echo _____________________________________________________________________
+	echo.
+)
+
+set DCCSI_GDEBUG=True
+
+set DCCSI_DEV_MODE=False
+
+set DCCSI_GDEBUGGER=WING
+
+:: Default level logger will handle
+:: Override this to control the setting
+:: CRITICAL:50
+:: ERROR:40
+:: WARNING:30
+:: INFO:20
+:: DEBUG:10
+:: NOTSET:0
+set DCCSI_LOGLEVEL=10
+
+set "O3DE_BUILD_FOLDER=Build\bin\profile"
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_WING_ENV_DEV_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 79 - 0
Gems/IDE/WingPro/Tools/Env/Win/Dev.bat.example

@@ -0,0 +1,79 @@
+@echo off
+
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi Env Dev ...
+echo _____________________________________________________________________
+echo.
+echo ~    local env settings
+echo.
+
+:: These are local overrides for developers launching the dev environment
+:: Using the .bat files (for windows)
+
+:: You can make similar overrides that propogate via python, by creating
+:: and editing a settings.local.json file with these values
+
+:: you can generate a cached settings.local.json via running the 
+:: config.py from commandline with the following commands
+:: open a CMD
+> cd C:\path\to\o3de\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface
+> python config.py -arg1=True -arg2=True
+
+:: propogate additional envars into the dev environment
+set O3DE_BUILD_FOO=True
+echo     O3DE_BUILD_FOO = %O3DE_BUILD_FOO%
+
+:: set the location of the engine root
+set O3DE_DEV=C:\depot\o3de-dev
+echo     O3DE_DEV = %O3DE_DEV%
+
+:: if you are a developer and working in an engine-centric way
+:: this will set the folder you build into
+set O3DE_BUILD_FOLDER=build
+echo     O3DE_BUILD_FOLDER = %O3DE_BUILD_FOLDER%
+
+:: build out a path to the build and bin folder
+set PATH_O3DE_BUILD=%O3DE_DEV%\%O3DE_BUILD_FOLDER%
+echo     PATH_O3DE_BUILD = %PATH_O3DE_BUILD%
+
+set PATH_O3DE_BIN=%PATH_O3DE_BUILD%\bin\profile
+echo     PATH_O3DE_BIN = %PATH_O3DE_BIN%
+
+:: or you can just set the bin folder
+:: this is the sdk installer path 
+::set PATH_O3DE_BIN=C:\O3DE\0.0.0.0\bin\Windows\profile\Default
+:echo     PATH_O3DE_BIN = %PATH_O3DE_BIN%
+
+:: enables additional debug behaviour in code
+set DCCSI_GDEBUG=True
+echo     DCCSI_GDEBUG = %DCCSI_GDEBUG%
+
+:: enables additional developer behaviours like auto-attach debugger
+set DCCSI_DEV_MODE=True
+echo     DCCSI_DEV_MODE = %DCCSI_DEV_MODE%
+
+:: enables which debugger to use
+:: currently only wing is supported
+set DCCSI_GDEBUGGER=WING
+echo     DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER%
+
+:: Default level logger will handle
+:: Override this to control the setting
+:: CRITICAL:50
+:: ERROR:40
+:: WARNING:30
+:: INFO:20
+:: DEBUG:10
+:: NOTSET:0
+set DCCSI_LOGLEVEL=10
+echo     DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL%

+ 78 - 0
Gems/IDE/WingPro/Tools/Env/Win/Wing.bat

@@ -0,0 +1,78 @@
+@echo off
+REM 
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Launches Wing IDE and the O3DE DccScriptingInterface Project Files
+:: Status: Prototype
+:: Version: 0.0.1
+:: Support: Wing Pro 8+
+:: Readme.md:  https://github.com/o3de/o3de/tree/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Tools/IDE/WingIDE/readme.md
+:: Notes:
+:: - Wing 7.x was previously supported, but it was python2.7 based and we are deprecating support for py2.7
+:: - py2.7 deprecation includes apps that are pre-py3
+:: - Previous versions may still work, however you will need to configure the env yourself
+:: - Try overriding envars and paths in your Env_Dev.bat
+:: - Wing Pro 8 does not use the version minor in the name of it's folder structure
+
+:: Skip initialization if already completed
+IF "%DCCSI_ENV_WINGIDE_INIT%"=="1" GOTO :END_OF_FILE
+
+:: Store current dir
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+:: WingIDE version Major
+IF "%DCCSI_WING_VERSION_MAJOR%"=="" (set DCCSI_WING_VERSION_MAJOR=8)
+echo     DCCSI_WING_VERSION_MAJOR = %DCCSI_WING_VERSION_MAJOR%
+
+:: Wing Pro 8 does not use the version minor in the name of it's folder structure
+:: Will deprecate these lines in a future iteration
+REM :: WingIDE version Minor
+REM IF "%DCCSI_WING_VERSION_MINOR%"=="" (set DCCSI_WING_VERSION_MINOR=2)
+
+:: Initialize env
+CALL %DCCSI_IDE_WING_TOOLS%\..\..\..\O3DE\StudioTools\Tools\Env\Win\O3DE_Core.bat
+CALL %DCCSI_CORE_ENV%\O3DE_Python.bat
+
+:: This can now only be added late, in the launcher
+:: it conflicts with other Qt apps like Wing Pro 8+
+::CALL %~dp0\Env_O3DE_Qt.bat
+:: this could interfer with standalone python apps/tools/utils that use O3DE Qt
+:: and trying to run them from the IDE
+:: We may have to find a work around in the next iteration?
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE StudioTools, IDE Env WingIDE %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% ...
+echo _____________________________________________________________________
+echo.
+
+:: Wing Pro 8 does not use the version minor in the name of it's folder structure
+:: Will deprecate these lines in a future iteration
+REM IF "%WINGHOME%"=="" (set "WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR%")
+REM IF "%WING_PROJ%"=="" (set "WING_PROJ=%PATH_DCCSIG%\Tools\Dev\Windows\Solutions\.wing\DCCsi_%DCCSI_WING_VERSION_MAJOR%x.wpr")
+
+:: put project env variables/paths here
+IF "%WINGHOME%"=="" (set "WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%")
+IF "%WING_PROJ%"=="" (set "WING_PROJ=%DCCSI_IDE_WING_TOOLS%\.solutions\DCCsi_%DCCSI_WING_VERSION_MAJOR%x.wpr")
+
+echo     DCCSI_WING_VERSION_MAJOR = %DCCSI_WING_VERSION_MAJOR%
+REM echo     DCCSI_WING_VERSION_MINOR = %DCCSI_WING_VERSION_MINOR%
+echo     WINGHOME = %WINGHOME%
+echo     WING_PROJ = %WING_PROJ%
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_ENV_WINGIDE_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 149 - 0
Gems/IDE/WingPro/Tools/win_launch_wingide.bat

@@ -0,0 +1,149 @@
+@echo off
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Launches Wing IDE and the O3DE DccScriptingInterface Project Files
+:: Status: Prototype
+:: Version: 0.0.1
+:: Support: Wing Pro 8+
+:: Readme.md:  https://github.com/o3de/o3de/tree/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Tools/IDE/WingIDE/readme.md
+:: Notes:
+:: - Wing 7.x was previously supported, but it was python2.7 based and we are deprecating support for py2.7
+:: - py2.7 deprecation includes apps that are pre-py3
+:: - Previous versions may still work, however you will need to configure the env yourself
+:: - Try overriding envars and paths in your Env_Dev.bat
+
+:: Set up window
+TITLE O3DE StudioTools Launch WingIDE
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE StudioTools, Wing Pro Launch Env ...
+echo _____________________________________________________________________
+echo.
+
+:: Store current dir
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+SETLOCAL ENABLEDELAYEDEXPANSION
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Env\Win\Dev.bat" CALL %~dp0Env\Win\Dev.bat
+
+IF "%DCCSI_IDE_WING_TOOLS%"=="" (set DCCSI_IDE_WING_TOOLS=%~dp0)
+echo     DCCSI_IDE_WING_TOOLS = %DCCSI_IDE_WING_TOOLS%
+
+:: add to the PATH
+SET PATH=%DCCSI_IDE_WING_TOOLS%;%PATH%
+
+:: Constant Vars (Global)
+:: global debug (propogates)
+IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=False)
+echo     DCCSI_GDEBUG = %DCCSI_GDEBUG%
+:: initiates debugger connection
+IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=False)
+echo     DCCSI_DEV_MODE = %DCCSI_DEV_MODE%
+:: sets debugger, options: WING, PYCHARM
+IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING)
+echo     DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER%
+:: Default level logger will handle
+:: CRITICAL:50
+:: ERROR:40
+:: WARNING:30
+:: INFO:20
+:: DEBUG:10
+:: NOTSET:0
+IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20)
+echo     DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL%
+
+CALL %~dp0Env\Win\Wing.bat
+
+:: add to the PATH here (this is global)
+SET PATH=%PATH_O3DE_BIN%;%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PATH%
+
+
+:: add to the PATH here (this is global)
+SET PATH=%O3DE_PYTHONHOME%;%PATH_O3DE_PYTHON_INSTALL%;%DCCSI_PY_IDE%;%PATH%
+
+:: add all python related paths to PYTHONPATH for package imports
+SET PYTHONPATH=%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BUILD%
+
+:: This can now only be added late, in the launcher
+:: it conflicts with other Qt apps like Wing Pro 8+
+REM :: Initialize env
+REM CALL %~dp0..\..\..\O3DE\StudioTools\Tools\Env\Win\O3DE_Qt.bat
+
+REM :: add to the PATH
+REM SET PATH=%QTFORPYTHON_PATH%;%PATH%
+REM SET PYTHONPATH=%QTFORPYTHON_PATH%;%PYTHONPATH%
+
+REM :: add to the PATH
+REM :: SET PATH=%QT_PLUGIN_PATH%;%PATH%
+REM SET PYTHONPATH=%QT_PLUGIN_PATH%;%PYTHONPATH%
+
+SET PATH=%PATH_O3DE_BIN%;%PATH%
+
+rem :: Initialize env
+rem CALL %~dp0..\..\..\DCC\Maya\Tools\Env\Win\Maya.bat
+rem SET PATH=%DCCSI_PY_MAYA%;%PATH%
+
+rem CALL %~dp0..\..\..\DCC\Maya\Tools\Env\Win\Blender.bat
+rem SET PATH=%DCCSI_BLENDER_PY_EXE%;%PATH%
+
+rem CALL %~dp0..\..\..\DCC\Maya\Tools\Env\Win\Substance.bat
+rem SET PATH=%DCCSI_SUBSTANCE_PY_EXE%;%PATH%
+
+SET PATH=%WINGHOME%;%PATH%
+
+:: if the user has set up a custom env call it
+:: this ensures any user envars remain intact after initializing other envs
+IF EXIST "%~dp0Env\Win\Dev.bat" CALL %~dp0Env\Win\Dev.bat
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~ WingIDE Version %DCCSI_WING_VERSION_MAJOR%
+echo ~ Launching O3DE project: %O3DE_PROJECT% 
+echo ~ in Wing Pro %DCCSI_WING_VERSION_MAJOR% ...
+echo _____________________________________________________________________
+echo.
+
+echo.
+echo     PATH = %PATH%
+echo.
+echo     PYTHONPATH = %PYTHONPATH%
+echo.
+
+:: Change to root dir
+CD /D %PATH_O3DE_PROJECT%
+
+pause
+
+IF EXIST "%WINGHOME%\bin\wing.exe" (
+    start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%"
+) ELSE (
+    Where wing.exe 2> NUL
+    IF ERRORLEVEL 1 (
+        echo wing.exe could not be found
+            pause
+    ) ELSE (
+        start "" wing.exe "%WING_PROJ%"
+    )
+)
+
+::ENDLOCAL
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 31 - 0
Gems/IDE/WingPro/gem.json

@@ -0,0 +1,31 @@
+{
+    "gem_name": "wingpro",
+    "display_name": "Wing Pro IDE",
+    "license": "MIT",
+    "license_url": "https://opensource.org/licenses/MIT",
+    "origin": "HogJonny-AMZN",
+    "origin_url": "https://github.com/HogJonny-AMZN/o3de-dccsi-sandbox",
+    "type": "Code",
+    "summary": "A developer tool integration for the Wing Pro IDE",
+    "canonical_tags": [
+        "Gem"
+    ],
+    "user_tags": [
+        "wingpro",
+        "Python",
+        "StudioTools",
+        "IDE"
+    ],
+    "platforms": [
+        "Linux",
+        "Windows"
+    ],
+    "icon_path": ".",
+    "requirements": "Requires the StudioTools Gem",
+    "documentation_url": "",
+    "dependencies": [
+        "QtForPython"
+    ],
+    "repo_uri": "https://github.com/HogJonny-AMZN/o3de-dccsi-sandbox",
+    "restricted": "wingpro"
+}

+ 3 - 0
Gems/IDE/WingPro/preview.png

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

+ 168 - 0
Gems/IDE/WingPro/wingpro/__init__.py

@@ -0,0 +1,168 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""An O3DE out-of-box WingIDE integration
+
+    < DCCsi >/Tools/IDE/WingIDE/__init__.py
+
+:Status: Prototype
+:Version: 0.0.1
+:Wing Version: Wing Pro 8.x
+
+This init allows us to treat WingIDE setup as a DCCsi tools python package.
+
+Setting up a consistent development environment can be daunting for an
+initiate; hours or days searching through docs and setting up a project,
+just to get to the point you are authoring code while able to debug it.
+This DCCsi Tool integration performs much of this setup for developers
+and contributors working with Python and Wing IDE.
+
+Choice of IDEs like most tools, is a very personal choice and investment.
+This integration doesn't mean we have locked O3DE or Technical ARt into a
+single solution, it is just one possible tool integration of many (we'd
+like to add VScode and PyCharm in a similar manner.) And the community
+could likewise set up a multitude of others.
+
+The reason I like Wing IDE as a TA is that getting it working with DCC
+tools like Maya is relatively straightforward and well documented.
+
+Also the DCCsi works with many DCC apps, each with their own Python
+interpreter, and sometimes these python interpreters are managed, such
+as mayapy.exe
+
+This integration allows each DCC py interpreter, to be specified in a
+data-driven manner as a dev/launch environment; and since the DCCsi
+has portions of API that are shared py3 code, you may want to test the
+code against several different interpreters in a similar environment as
+the code would operate normally outside of the IDE and within the DCC app.
+
+So for instance,
+The Wing IDE launch environment, may specify the following:
+
+:: shared location for 64bit DCCSI_PY_MAYA python location
+set "DCCSI_PY_MAYA=%MAYA_BIN_PATH%\mayapy.exe"
+
+Then within Wing IDE, there will be a set of Python Shell environments,
+each can start a defined interpreter.
+
+DCCSI_PY_O3DE = ${DCCSI_PY_O3DE}
+DCCSI_PY_MAYA = ${DCCSI_PY_MAYA}
+...
+
+And there are times special considerations to be made, for instance
+intellisense auto-complete with mayapy.exe doesn't work unless mayapy.exe
+is that actual interpreter specified.
+
+In Wing you can switch the interpreter via:
+Console (panel) > Python Shell (tab) > Options > Use Environment ...
+
+This integration also hooks into bootstrapping code, which can auto-start
+and attach to Wing as the external debugger from other entrypoints and code,
+such as a plugin or tool starting within O3DE.
+
+This is a python script driven replacement for files found here:
+    < DCCsi >\Tools\Dev\Windows\*.bat
+
+Notes:
+- The old .bat launchers and some DCCsi code supported py2.7+, but we are
+deprecating support because of end-of-life
+
+- The old .bat launchers supported Wing 7.x, however that version of Wing
+also shipped with py2.7 as it's own managed interpreter, so we do not
+intend to implement support for older versions of wing < 8. However, wing
+can support py3 interpreters and debugging so it's possible it will
+continue to work.
+
+- I am a paid developer, so I am using Wing Pro. I need a fully featured IDE
+to develop with.  This increment of work does not intend to support Wing
+Community edition, I consider that future work.
+
+- The old .bat files are a great fallback to avoid a catch22; I am using
+Wing to develop the framework for a managed environment, launching and
+bootstrapping of tools like Wing. So the .bat files will be updated to
+Wing 8.x support and stick around to start Wing on windows if and when the
+framework is broken and inoperable.
+
+"""
+# -------------------------------------------------------------------------
+# standard imports
+import sys
+import os
+from pathlib import Path
+import logging as _logging
+# -------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------
+# global scope
+from DccScriptingInterface.Tools.IDE import _PACKAGENAME
+_PACKAGENAME = f'{_PACKAGENAME}.Wing'
+
+__all__ = ['globals',
+           'config',
+           'constants'
+           'discovery',
+           'start']
+          #'Foo',
+
+_LOGGER = _logging.getLogger(_PACKAGENAME)
+_LOGGER.debug('Initializing: {0}.'.format({_PACKAGENAME}))
+# -------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------
+# set up access to this IDE/Wing folder as a pkg
+_MODULE_PATH = Path(__file__)
+_LOGGER.debug(f'_MODULE_PATH: {_MODULE_PATH}')
+
+from DccScriptingInterface import add_site_dir
+from DccScriptingInterface import SETTINGS_FILE_SLUG
+from DccScriptingInterface import LOCAL_SETTINGS_FILE_SLUG
+
+# these are here to support debugging with wing now during development
+from DccScriptingInterface import SLUG_DCCSI_WING_TYPE
+from DccScriptingInterface import SLUG_DCCSI_WING_VERSION_MAJOR
+
+from DccScriptingInterface import PATH_WINGHOME
+from DccScriptingInterface import PATH_WING_APPDATA
+
+from DccScriptingInterface.constants import PATH_PROGRAMFILES_X86
+from DccScriptingInterface.constants import USER_HOME
+from DccScriptingInterface.constants import ENVAR_PATH_DCCSI_TOOLS_IDE_WING
+
+# last two parents
+from DccScriptingInterface.Tools.IDE import PATH_DCCSI_TOOLS
+from DccScriptingInterface.Tools.IDE import PATH_DCCSI_TOOLS_IDE
+from DccScriptingInterface.globals import *
+
+# set up access to this Wing IDE folder as a pkg
+_DCCSI_TOOLS_IDE_WING = Path(_MODULE_PATH.parent)
+add_site_dir(_DCCSI_TOOLS_IDE_WING.as_posix())
+
+# the path to this < dccsi >/Tools/IDE pkg
+PATH_DCCSI_TOOLS_IDE_WING = Path(_MODULE_PATH.parent)
+PATH_DCCSI_TOOLS_IDE_WING = Path(os.getenv(ENVAR_PATH_DCCSI_TOOLS_IDE_WING,
+                                           PATH_DCCSI_TOOLS_IDE_WING.as_posix()))
+add_site_dir(PATH_DCCSI_TOOLS_IDE_WING.as_posix())
+_LOGGER.debug(f'{ENVAR_PATH_DCCSI_TOOLS_IDE_WING}: {PATH_DCCSI_TOOLS_IDE_WING}')
+_LOGGER.debug(STR_CROSSBAR)
+
+# from dynaconf import LazySettings
+
+PATH_DCCSI_TOOLS_IDE_WING_SETTINGS = PATH_DCCSI_TOOLS_IDE_WING.joinpath(SETTINGS_FILE_SLUG).resolve()
+PATH_DCCSI_TOOLS_IDE_WING_LOCAL_SETTINGS = PATH_DCCSI_TOOLS_IDE_WING.joinpath(LOCAL_SETTINGS_FILE_SLUG).resolve()
+
+# settings = LazySettings(
+#     SETTINGS_FILE_FOR_DYNACONF=PATH_DCCSI_TOOLS_IDE_WING.as_posix(),
+#     INCLUDES_FOR_DYNACONF=[PATH_DCCSI_TOOLS_IDE_WING_LOCAL_SETTINGS.as_posix()]
+# )
+#
+# settings.setenv()
+# -------------------------------------------------------------------------

+ 223 - 0
Gems/IDE/WingPro/wingpro/config.py

@@ -0,0 +1,223 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""! This module manages the dynamic config and settings for bootstrapping
+Wing Pro 8 IDE integration with o3de inter-op, scripts, extensions, etc.
+
+:file: DccScriptingInterfac\\Tools\\IDE\\Wing\\config.py
+:Status: Prototype
+:Version: 0.0.1
+:Future: is unknown
+:Notice:
+"""
+# -------------------------------------------------------------------------
+import timeit
+_MODULE_START = timeit.default_timer()  # start tracking
+
+# standard imports
+from pathlib import Path
+import logging as _logging
+# -------------------------------------------------------------------------
+# global scope
+from DccScriptingInterface.Tools.IDE.Wing import _PACKAGENAME
+_MODULENAME = f'{_PACKAGENAME}.config'
+_LOGGER = _logging.getLogger(_MODULENAME)
+_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME}))
+
+_MODULE_PATH = Path(__file__)
+_LOGGER.debug(f'_MODULE_PATH: {_MODULE_PATH.as_posix()}')
+
+# ensure dccsi and o3de core access
+# in a future iteration it is suggested that the core config
+# be rewritten from ConfigClass, then WingConfig inherits core
+import DccScriptingInterface.config as dccsi_core_config
+
+# this will initialize the core dynamic config, settings and env
+# if the Qt/PySide envars are set, it can cause some Qt based apps to fail
+# wing happens to be one of them, this is disabled for wing\start.py to perform
+
+# we also don't want o3de python to mesh with wings python?
+# any module, or tool, the need them can reinit the config
+# the problem with not doing it, is then we are not passing o3de python
+# info to wing, such as launch interpretter DCCSI_PY_IDE
+# wing's default interpretter won't have access to o3de packages, etc.
+# but maybe they could be installed into wing with foundation.py?
+_settings_core = dccsi_core_config.get_config_settings(enable_o3de_python=True,
+                                                       enable_o3de_pyside2=False,
+                                                       set_env=True)
+
+# from within wing, setting the Qt/PySide2 envars before running
+# another script/tool performs fine, as the interpreter is a subprocess
+
+# local dccsi imports
+# this accesses common global state, e.g. DCCSI_GDEBUG (is True or False)
+from DccScriptingInterface.globals import *
+
+# this will auto-attach ide debugging at the earliest possible point in module
+from azpy.config_utils import attach_debugger
+if DCCSI_DEV_MODE: # from DccScriptingInterface.globals
+    attach_debugger(debugger_type=DCCSI_GDEBUGGER)
+
+# if the dccsi core config and it's settings are loaded this should pass
+try:
+    _settings_core.DCCSI_CONFIG_CORE
+except EnvironmentError as e:
+    _LOGGER.error('Setting does not exist: DCCSI_CONFIG_CORE')
+    _LOGGER.warning(f'EnvironmentError: {e}')
+
+# can run local tests
+if DCCSI_TESTS: # from DccScriptingInterface.globals
+    # this will validate pyside bootstrapping
+    foo = dccsi_core_config.test_pyside2(exit = False)
+    pass
+
+# this is the root path for the wing pkg
+from DccScriptingInterface.Tools.IDE.Wing import ENVAR_PATH_DCCSI_TOOLS_IDE_WING
+from DccScriptingInterface.Tools.IDE.Wing import PATH_DCCSI_TOOLS_IDE_WING
+from DccScriptingInterface.Tools.IDE.Wing import PATH_DCCSI_TOOLS_IDE_WING_SETTINGS
+from DccScriptingInterface.Tools.IDE.Wing import PATH_DCCSI_TOOLS_IDE_WING_LOCAL_SETTINGS
+# -------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------
+# now we build the wing config class
+from DccScriptingInterface.azpy.config_class import ConfigClass
+
+# For a DCC tool like Maya, where we may have additional tools that need
+# their own config/settings, the MayaConfig could inherit from the
+# CoreConfig (which is a ConfigClass), then the tool could have it's own
+# MyMayaToolConfig that inherits from MayaConfig and extends it further.
+
+# wing does have an API, theoretically we could create tools built on top
+# of wing like we do with DCC tools ... but we do not yet have the need
+# so the more simple approach is taken here for now, a ConfigClass object
+
+# but it is suggested that when the core <dccsi>\config.py is re-written
+# as a ConfigClass, that the WingConfig inherits from that instead
+
+# wing_config is a class object of WingConfig
+# WingConfig is a child class of ConfigClass
+class WingConfig(ConfigClass):
+    """Extend ConfigClass with new wing functionality"""
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        _LOGGER.info(f'Initializing: {self.get_classname()}')
+
+# build config object
+wing_config = WingConfig(config_name='dccsi_ide_wing',
+                               settings_filepath = PATH_DCCSI_TOOLS_IDE_WING_SETTINGS,
+                               settings_local_filepath = PATH_DCCSI_TOOLS_IDE_WING_LOCAL_SETTINGS,
+                               auto_set=True)
+
+# in another module someone could work this way
+# from DccScriptingInterface.Tools.IDE.Wing.config import wing_config
+# settings = wing_config.get_settings(set_env=True)
+
+# a managed setting to track the wing config is enabled
+from Tools.IDE.Wing.constants import ENVAR_DCCSI_CONFIG_IDE_WING
+wing_config.add_setting(ENVAR_DCCSI_CONFIG_IDE_WING, True)
+
+# path to the Tools\IDE\Wing location
+wing_config.add_setting(ENVAR_PATH_DCCSI_TOOLS_IDE_WING,
+                        PATH_DCCSI_TOOLS_IDE_WING)
+
+# a managed envar for wing version
+from Tools.IDE.Wing.constants import ENVAR_DCCSI_WING_VERSION_MAJOR
+from Tools.IDE.Wing.constants import SLUG_DCCSI_WING_VERSION_MAJOR
+wing_config.add_setting(ENVAR_DCCSI_WING_VERSION_MAJOR,
+                        SLUG_DCCSI_WING_VERSION_MAJOR)
+
+# a managed envar setting for WINGHOME (install location)
+from Tools.IDE.Wing.constants import ENVAR_WINGHOME
+from Tools.IDE.Wing.constants import PATH_WINGHOME
+PATH_WINGHOME = Path(PATH_WINGHOME).resolve()
+wing_config.add_setting(ENVAR_WINGHOME,
+                        PATH_WINGHOME.as_posix(),
+                        set_sys_path=True)
+
+# a managed envar for the wing bin folder
+from Tools.IDE.Wing.constants import ENVAR_WINGHOME_BIN
+from Tools.IDE.Wing.constants import PATH_WINGHOME_BIN
+PATH_WINGHOME_BIN = Path(PATH_WINGHOME_BIN).resolve()
+wing_config.add_setting(ENVAR_WINGHOME_BIN,
+                        PATH_WINGHOME_BIN.as_posix(),
+                        set_sys_path=True)
+
+# a managed envar to the wing exe
+from Tools.IDE.Wing.constants import ENVAR_WING_EXE
+from Tools.IDE.Wing.constants import PATH_WINGHOME_BIN_EXE
+PATH_WINGHOME_BIN_EXE = Path(PATH_WINGHOME_BIN_EXE).resolve()
+wing_config.add_setting(ENVAR_WING_EXE,
+                        PATH_WINGHOME_BIN_EXE.as_posix())
+
+
+# a managed envar setting for the wing project file
+from Tools.IDE.Wing.constants import ENVAR_WING_PROJ
+from Tools.IDE.Wing.constants import PATH_DCCSI_TOOLS_IDE_WING_PROJ
+PATH_DCCSI_TOOLS_IDE_WING_PROJ = Path(PATH_DCCSI_TOOLS_IDE_WING_PROJ).resolve()
+wing_config.add_setting(ENVAR_WING_PROJ,
+                        PATH_DCCSI_TOOLS_IDE_WING_PROJ.as_posix())
+
+# a managed envar setting  for the userhome wing appdata folder
+from Tools.IDE.Wing.constants import ENVAR_WING_APPDATA
+from Tools.IDE.Wing.constants import PATH_WING_APPDATA
+PATH_WING_APPDATA = Path(PATH_WING_APPDATA).resolve()
+wing_config.add_setting(ENVAR_WING_APPDATA,
+                        PATH_WING_APPDATA.as_posix())
+
+# -------------------------------------------------------------------------
+_MODULE_END = timeit.default_timer() - _MODULE_START
+_LOGGER.debug(f'{_MODULENAME} took: {_MODULE_END} sec')
+# -------------------------------------------------------------------------
+
+
+###########################################################################
+# Main Code Block, runs this script as main (testing)
+# -------------------------------------------------------------------------
+if __name__ == '__main__':
+    """Run this file as a standalone cli script for testing/debugging"""
+
+    # this should hit this modules location and load wing settings
+    settings = wing_config.get_settings(set_env=True)
+
+    # initialize configs for DCC tools we want to develop with
+    # so we get access to their python interpreter, etc.
+    # it is suggested the in the future, there be a project setreg for wing
+    # whose settings describe which DCC tools to activate on start
+
+    # # Bolt On blender config
+    # from DccScriptingInterface.Tools.DCC.Blender.config import blender_config
+    #
+    # # prefix for defining IDE interpreters 'DCCSI_PY_'
+    # wing_config.add_setting('DCCSI_PY_BLENDER',
+    #                         blender_config.settings.DCCSI_BLENDER_PY_EXE,
+    #                         set_envar=True)
+
+    # Bolt On maya config
+    # not implemented yet
+
+    # Bolt On other DCC tools
+    # also not yet implemented
+    # -------------------------------------------------------------------------
+
+    try:
+        settings.DCCSI_CONFIG_IDE_WING
+        _LOGGER.info('Wing IDE config is enabled')
+    except:
+        _LOGGER.error('Setting does not exist')
+
+    _LOGGER.info(f'Exporting local settings: {PATH_DCCSI_TOOLS_IDE_WING_LOCAL_SETTINGS}')
+
+    try:
+        wing_config.export_settings(set_env=True,
+                                       log_settings=True)
+    except Exception as e:
+        _LOGGER.error(f'{e}')
+# --- END -----------------------------------------------------------------

+ 79 - 0
Gems/IDE/WingPro/wingpro/constants.py

@@ -0,0 +1,79 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""Common constants for the dccsi wing pro ide integration
+
+:file: DccScriptingInterface\\Tools\\IDE\\Wing\\constants.py
+:Status: Prototype
+:Version: 0.0.1
+"""
+# -------------------------------------------------------------------------
+# standard imports
+import logging as _logging
+# -------------------------------------------------------------------------
+_MODULENAME = 'DCCsi.Tools.IDE.Wing.constants'
+_LOGGER = _logging.getLogger(_MODULENAME)
+_LOGGER.debug(f'Initializing: {_MODULENAME}')
+# -------------------------------------------------------------------------
+# dccsi imports here
+from DccScriptingInterface.Tools.IDE.Wing import USER_HOME
+# wing is a x86 program, this pulls the constant for that (not a Path object)
+from DccScriptingInterface.Tools.IDE.Wing import PATH_PROGRAMFILES_X86
+from DccScriptingInterface.Tools.IDE.Wing import PATH_DCCSI_TOOLS_IDE_WING
+# -------------------------------------------------------------------------
+# wing pro ide constants here
+# a setting to know the wing config exists
+ENVAR_DCCSI_CONFIG_IDE_WING = 'DCCSI_CONFIG_IDE_WING'
+
+# enavr to get/set the wing pro version
+ENVAR_DCCSI_WING_VERSION_MAJOR = 'DCCSI_WING_VERSION_MAJOR'
+
+# the default supported version of wing pro is 8
+from DccScriptingInterface.Tools.IDE.Wing import SLUG_DCCSI_WING_VERSION_MAJOR
+
+# str slug for the default wing type
+# in the future, add support for wing personal and maybe wing 101 versions
+from DccScriptingInterface.Tools.IDE.Wing import SLUG_DCCSI_WING_TYPE
+
+# path string constructor, dccsi default WINGHOME location
+from DccScriptingInterface.Tools.IDE.Wing import PATH_WINGHOME
+
+# wing native hook for it's home location, used in wingstub.py
+ENVAR_WINGHOME = 'WINGHOME'
+
+ENVAR_WINGHOME_BIN = 'WINGHOME_BIN'
+
+# path string constructor, wing home bin folder
+PATH_WINGHOME_BIN = f'{PATH_WINGHOME}\\bin'
+
+# envar to get/set the wing pro exe
+ENVAR_WING_EXE = 'WING_EXE'
+
+# path string constructor, wing home bin folder
+PATH_WINGHOME_BIN_EXE = f'{PATH_WINGHOME_BIN}\\wing.exe'
+
+# this is already available PATH_DCCSI_TOOLS_IDE_WING, imported above
+# path string constructor, dccsi wing sub-dir
+# PATH_DCCSI_TOOLS_IDE_WING = f'{PATH_DCCSIG.as_posix()}\\Tools\\IDE\\Wing'
+
+# envar to get/set the solution project file for wing
+ENVAR_WING_PROJ = 'WING_PROJ'
+
+# path string constructor, the dccsi wing solution file
+PATH_DCCSI_TOOLS_IDE_WING_PROJ = (f'{PATH_DCCSI_TOOLS_IDE_WING}' +
+                                  f'\\.solutions' +
+                                  f'\\DCCsi_{SLUG_DCCSI_WING_VERSION_MAJOR}x.wpr')
+
+# envar to get/set the userhome wing appdata folder
+ENVAR_WING_APPDATA = 'WING_APPDATA'
+
+# path string constructor, userhome where wingstubdb.py can live
+from DccScriptingInterface.Tools.IDE.Wing import PATH_WING_APPDATA
+# --- END -----------------------------------------------------------------

+ 83 - 0
Gems/IDE/WingPro/wingpro/discovery.py

@@ -0,0 +1,83 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""! A module to discover installed versions of wing pro for selection
+
+:file: < DCCsi >/Tools/IDE/Wing/discovery.py
+:Status: Prototype, very bare bones
+:Version: 0.0.1
+Future: provide a variety of ways to discover wing, i.e. use winreg
+"""
+# -------------------------------------------------------------------------
+# standard imports
+from pathlib import Path
+from typing import Union
+import logging as _logging
+# -------------------------------------------------------------------------
+# global scope
+from DccScriptingInterface.Tools.IDE.Wing import _PACKAGENAME
+_MODULENAME = f'{_PACKAGENAME}.discovery'
+_LOGGER = _logging.getLogger(_MODULENAME)
+_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME}))
+# -------------------------------------------------------------------------
+# dccsi imports
+# the default and currently only supported discovery path
+from DccScriptingInterface.Tools.IDE.Wing.constants import PATH_WINGHOME
+# -------------------------------------------------------------------------
+# currently we only support the default win install path for Wing Pro 8
+def get_default_install(winghome: Union[str, Path] = PATH_WINGHOME) -> Path:
+    """! validates then returns the default dccsi winghome
+    :return: Path(winghome), or None"""
+    winghome = Path(winghome).resolve()
+    if winghome.exists():
+        return winghome
+    else:
+        _LOGGER.error(f'WINGHOME not valid: {winghome.as_posix()}')
+        return None
+
+# in the future, we might want to help the user find all installs
+# and select the install they would like to utilize. And this should
+# provide robust per-platform and os-style registry support.
+def find_all_installs() -> list:
+    """! finds all platform installations of wing
+    :return: list of wing install locations"""
+    # ! this method is not fully implemented, future work.
+
+    all_install_paths = list()
+    all_install_paths.append(get_default_install())
+
+    _LOGGER.info('Wing Installs found:')
+    for index, install in enumerate(all_install_paths):
+        _LOGGER.info(f'Install:{index}:: {install}')
+
+    return all_install_paths
+
+# then during configuration (from cli or otherwise), present the installs
+# to the user and allow them to select which install to use
+# this would potentially end up in a couple of places:
+# <dccsi>\Tools\IDE\Wing\settings.local.json for a developer
+# <project>\registry\dccsi_config_wing.json for a project configuration
+# --- END -----------------------------------------------------------------
+
+
+###########################################################################
+# Main Code Block, runs this script as main (testing)
+# -------------------------------------------------------------------------
+if __name__ == '__main__':
+    """! Run this file as main, local testing"""
+
+    winghome = get_default_install(winghome=PATH_WINGHOME)
+
+    find_all_installs()
+
+    if winghome.exists():
+        _LOGGER.info(f'WINGHOME: {winghome}')
+    else:
+        _LOGGER.error(f'WINGHOME not valid: {winghome.as_posix()}')

+ 15 - 0
Gems/IDE/WingPro/wingpro/settings.json

@@ -0,0 +1,15 @@
+{
+	"LOAD_DOTENV": true,
+	"COMPANY": "Amazon",
+	"DCCSI_CONFIG_IDE_WING": true,
+	"DCCSI_GDEBUG": "True",
+	"DCCSI_DEV_MODE": "True",
+	"DCCSI_GDEBUGGER": "WING",
+	"DCCSI_LOGLEVEL": 10,
+	"DEFAULT_SETTINGS_PATHS": [
+		"settings.py",
+		"settings.json",
+		".secrets.py",
+		".secrets.json"
+	]
+}

+ 259 - 0
Gems/IDE/WingPro/wingpro/start.py

@@ -0,0 +1,259 @@
+#
+# 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
+#
+# -------------------------------------------------------------------------
+#
+"""! O3DE DCCsi Wing Pro 8+ IDE start module
+
+There are severl ways this can be used:
+1. From cli
+    - open a cmd
+    - change directory > cd c:\\path\\to\\DccScriptingInterface
+    - run command > python Tools\\IDE\\Wing\\start.py
+
+2. The O3DE editor uses this module to launch from menu and editor systems
+
+:file: DccScriptingInterface\\Tools\\IDE\\Wing\\start.py
+:Status: Prototype
+:Version: 0.0.1
+:Entrypoint: entrypoint, configures logging, includes cli
+:Notice:
+    Currently windows only (not tested on other platforms)
+    Currently only tested with Wing Pro 8 in Windows
+"""
+# -------------------------------------------------------------------------
+import timeit
+_MODULE_START = timeit.default_timer()  # start tracking
+
+# standard imports
+import sys
+import os
+import subprocess
+from pathlib import Path
+import logging as _logging
+# -------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------
+# this is an entry point, we must self bootstrap
+_MODULE_PATH = Path(__file__)
+PATH_O3DE_TECHART_GEMS = _MODULE_PATH.parents[4].resolve()
+os.chdir(PATH_O3DE_TECHART_GEMS.as_posix())
+sys.path.insert(0, PATH_O3DE_TECHART_GEMS.as_posix())
+
+from DccScriptingInterface import add_site_dir
+add_site_dir(PATH_O3DE_TECHART_GEMS) # cleaner add
+# -------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------
+# global scope
+from DccScriptingInterface.Tools.IDE.Wing import _PACKAGENAME
+_MODULENAME = f'{_PACKAGENAME}.start'
+
+# get the global dccsi state
+from DccScriptingInterface.globals import *
+
+from azpy.constants import FRMT_LOG_LONG
+_logging.basicConfig(level=_logging.DEBUG,
+                     format=FRMT_LOG_LONG,
+                    datefmt='%m-%d %H:%M')
+
+_LOGGER = _logging.getLogger(_MODULENAME)
+
+# auto-attach ide debugging at the earliest possible point in module
+if DCCSI_DEV_MODE:
+    if DCCSI_GDEBUGGER == 'WING':
+        import DccScriptingInterface.azpy.test.entry_test
+        DccScriptingInterface.azpy.test.entry_test.connect_wing()
+    elif DCCSI_GDEBUGGER == 'PYCHARM':
+        _LOGGER.warning(f'{DCCSI_GDEBUGGER} debugger auto-attach not yet implemented')
+    else:
+        _LOGGER.warning(f'{DCCSI_GDEBUGGER} not a supported debugger')
+
+_LOGGER.debug(f'Initializing: {_MODULENAME}')
+_LOGGER.debug(f'_MODULE_PATH: {_MODULE_PATH.as_posix()}')
+
+# retreive the wing_config class object and it's settings
+from DccScriptingInterface.Tools.IDE.Wing.config import wing_config
+wing_config.settings.setenv() # ensure env is set
+
+# alternatively, you could get the settings via this wrapped method
+# settings = wing_config.get_settings(set_env=True)
+
+# or the standard dynaconf way, this will walk to find and exec config.py
+#from dynaconf import settings
+
+# if you want to directly work with settings
+# foo = wing_config.settings.WING_PROJ
+
+from DccScriptingInterface.azpy.config_utils import check_is_ascii
+
+# the subprocess call needs an environment
+# if we try to pass this, we get a failure to launch
+# env = wing_config.settings.as_dict()
+# error: "Fatal Python error: _Py_HashRandomization_Init: failed to get random numbers to initialize Python\nPython runtime state: preinitialized"
+#https://stackoverflow.com/questions/58997105/fatal-python-error-failed-to-get-random-numbers-to-initialize-python
+
+# another encountered problem is that the dynaconf settings dict may have
+# non-string Key:value pairs, which the subprocess env chokes on so we prune below
+
+# store a copy, so we can inspect/compare later
+orig_env = os.environ.copy()
+
+# we are going to pass the system environ
+wing_env = os.environ.copy()
+
+# generate a pruned env from dict that subprocess will not complain about
+# hopefully we don't loose anything vital (that isn't procedurally derived later)
+wing_env = {key: value for key, value in wing_env.items() if check_is_ascii(key) and check_is_ascii(value)}
+
+# if we are trying to start an app via script or from an app like o3de,
+# the environ will propogate Qt related envars like 'QT_PLUGIN_PATH'
+# Wing is a Qt5 application (as are some DCC tools) and this can cause a boot failure
+# in this case, the most straightforward approach is to just prune them
+wing_env = {key: value for key, value in wing_env.items() if not key.startswith("QT_")}
+
+if DCCSI_GDEBUG:
+    # we can see what was pruned
+    pruned = {k: wing_env[k] for k in set(wing_env) - set(orig_env)}
+
+    if len(pruned.items()):
+        _LOGGER.debug(f'prune diff is ...')
+        for p in pruned.items():
+            _LOGGER.debug(f'{p}')
+
+def popen(exe = wing_config.settings.WING_EXE,
+         project_file = wing_config.settings.WING_PROJ):
+    """Method to call, to start Wing IDE"""
+
+    _LOGGER.debug(f'Attempting to start wing ...')
+
+    wing_proc = subprocess.Popen([exe, project_file],
+                                 env = wing_env,
+                                 shell=True,
+                                 stdout = subprocess.PIPE,
+                                 stderr = subprocess.PIPE,
+                                 close_fds=True)
+
+    out, err = wing_proc.communicate()
+
+    if wing_proc.returncode != 0:
+        _LOGGER.error(f'Wing did not start ...')
+        _LOGGER.error(f'{out}')
+        _LOGGER.error(f'{err}')
+        return None
+    else:
+        _LOGGER.info(f'Success: Wing started correctly!')
+
+    return wing_proc
+
+# the above method works, so will deprecate this call version
+# should find out if a run variant is the prefered way to go py3?
+
+# def call(exe = wing_config.settings.WING_EXE,
+#          project_file = wing_config.settings.WING_PROJ):
+#     """Method to call, to start Wing IDE
+#     """
+#
+#     _LOGGER.debug(f'Attempting to start wing ...')
+#
+#     try:
+#         wing_proc = subprocess.call([exe, project_file],
+#                                      env = wing_env,
+#                                      shell=True,
+#                                      close_fds=True)
+#     except Exception as e:
+#         _LOGGER.error(f'Wing did not start ...')
+#         _LOGGER.error(f'{err}')
+#         return None
+#
+#     else:
+#         _LOGGER.info(f'Success: Wing started correctly!')
+#
+#     return wing_proc
+# --- END -----------------------------------------------------------------
+
+
+###########################################################################
+# Main Code Block, runs this script as main (testing)
+# -------------------------------------------------------------------------
+if __name__ == '__main__':
+    """Run this file as main (external commandline)"""
+
+    _MODULENAME = f'{_MODULENAME}.cli'
+
+    from DccScriptingInterface.globals import *
+
+    from DccScriptingInterface.constants import STR_CROSSBAR
+    from DccScriptingInterface.constants import FRMT_LOG_LONG
+
+    # configure basic logger
+    # note: not using a common logger to reduce cyclical imports
+    _logging.basicConfig(level=DCCSI_LOGLEVEL,
+                         format=FRMT_LOG_LONG,
+                         datefmt='%m-%d %H:%M')
+
+    _LOGGER = _logging.getLogger(_MODULENAME)
+
+    # log global state to cli
+    _LOGGER.debug(STR_CROSSBAR)
+    _LOGGER.debug(f'_MODULENAME: {_MODULENAME}')
+    _LOGGER.debug(f'{ENVAR_DCCSI_GDEBUG}: {wing_config.settings.DCCSI_GDEBUG}')
+    _LOGGER.debug(f'{ENVAR_DCCSI_DEV_MODE}: {wing_config.settings.DCCSI_DEV_MODE}')
+    _LOGGER.debug(f'{ENVAR_DCCSI_LOGLEVEL}: {wing_config.settings.DCCSI_LOGLEVEL}')
+
+    # commandline interface
+    import argparse
+    parser = argparse.ArgumentParser(
+        description=f'O3DE {_MODULENAME}',
+        epilog=(f"Attempts to start Wing Pro {wing_config.settings.DCCSI_WING_VERSION_MAJOR}"
+                "with the DCCsi and O3DE bootstrapping"))
+
+    parser.add_argument('-gd', '--global-debug',
+                        type=bool,
+                        required=False,
+                        default=False,
+                        help='Enables global debug flag.')
+
+    parser.add_argument('-ex', '--exit',
+                        type=bool,
+                        required=False,
+                        default=False,
+                        help='Exits python. Do not exit if you want to be in interactive interpreter after config')
+
+    args = parser.parse_args()
+
+    # easy overrides
+    if args.global_debug:
+        # you can modify/oerrive any setting simply by re-adding it with new values
+        wing_config.add_setting(ENVAR_DCCSI_GDEBUG, True)
+
+    # fetch modified settings and set the env
+    settings = wing_config.get_settings(set_env=True)
+
+    try:
+        wing_proc = popen(wing_config.settings.WING_EXE, wing_config.settings.WING_PROJ)
+    except Exception as e:
+        _LOGGER.warning(f'Could not start Wing')
+        _LOGGER.error(f'{e} , traceback =', exc_info=True)
+        if DCCSI_STRICT:
+            _LOGGER.exception(f'{e} , traceback =', exc_info=True)
+            raise e
+
+    # -- DONE ----
+    _LOGGER.info(STR_CROSSBAR)
+
+    _LOGGER.debug('{0} took: {1} sec'.format(_MODULENAME, timeit.default_timer() - _MODULE_START))
+
+    if args.exit:
+        import sys
+        # return
+        sys.exit()
+    else:
+        # custom prompt
+        sys.ps1 = "[{}]>>".format(_MODULENAME)
+# --- END -----------------------------------------------------------------

+ 12 - 0
Gems/O3DE/StudioTools/.gitignore

@@ -0,0 +1,12 @@
+.mayaSwatches
+.temp
+__downloads__
+__pycache__
+__tmp__
+*.pyc
+*.pyo
+workspace.xml
+.secrets.*
+settings.local.json
+.env
+settings_export.json.tmp

+ 15 - 0
Gems/O3DE/StudioTools/CHANGELOG.md

@@ -0,0 +1,15 @@
+# Changelog
+
+All notable changes to this StudioTools Gem will be documented in this file.
+
+## [0.0.0] - 2023-01-19
+
+### Added:
+
+- Gem scaffold
+
+- CHANGELOG.md
+
+### Changed:
+
+- CHANGELOG.md

+ 18 - 0
Gems/O3DE/StudioTools/CMakeLists.txt

@@ -0,0 +1,18 @@
+
+# Query the gem name from the gem.json file if possible
+# otherwise fallback to using StudioTools
+o3de_find_ancestor_gem_root(gempath gem_name "${CMAKE_CURRENT_SOURCE_DIR}")
+if (NOT gem_name)
+    set(gem_name "StudioTools")
+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} o3de_gem_restricted_path)
+
+add_subdirectory(Code)

+ 96 - 0
Gems/O3DE/StudioTools/Code/CMakeLists.txt

@@ -0,0 +1,96 @@
+
+# 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/StudioTools/Code/Platform/<platorm_name>  or
+#            <restricted_folder>/<platform_name>/Gems/StudioTools/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)
+
+
+# If we are on a host platform, we want to add the host tools targets like the ${gem_name}.Editor target which
+# will also depend on ${gem_name}.Editor.API 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
+            studiotools_editor_api_files.cmake
+            ${pal_dir}/studiotools_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
+        AUTORCC
+        FILES_CMAKE
+            studiotools_editor_private_files.cmake
+        TARGET_PROPERTIES
+            O3DE_PRIVATE_TARGET TRUE
+        INCLUDE_DIRECTORIES
+            PRIVATE
+                Include
+                Source
+        BUILD_DEPENDENCIES
+            PUBLIC
+                AZ::AzToolsFramework
+    )
+
+    ly_add_target(
+        NAME ${gem_name}.Editor GEM_MODULE
+        NAMESPACE Gem
+        AUTOMOC
+        FILES_CMAKE
+            studiotools_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
+        RUNTIME_DEPENDENCIES
+            Gem::QtForPython.Editor
+    )
+
+    # 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}.Editor.Tests
+
+    # If we are a host platform we want to add tools test like editor tests here
+    if(PAL_TRAIT_BUILD_HOST_TOOLS)
+    endif()
+endif()

+ 31 - 0
Gems/O3DE/StudioTools/Code/Include/StudioTools/StudioToolsBus.h

@@ -0,0 +1,31 @@
+
+#pragma once
+
+#include <AzCore/EBus/EBus.h>
+#include <AzCore/Interface/Interface.h>
+
+namespace StudioTools
+{
+    class StudioToolsRequests
+    {
+    public:
+        AZ_RTTI(StudioToolsRequests, "{189B0D29-45C3-4560-8136-D1560040C471}");
+        virtual ~StudioToolsRequests() = default;
+        // Put your public methods here
+    };
+    
+    class StudioToolsBusTraits
+        : public AZ::EBusTraits
+    {
+    public:
+        //////////////////////////////////////////////////////////////////////////
+        // EBusTraits overrides
+        static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+        //////////////////////////////////////////////////////////////////////////
+    };
+
+    using StudioToolsRequestBus = AZ::EBus<StudioToolsRequests, StudioToolsBusTraits>;
+    using StudioToolsInterface = AZ::Interface<StudioToolsRequests>;
+
+} // namespace StudioTools

+ 4 - 0
Gems/O3DE/StudioTools/Code/Platform/Linux/PAL_linux.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_STUDIOTOOLS_SUPPORTED TRUE)
+set(PAL_TRAIT_STUDIOTOOLS_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_STUDIOTOOLS_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/StudioToolsLinux.cpp
+#      ../Source/Linux/StudioToolsLinux.h
+#      ../Include/Linux/StudioToolsLinux.h
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Linux/studiotools_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/StudioToolsLinux.cpp
+#      ../Source/Linux/StudioToolsLinux.h
+#      ../Include/Linux/StudioToolsLinux.h
+
+set(FILES
+)

+ 4 - 0
Gems/O3DE/StudioTools/Code/Platform/Mac/PAL_mac.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_STUDIOTOOLS_SUPPORTED TRUE)
+set(PAL_TRAIT_STUDIOTOOLS_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_STUDIOTOOLS_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/StudioToolsMac.cpp
+#      ../Source/Mac/StudioToolsMac.h
+#      ../Include/Mac/StudioToolsMac.h
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Mac/studiotools_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/StudioToolsMac.cpp
+#      ../Source/Mac/StudioToolsMac.h
+#      ../Include/Mac/StudioToolsMac.h
+
+set(FILES
+)

+ 4 - 0
Gems/O3DE/StudioTools/Code/Platform/Windows/PAL_windows.cmake

@@ -0,0 +1,4 @@
+
+set(PAL_TRAIT_STUDIOTOOLS_SUPPORTED TRUE)
+set(PAL_TRAIT_STUDIOTOOLS_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_STUDIOTOOLS_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/StudioToolsWindows.cpp
+#      ../Source/Windows/StudioToolsWindows.h
+#      ../Include/Windows/StudioToolsWindows.h
+
+set(FILES
+)

+ 8 - 0
Gems/O3DE/StudioTools/Code/Platform/Windows/studiotools_editor_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/StudioToolsWindows.cpp
+#      ../Source/Windows/StudioToolsWindows.h
+#      ../Include/Windows/StudioToolsWindows.h
+
+set(FILES
+)

+ 27 - 0
Gems/O3DE/StudioTools/Code/Source/StudioToolsModuleInterface.h

@@ -0,0 +1,27 @@
+
+#include <AzCore/Memory/SystemAllocator.h>
+#include <AzCore/Module/Module.h>
+
+namespace StudioTools
+{
+    class StudioToolsModuleInterface
+        : public AZ::Module
+    {
+    public:
+        AZ_RTTI(StudioToolsModuleInterface, "{F0F2B835-3C8A-4471-AF58-9EDF1CC33CA8}", AZ::Module);
+        AZ_CLASS_ALLOCATOR(StudioToolsModuleInterface, AZ::SystemAllocator, 0);
+
+        StudioToolsModuleInterface()
+        {
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList{
+            };
+        }
+    };
+}// namespace StudioTools

+ 5 - 0
Gems/O3DE/StudioTools/Code/Source/Tools/StudioTools.qrc

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

+ 50 - 0
Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorModule.cpp

@@ -0,0 +1,50 @@
+
+#include <StudioToolsModuleInterface.h>
+#include "StudioToolsEditorSystemComponent.h"
+#include <AzToolsFramework/API/PythonLoader.h>
+
+#include <QtGlobal>
+
+void InitStudioToolsResources()
+{
+    // We must register our Qt resources (.qrc file) since this is being loaded from a separate module (gem)
+    Q_INIT_RESOURCE(StudioTools);
+}
+
+namespace StudioTools
+{
+    class StudioToolsEditorModule
+        : public StudioToolsModuleInterface
+        , public AzToolsFramework::EmbeddedPython::PythonLoader
+    {
+    public:
+        AZ_RTTI(StudioToolsEditorModule, "{223E8CD4-FE90-4D25-B928-401255AC3B32}", StudioToolsModuleInterface);
+        AZ_CLASS_ALLOCATOR(StudioToolsEditorModule, AZ::SystemAllocator, 0);
+
+        StudioToolsEditorModule()
+        {
+            InitStudioToolsResources();
+
+            // 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(), {
+                StudioToolsEditorSystemComponent::CreateDescriptor(),
+            });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         * Non-SystemComponents should not be added here
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList {
+                azrtti_typeid<StudioToolsEditorSystemComponent>(),
+            };
+        }
+    };
+}// namespace StudioTools
+
+AZ_DECLARE_MODULE_CLASS(Gem_StudioTools, StudioTools::StudioToolsEditorModule)

+ 59 - 0
Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorSystemComponent.cpp

@@ -0,0 +1,59 @@
+
+#include <AzCore/Serialization/SerializeContext.h>
+#include "StudioToolsEditorSystemComponent.h"
+
+namespace StudioTools
+{
+    void StudioToolsEditorSystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<StudioToolsEditorSystemComponent, AZ::Component>();
+        }
+    }
+
+    StudioToolsEditorSystemComponent::StudioToolsEditorSystemComponent()
+    {
+        if (StudioToolsInterface::Get() == nullptr)
+        {
+            StudioToolsInterface::Register(this);
+        }
+    }
+
+    StudioToolsEditorSystemComponent::~StudioToolsEditorSystemComponent()
+    {
+        if (StudioToolsInterface::Get() == this)
+        {
+            StudioToolsInterface::Unregister(this);
+        }
+    }
+
+    void StudioToolsEditorSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC_CE("StudioToolsEditorService"));
+    }
+
+    void StudioToolsEditorSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC_CE("StudioToolsEditorService"));
+    }
+
+    void StudioToolsEditorSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+    }
+
+    void StudioToolsEditorSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+    }
+
+    void StudioToolsEditorSystemComponent::Activate()
+    {
+        StudioToolsRequestBus::Handler::BusConnect();
+    }
+
+    void StudioToolsEditorSystemComponent::Deactivate()
+    {
+        StudioToolsRequestBus::Handler::BusDisconnect();
+    }
+
+} // namespace StudioTools

+ 31 - 0
Gems/O3DE/StudioTools/Code/Source/Tools/StudioToolsEditorSystemComponent.h

@@ -0,0 +1,31 @@
+
+#pragma once
+#include <AzCore/Component/Component.h>
+#include <StudioTools/StudioToolsBus.h>
+
+
+namespace StudioTools
+{
+    /// System component for StudioTools editor
+    class StudioToolsEditorSystemComponent
+        : public StudioToolsRequestBus::Handler
+        , public AZ::Component
+    {
+    public:
+        AZ_COMPONENT(StudioToolsEditorSystemComponent, "{DB6B46EB-CAC0-4BD9-B33C-84F841542C58}");
+        static void Reflect(AZ::ReflectContext* context);
+
+        StudioToolsEditorSystemComponent();
+        ~StudioToolsEditorSystemComponent();
+
+    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();
+        void Deactivate();
+    };
+} // namespace StudioTools

+ 1 - 0
Gems/O3DE/StudioTools/Code/Source/Tools/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>

+ 4 - 0
Gems/O3DE/StudioTools/Code/Tests/Tools/StudioToolsEditorTest.cpp

@@ -0,0 +1,4 @@
+
+#include <AzTest/AzTest.h>
+
+AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV);

+ 5 - 0
Gems/O3DE/StudioTools/Code/studiotools_editor_api_files.cmake

@@ -0,0 +1,5 @@
+
+
+set(FILES
+    Include/StudioTools/StudioToolsBus.h
+)

+ 7 - 0
Gems/O3DE/StudioTools/Code/studiotools_editor_private_files.cmake

@@ -0,0 +1,7 @@
+
+set(FILES
+    Source/StudioToolsModuleInterface.h
+    Source/Tools/StudioToolsEditorSystemComponent.cpp
+    Source/Tools/StudioToolsEditorSystemComponent.h
+    Source/Tools/StudioTools.qrc
+)

+ 4 - 0
Gems/O3DE/StudioTools/Code/studiotools_editor_shared_files.cmake

@@ -0,0 +1,4 @@
+
+set(FILES
+    Source/Tools/StudioToolsEditorModule.cpp
+)

+ 4 - 0
Gems/O3DE/StudioTools/Code/studiotools_editor_tests_files.cmake

@@ -0,0 +1,4 @@
+
+set(FILES
+    Tests/Tools/StudioToolsEditorTest.cpp
+)

+ 24 - 0
Gems/O3DE/StudioTools/Configs/settings.json

@@ -0,0 +1,24 @@
+{
+	"LOAD_DOTENV": true,
+	"COMPANY": "Amazon",
+	"DCCSI_CONFIG_CORE": "True",
+	"DCCSI_GDEBUG": "False",
+	"DCCSI_DEV_MODE": "False",
+	"DCCSI_GDEBUGGER": "WING",
+	"DCCSI_LOGLEVEL": 20,
+	"DEFAULT_SETTINGS_PATHS": [
+		"settings.py",
+		"settings.json",
+		".secrets.py",
+		".secrets.json"
+	],
+	"DCCSI_IMAGE_TYPES": [
+		".tif",
+		".tiff",
+		".png",
+		".jpg",
+		".jpeg",
+		".tga",
+		".exr"
+	]
+}

+ 10 - 0
Gems/O3DE/StudioTools/Configs/settings.local.json.example

@@ -0,0 +1,10 @@
+{
+	"DCCSI_LOCAL_SETTINGS": "True",
+	"DCCSI_DEV_MODE": "True",
+	"DCCSI_GDEBUG": "True",
+	"DCCSI_LOGLEVEL": 10,
+	"O3DE_DEV": "C:\\depot\\o3de-dev",
+	"PATH_O3DE_3RDPARTY": "C:\\depot\\3rdParty",
+	"PATH_O3DE_BIN": "C:\\depot\\o3de-dev\\build\\bin\\profile",
+    "DCCSI_LOG_PATH": "{your_path}\\user\\log\\DCCsi"
+}

+ 9 - 0
Gems/O3DE/StudioTools/Editor/Scripts/__init__.py

@@ -0,0 +1,9 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+
+__ALL__ = ['bootstrap','studiotools_dialog']

+ 22 - 0
Gems/O3DE/StudioTools/Editor/Scripts/bootstrap.py

@@ -0,0 +1,22 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+"""StudioTools\\editor\\scripts\\boostrap.py
+Generated from O3DE PythonToolGem Template"""
+
+import az_qt_helpers
+import azlmbr.editor as editor
+from studiotools_dialog import StudioToolsDialog
+
+if __name__ == "__main__":
+    print("StudioTools.boostrap, Generated from O3DE PythonToolGem Template")
+
+    # Register our custom widget as a dockable tool with the Editor under an Examples sub-menu
+    options = editor.ViewPaneOptions()
+    options.showOnToolsToolbar = True
+    options.toolbarIcon = ":/StudioTools/toolbar_icon.svg"
+    az_qt_helpers.register_view_pane('StudioTools', StudioToolsDialog, category="Examples", options=options)

+ 44 - 0
Gems/O3DE/StudioTools/Editor/Scripts/studiotools_dialog.py

@@ -0,0 +1,44 @@
+"""
+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
+"""
+# -------------------------------------------------------------------------
+"""StudioTools\\editor\\scripts\\studiotools_dialog.py
+Generated from O3DE PythonToolGem Template"""
+
+from PySide2.QtCore import Qt
+from PySide2.QtWidgets import QDialog, QLabel, QVBoxLayout
+
+class StudioToolsDialog(QDialog):
+    def __init__(self, parent=None):
+        super(StudioToolsDialog, self).__init__(parent)
+
+        self.mainLayout = QVBoxLayout(self)
+
+        self.introLabel = QLabel("Put your cool stuff here!")
+
+        self.mainLayout.addWidget(self.introLabel, 0, Qt.AlignCenter)
+
+        self.helpText = str("For help getting started,"
+            "visit the <a href=\"https://o3de.org/docs/tools-ui/\">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")
+
+        self.helpLabel = QLabel()
+        self.helpLabel.setTextFormat(Qt.RichText)
+        self.helpLabel.setText(self.helpText)
+        self.helpLabel.setOpenExternalLinks(True)
+
+        self.mainLayout.addWidget(self.helpLabel, 0, Qt.AlignCenter)
+
+        self.setLayout(self.mainLayout)
+
+
+if __name__ == "__main__":
+    # Create a new instance of the tool if launched from the Python Scripts window,
+    # which allows for quick iteration without having to close/re-launch the Editor
+    test_dialog = StudioToolsDialog()
+    test_dialog.setWindowTitle("StudioTools")
+    test_dialog.show()
+    test_dialog.adjustSize()

+ 18 - 0
Gems/O3DE/StudioTools/Registry/assetprocessor_settings.setreg

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

+ 2 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/.gitignore

@@ -0,0 +1,2 @@
+Env_Dev.bat
+Solutions/

+ 73 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/Dev.bat

@@ -0,0 +1,73 @@
+@echo off
+
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+IF NOT "%DCCSI_ENV_DEV_INIT%"=="1" (
+	echo.
+	echo _____________________________________________________________________
+	echo.
+	echo ~    O3DE StudioTools, User Dev ...
+	echo ~    StudioTools\Tools\win\Dev.bat
+	echo _____________________________________________________________________
+	echo.
+)
+
+:: developers may have multiple repos, on different branch states
+:: this allows a dev to explicitly set the root engine path
+:: e.g. the nightly installer default is C:\O3DE\0.0.0.0
+:: set O3DE_DEV=C:\depot\o3de-dev
+
+:: the build folder for o3de binaries is not always known
+:: where it is in an installer release may be stable
+:: but for example, the nightly installer is pre-built and does not
+:: have a build folder location, just the binaries location
+:: C:\O3DE\0.0.0.0\bin\Windows\profile\Default
+
+:: For devs, my o3de engine-centric location
+set "O3DE_DEV=C:\depot\o3de-dev"
+echo     O3DE_DEV = %O3DE_DEV%
+
+:: engine developers may build in an engine centric way
+:: and configure a cmake build anywhere, this allows devs to set their
+:: build folder name (assuming it is in the engine root)
+
+:: this allows the full path to your build folder to be explicitly set
+:: this would work for also pointing to a project centric build location
+set "O3DE_BUILD_FOLDER=build\bin\profile"
+
+:: this allows the full path to your bin folder to be explicitly set
+set "PATH_O3DE_BIN=%O3DE_DEV%\%O3DE_BUILD_FOLDER%"
+echo     PATH_O3DE_BIN = %PATH_O3DE_BIN%
+
+:: this will enable additional debug behaviour within code
+:: this will in many cases cascade into settings like LogLevel
+:: note: expect things to become more verbose
+set DCCSI_GDEBUG=True
+
+:: this generally enables behaviour such as auto-start/connect debugger in entry points
+:: or may enable local tests that execute during operation
+set DCCSI_DEV_MODE=True
+
+:: This specifies the debugger to use for DEV_MODE
+:: note: currently only wing is supported (expanding this is future work)
+set DCCSI_GDEBUGGER=WING
+
+:: even though you can enable/disable debug logic
+:: this allows the logging level to be explicitly set (more verbose)
+:: I commonly set this to 10 even when I disbale the global debug flag
+set DCCSI_LOGLEVEL=10
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_ENV_DEV_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 74 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/Dev.bat.example

@@ -0,0 +1,74 @@
+@echo off
+
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi Env Dev ...
+echo _____________________________________________________________________
+echo.
+echo ~    local env settings
+echo.
+
+:: developers can add temporary/custom envar settings
+set O3DE_BUILD_FOO=True
+echo     O3DE_BUILD_FOO = %O3DE_BUILD_FOO%
+
+:: developers may have multiple repos, on different branch states
+:: this allows a dev to explicitly set the root engine path
+:: e.g. the nightly installer default is C:\O3DE\0.0.0.0
+:: set O3DE_DEV=C:\depot\o3de-dev
+
+:: the build folder for o3de binaries is not always known
+:: where it is in an installer release may be stable
+:: but for example, the nightly installer is pre-built and does not
+:: have a build folder location, just the binaries location
+:: C:\O3DE\0.0.0.0\bin\Windows\profile\Default
+
+set "O3DE_DEV=C:\depot\o3de-dev"
+
+:: engine developers may build in an engine centric way
+:: and configure a cmake build anywhere, this allows devs to set their
+:: build folder name (assuming it is in the engine root)
+set O3DE_BUILD_FOLDER=build
+
+:: this allows the full path to your build folder to be explicitly set
+:: this would work for also pointing to a project centric build location
+set "PATH_O3DE_BUILD=%O3DE_DEV%\%O3DE_BUILD_FOLDER%"
+echo     PATH_O3DE_BUILD = %PATH_O3DE_BUILD%
+
+:: this is the path down from the build folder to binaries
+set "O3DE_BIN_PATTERN=bin\profile"
+
+:: this allows the full path to your bin folder to be explicitly set
+set "PATH_O3DE_BIN=%PATH_O3DE_BUILD%\%O3DE_BIN_PATTERN%"
+echo     PATH_O3DE_BIN = %PATH_O3DE_BIN%
+
+:: this will enable additional debug behaviour within code
+:: this will in many cases cascade into settings like LogLevel
+:: note: expect things to become more verbose
+set DCCSI_GDEBUG=True
+echo     DCCSI_GDEBUG = %DCCSI_GDEBUG%
+
+:: this generally enables behaviour such as auto-start/connect debugger in entry points
+:: or may enable local tests that execute during operation
+set DCCSI_DEV_MODE=True
+echo     DCCSI_DEV_MODE = %DCCSI_DEV_MODE%
+
+:: This specifies the debugger to use for DEV_MODE
+:: note: currently only wing is supported (expanding this is future work)
+set DCCSI_GDEBUGGER=WING
+echo     DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER%
+
+:: even though you can enable/disable debug logic
+:: this allows the logging level to be explicitly set (more verbose)
+:: I commonly set this to 10 even when I disbale the global debug flag
+set DCCSI_LOGLEVEL=10
+echo     DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL%

+ 79 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/Launch_O3DE_PY.bat

@@ -0,0 +1,79 @@
+@echo off
+REM 
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Set up and run LY Python CMD prompt
+:: Sets up the DccScriptingInterface_Env,
+:: Puts you in the CMD within the dev environment
+
+:: Set up window
+TITLE O3DE DCCsi Launch pyBase
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi DCCSI_PY_BASE (python) ...
+echo _____________________________________________________________________
+echo.
+
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+::ETLOCAL ENABLEDELAYEDEXPANSION
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat
+
+:: Initialize env
+CALL %~dp0\Env_O3DE_Core.bat
+
+:: add to the PATH here (this is global)
+SET PATH=%PATH_O3DE_BIN%;%PATH_DCCSIG%;%PATH%
+
+CALL %~dp0\Env_O3DE_Python.bat
+
+:: add to the PYTHONPATH here (this is global)
+SET PATH=%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%PATH%
+
+:: add all python related paths to PYTHONPATH for package imports
+SET PYTHONPATH=%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BIN%;%PYTHONPATH%
+
+CALL %~dp0\Env_O3DE_Qt.bat
+
+SET PATH=%QTFORPYTHON_PATH%;%QT_PLUGIN_PATH%;%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%DCCSI_PY_IDE%;%PATH%
+SET PYTHONPATH=%QTFORPYTHON_PATH%;%QT_PLUGIN_PATH%;%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BUILD%;%PYTHONPATH%
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~     Starting O3DE python
+echo _____________________________________________________________________
+echo.
+
+echo.
+echo     PATH = %PATH%
+echo.
+echo     PYTHONPATH = %PYTHONPATH%
+
+:: Change to root dir
+CD /D %PATH_O3DE_PROJECT%
+
+call %DCCSI_PY_BASE% %*
+
+ENDLOCAL
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 81 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/Launch_O3DE_PY_Cmd.bat

@@ -0,0 +1,81 @@
+@echo off
+REM 
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Set up and run O3DE Python CMD prompt
+:: Sets up the DccScriptingInterface_Env,
+:: Puts you in the CMD within the dev environment
+
+:: Set up window
+TITLE O3DE DCC Scripting Interface Cmd
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi DCCSI_PY_BASE (python) CMD ...
+echo _____________________________________________________________________
+echo.
+
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+::SETLOCAL ENABLEDELAYEDEXPANSION
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat
+
+:: Initialize env
+CALL %~dp0O3DE_Core.bat
+
+:: add to the PATH here (this is global)
+SET PATH=%PATH_O3DE_BIN%;%PATH_DCCSIG%;%PATH%
+
+CALL %~dp0O3DE_Python.bat
+
+:: add to the PYTHONPATH here (this is global)
+SET PATH=%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%PATH%
+
+:: add all python related paths to PYTHONPATH for package imports
+SET PYTHONPATH=%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BIN%;%PYTHONPATH%
+
+CALL %~dp0O3DE_Qt.bat
+
+SET PATH=%QTFORPYTHON_PATH%;%QT_PLUGIN_PATH%;%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%DCCSI_PY_IDE%;%PATH%
+SET PYTHONPATH=%QTFORPYTHON_PATH%;%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BUILD%;%PYTHONPATH%
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Env_Dev.bat" CALL %~dp0Env_Dev.bat
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~     Starting O3DE DCCsi python CMD
+echo _____________________________________________________________________
+echo.
+
+echo.
+echo     PATH = %PATH%
+echo.
+echo     PYTHONPATH = %PYTHONPATH%
+echo.
+
+:: Change to root dir
+CD /D %PATH_O3DE_PROJECT%
+
+:: Create command prompt with environment
+CALL %windir%\system32\cmd.exe
+
+ENDLOCAL
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 154 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Core.bat

@@ -0,0 +1,154 @@
+@echo off
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Sets up environment for Lumberyard DCC tools and code access
+
+:: Set up window
+TITLE O3DE StudioTools Core
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+:: Skip initialization if already completed
+IF "%DCCSI_ENV_INIT%"=="1" GOTO :END_OF_FILE
+
+:: Store current dir
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+::SETLOCAL ENABLEDELAYEDEXPANSION
+
+:: if the user has set up a custom env call it
+IF EXIST "%~dp0Dev.bat" CALL %~dp0Dev.bat
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE StudioTools (DCCsi), Core Environment ...
+echo _____________________________________________________________________
+echo.
+
+IF "%DCCSI_CORE_ENV%"=="" (set DCCSI_CORE_ENV=%~dp0)
+echo     DCCSI_CORE_ENV = %DCCSI_CORE_ENV%
+
+:: add to the PATH
+SET PATH=%DCCSI_CORE_ENV%;%PATH%
+
+:: Constant Vars (Global)
+:: global debug flag (propogates)
+:: The intent here is to set and globally enter a debug mode
+IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false)
+echo     DCCSI_GDEBUG = %DCCSI_GDEBUG%
+:: initiates earliest debugger connection
+:: we support attaching to WingIDE... PyCharm and VScode in the future
+IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false)
+echo     DCCSI_DEV_MODE = %DCCSI_DEV_MODE%
+:: sets debugger, options: WING, PYCHARM
+IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING)
+echo     DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER%
+:: Default level logger will handle
+:: Override this to control the setting
+:: CRITICAL:50
+:: ERROR:40
+:: WARNING:30
+:: INFO:20
+:: DEBUG:10
+:: NOTSET:0
+IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20)
+echo     DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL%
+
+IF "%DCCSI_TESTS%"=="" (set DCCSI_TESTS=false)
+echo     DCCSI_TESTS = %DCCSI_TESTS%
+
+:: You can define the project name
+IF "%O3DE_PROJECT%"=="" (
+    for %%a in (%CD%..\..\..\..) do set O3DE_PROJECT=%%~na
+        )
+echo     O3DE_PROJECT = %O3DE_PROJECT%
+
+:: set up the default project path (dccsi)
+:: if not set we also use the DCCsi path as stand-in
+CD /D ..\..\..\
+IF "%PATH_O3DE_PROJECT%"=="" (set "PATH_O3DE_PROJECT=%CD%")
+echo     PATH_O3DE_PROJECT = %PATH_O3DE_PROJECT%
+
+:: Save current directory and change to target directory
+IF "%ABS_PATH%"=="" (set "ABS_PATH=%PATH_O3DE_PROJECT%")
+pushd %ABS_PATH%
+
+IF "%O3DE_DEV%"=="" (
+    echo       ~ O3DE_DEV is not set aka engine_root
+    echo       ~ set O3DE_DEV in Dev.bat
+    echo       ~ example: set "O3DE_DEV=C:\O3DE\0.0.0.0"
+    set O3DE_DEV=C:\not\set\o3de
+        )
+
+rem IF "%O3DE_DEV%"=="" (set "O3DE_DEV=< not set >")
+rem echo     O3DE_DEV = %O3DE_DEV%
+rem :: Restore original directory
+rem popd
+
+IF "%PATH_O3DE_USERHOME%"=="" (set "PATH_O3DE_USERHOME=%userprofile%\.o3de")
+echo     PATH_O3DE_USERHOME = %PATH_O3DE_USERHOME%
+
+:: We need to know where the engine 3rdParty folder is to add access for PySide2, etc
+:: Adding 3rdParty location, default is something like c:\users\< user>\.o3de\3rdparty
+IF "%PATH_O3DE_3RDPARTY%"=="" (set "PATH_O3DE_3RDPARTY=%PATH_O3DE_USERHOME%\3rdparty")
+echo     PATH_O3DE_3RDPARTY = %PATH_O3DE_3RDPARTY%
+
+IF "%PATH_O3DE_USER_LOGS%"=="" (set "PATH_O3DE_USER_LOGS==%PATH_O3DE_USERHOME%\Logs")
+echo     PATH_O3DE_USER_LOGS = %PATH_O3DE_USER_LOGS%
+
+:: O3DE Technical Art Gems Location
+set "PATH_O3DE_TECHART_GEMS=%ABS_PATH%\..\.."
+FOR /F "delims=" %%F IN ("%PATH_O3DE_TECHART_GEMS%") DO SET "PATH_O3DE_TECHART_GEMS=%%~fF"
+echo     PATH_O3DE_TECHART_GEMS = %PATH_O3DE_TECHART_GEMS%
+
+:: dcc scripting interface gem path
+:: currently know relative path to this gem
+set "PATH_DCCSIG=%PATH_O3DE_TECHART_GEMS%\O3DE\StudioTools"
+echo     PATH_DCCSIG = %PATH_DCCSIG%
+
+set "PATH_DCCSIG_TOOLS=%PATH_DCCSIG%\Tools"
+echo     PATH_DCCSIG_TOOLS = %PATH_DCCSIG_TOOLS%
+
+:: Change to DCCsi root dir
+CD /D %PATH_DCCSIG_TOOLS%
+
+:: dccsi DCC tools path
+set "PATH_DCCSI_TOOLS_DCC=%PATH_O3DE_TECHART_GEMS%\DCC"
+echo     PATH_DCCSI_TOOLS_DCC = %PATH_DCCSI_TOOLS_DCC%
+
+:: dccsi IDE tools path
+set "PATH_DCCSI_TOOLS_IDE=%PATH_O3DE_TECHART_GEMS%\IDE"
+echo     PATH_DCCSI_TOOLS_IDE = %PATH_DCCSI_TOOLS_IDE%
+
+:: temp log location specific to this gem
+set "DCCSI_LOG_PATH=%PATH_O3DE_USER_LOGS%\dccsi"
+echo     DCCSI_LOG_PATH = %DCCSI_LOG_PATH%
+
+:: This is the default bin path pattern for installer builds
+IF "%O3DE_BUILD_FOLDER%"=="" (set "O3DE_BUILD_FOLDER=bin\Windows\profile\Default")
+echo     O3DE_BUILD_FOLDER = %O3DE_BUILD_FOLDER%
+
+:: for reference the nightly engine sdk bin path looks like:
+:: C:\O3DE\0.0.0.0\bin\Windows\profile\Default
+IF "%PATH_O3DE_BIN%"=="" (set "PATH_O3DE_BIN=%O3DE_DEV%\%O3DE_BUILD_FOLDER%")
+echo     PATH_O3DE_BIN = %PATH_O3DE_BIN%
+
+::ENDLOCAL
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_ENV_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 93 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Python.bat

@@ -0,0 +1,93 @@
+@echo off
+REM 
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Sets up extended environment for O3DE and DCCsi python
+
+:: Skip initialization if already completed
+IF "%DCCSI_ENV_PY_INIT%"=="1" GOTO :END_OF_FILE
+
+:: Store current dir
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+IF EXIST "%~dp0O3DE_Core.bat" CALL %~dp0O3DE_Core.bat
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE StudioTools (DCCsi), Python Environment ...
+echo _____________________________________________________________________
+echo.
+
+:: this is the default env setup for O3DE python
+:: we will attempt to avoid causing conflicts in DCC tools with their
+:: own python (which is most of them)
+
+:: Python Version
+:: Ideally these are set to match the O3DE python distribution
+:: <O3DE>\python\runtime
+
+:: shared location for default O3DE python location
+IF "%PATH_O3DE_PYTHON_INSTALL%"=="" (set "PATH_O3DE_PYTHON_INSTALL=%O3DE_DEV%\python")
+echo     PATH_O3DE_PYTHON_INSTALL = %PATH_O3DE_PYTHON_INSTALL%
+
+:: will set O3DE_PYTHONHOME location
+IF EXIST "%PATH_O3DE_PYTHON_INSTALL%\get_python_path.bat" CALL %PATH_O3DE_PYTHON_INSTALL%\get_python_path.bat
+
+:: location for O3DE python 3.10 location 
+:: Note, many DCC tools (like Maya) include thier own python interpreter
+:: Some DCC apps may not operate correctly if PYTHONHOME is set (this is definitely the case with Maya)
+:: Be aware the python.cmd below does set PYTHONHOME
+IF "%DCCSI_PY_BASE%"=="" (set "DCCSI_PY_BASE=%PATH_O3DE_PYTHON_INSTALL%\python.cmd")
+echo     DCCSI_PY_BASE = %DCCSI_PY_BASE%
+
+:: ide and debugger plug
+IF "%DCCSI_PY_DEFAULT%"=="" (set "DCCSI_PY_DEFAULT=%PATH_O3DE_PYTHON_INSTALL%\python.cmd")
+echo     DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT%
+
+:: Some IDEs like Wing, may in some cases need acess directly to the exe to operate correctly
+:: ide and debugger plug
+IF "%DCCSI_PY_IDE%"=="" (set "DCCSI_PY_IDE=%O3DE_PYTHONHOME%\python.exe")
+echo     DCCSI_PY_IDE = %DCCSI_PY_IDE%
+
+FOR /F "tokens=* USEBACKQ" %%F IN (`%DCCSI_PY_DEFAULT% %PATH_DCCSIG%\Tools\return_sys_version_major.py`) DO (SET DCCSI_PY_VERSION_MAJOR=%%F)
+echo     DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR%
+
+FOR /F "tokens=* USEBACKQ" %%F IN (`%DCCSI_PY_DEFAULT% %PATH_DCCSIG%\Tools\return_sys_version_minor.py`) DO (SET DCCSI_PY_VERSION_MINOR=%%F)
+echo     DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR%
+
+:: shared location for 64bit python 3.10 DEV location
+:: this defines a DCCsi sandbox for lib site-packages by version
+:: C:\Users\< user >\.o3de\3rdParty\DCCsi\Python
+set "PATH_DCCSI_PYTHON=%PATH_O3DE_3RDPARTY%\Dccsi\Python"
+echo     PATH_DCCSI_PYTHON = %PATH_DCCSI_PYTHON%
+
+:: add access to a Lib location that matches the py version (example: 3.10.x)
+:: switch this for other python versions like maya (2.7.x)
+IF "%PATH_DCCSI_PYTHON_LIB%"=="" (set "PATH_DCCSI_PYTHON_LIB=%PATH_DCCSI_PYTHON%\Lib\%DCCSI_PY_VERSION_MAJOR%.x\%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.x\site-packages")
+echo     PATH_DCCSI_PYTHON_LIB = %PATH_DCCSI_PYTHON_LIB%
+
+:: we should NOT add to the PATH here (this is global)
+:: setting PATH should be move to Launch .bat files 
+:::SET PATH=%PATH_DCCSI_PYTHON_LIB%;%PATH%
+
+:: O3DE installs additional python pkgs from 3rd party and other locations
+:: See: C:\path\to\o3de\python\runtime\python-x.x.x-revX-windows\python\Lib\site-packages\easy-install.pth
+
+::ENDLOCAL
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_ENV_PY_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 58 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/O3DE_Qt.bat

@@ -0,0 +1,58 @@
+@echo off
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Skip initialization of QT if already completed
+IF "%DCCSI_ENV_QT_INIT%"=="1" GOTO :END_OF_FILE
+
+:: Store current dir
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+CALL %~dp0O3DE_Core.bat
+CALL %~dp0O3DE_Python.bat
+
+::SETLOCAL ENABLEDELAYEDEXPANSION
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi Qt/PySide2 Environment ...
+echo _____________________________________________________________________
+echo.
+
+:: These need to be ADDED to any env or launcher that needs Qt/PySide2 access
+:: This bootstraps O3DE Qt binaraies and PySide2 packages (which likely won't work in other versions of python)
+:: If you set these in the env.bat it may cause some Qt apps like WingIDE from starting correctly (Wing is a Qt app)
+:: Those apps provide their own Qt bins and Pyside packages (Wing, Substance, Maya, etc.)
+:: set up Qt/Pyside paths
+
+:: set up PySide2/Shiboken
+:: notice: the way Qy/PySide2/shiboken2 are set up has changed for release 2210
+
+set "QT_BIN_DIR=packages\qt-5.15.2-rev7-windows\qt\bin"
+
+IF "%QT_PLUGIN_PATH%"=="" (set "QT_PLUGIN_PATH=%PATH_O3DE_3RDPARTY%\%QT_BIN_DIR%")
+echo     QT_PLUGIN_PATH = %QT_PLUGIN_PATH%
+
+set "QTPY_PKG_DIR=packages\pyside2-5.15.2.1-py3.10-rev3-windows\pyside2\lib\site-packages"
+
+IF "%QTFORPYTHON_PATH%"=="" (set "QTFORPYTHON_PATH=%PATH_O3DE_3RDPARTY%\%QTPY_PKG_DIR%")
+echo     QTFORPYTHON_PATH = %QTFORPYTHON_PATH%
+
+::ENDLOCAL
+
+:: Set flag so we don't initialize dccsi environment twice
+SET DCCSI_ENV_QT_INIT=1
+GOTO END_OF_FILE
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 141 - 0
Gems/O3DE/StudioTools/Tools/Env/Win/readme.md

@@ -0,0 +1,141 @@
+# O3DE (Open 3D Engine)
+
+O3DE (Open 3D Engine) is an open-source, real-time, multi-platform 3D engine that enables developers and content creators to build AAA games, cinema-quality 3D worlds, and high-fidelity simulations without any fees or commercial obligations.
+
+## O3DE DCCsi Dev Windows Enviroments
+
+DccScriptingInterface (DCCsi) is a framework for O3DE extensions, for example:
+
+- Lightweight python integrations with DCC tools like Maya
+- O3DE configuration, customization and extensions of tools
+- Standalone PySide2/Qt tools
+- ^ These might utilize a mix of O3DE and DDC python APIs
+
+The DccScriptingInterface\config.py, procedurally provides a synthetic env context.
+This env is a data-driven approach to configuring layered and managed env settings.
+
+This env provides the hooks for DDC apps and/or standalone tools, to configure acess to O3DE code (for boostrapping), safely retreive known paths, set/get developer flags, etc.
+
+- < O3DE >/DccScriptingInterface/Tools/Dev/Windows/*
+
+This is a .bat file based version of the default env context for development on windows.
+( there is a synthetic/dynamic/procedural env config and settings: < DCCsi >/config.py )
+
+This is what we currently use to boot the default env context such that it is available, when launching a development tool such as a IDE or a DCC tool. The .bat env was stood up first, the value in doing so is to work out the dependancies and kinks and provide a viable development environment in which to create solutions like the dynamic config.py, if that syntehetic environment is broken we always have this fallback, this allows a developer to troubleshoot/debug code, like making changes to < DCCsi >/config.py
+
+Other tools, can use config.py to stand up the env context.
+
+What is in this folder ...
+
+### Core env modules
+
+```bash
+Env_O3DE_Core.bat       : core access to O3DE and DCCsi
+Env_O3DE_Python.bat     : access to O3DE python and general py configuration
+Env_O3DE_Qt.bat         : access to O3DE Qt .dll files and PySide2
+```
+
+### DCC add on envars
+
+```bash
+Env_DCC_Maya.bat        : configures Maya with code O3DE/DCCsi access
+Env_DCC_Blender.bat     : configures Blender
+Env_DCC_Substance.bat   : Configures Substance Designer
+```
+
+### IDE env
+
+```bash
+Env_IDE_Wing.bat        : configures WingIDE for DCCsi development
+Env_IDE_VScode.bat      : configures VScode
+Env_IDE_PyCharm.bat     : configures PyCharm
+```
+
+### Core Env Launchers
+
+```bash
+Launch_O3DE_PY_Cmd.bat  : Starts a cmd with core managed env context
+                        : ^ allows user to validate env
+                        : ^ display all default ENVAR plugs
+                        : ^ allows user to test O3DE python + scripts from cmd
+Launch_O3DE_PY.bat      : Starts o3de python with same access as above
+                        : ^ for instance, test Dccsi\config.py like this:
+                        : {DCCsi prommpt}>python config.py
+```
+
+### DCC Launchers
+
+A set of DCC tool launchers are here, these init the env and then launch the tool within the managed env context:
+
+- < O3DE >/DccScriptingInterface/Tools/Dev/Windows/DCC/*
+- Launch_Maya_2020.bat    : Starts Maya2020 within managed env context
+
+### IDE Launchers
+
+A set of IDE launchers for developers are here, these init the env and then launch the IDE within the managed env context:
+
+- < O3DE >/DccScriptingInterface/Tools/Dev/Windows/IDE/*
+- Launch_WindIDE-7-1.bat  : Starts WingIDE  within managed env context
+
+Note: per-tool launchers will be moved into the tools directory and these may be deprecated in the future. We will maintain them in both places for now diring the transition.
+
+### Instructions
+
+How to test the synthetic environment and settings externally
+
+1. Option 1) Run the DCCsi cmd: < O3DE >/DccScriptingInterface/Tools/Dev/Windows/__Launch_O3DE_PY_Cmd__.bat
+
+    - CWD: C:\< O3DE >\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface>
+    - Run command (prompt):>python config.py -dm=True -py=True -qt=True -tp=True
+
+    - Note: using this route, will test how .bat envar hooks interact with code (.bat envars should propogate)
+
+    - Additionally there are patterns for devs to locally alter the env without code:
+        - < DCCsi >/Tools/Dev/Windows/Env_dev.bat   (interacts directly with .bat env)
+        - < DCCsi >/.env                            (dev global envar override, mainly for testing)
+        - < DCCsi >/settings.local.json             (cache of local settings, new values are persistant)
+
+2. Option 2) Opn a command prompt from this location: "C:\< O3DE >\python\"
+
+    - CWD: C:\< O3DE >\python>
+    - Run command (prompt):>python "C:\Depot\o3de-dev\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\config.py" -dm=True -py=True -qt=True -tp=True
+
+    - Note: using this route, config.py will synthetically derive the env context (no use of .bat files)
+
+__What this does?__
+
+Here is a rundown of what is happeneing:
+
+- runs the O3DE python exe
+- starts the config.py which begins to procedurally create synthetic/dynamic environment (hooks)
+- ^ this starts with DCCsi hooks
+- arg: -dm=True, enters 'dev mode'(-dm) and attempts to attach debugger (Wing IDE only for now, others planned)
+- arg: -py=True, enables additional O3DE python hooks and code access
+- ^ great for standalone tools, but you don't want that functionality to interfer with other DCC tools python environments (like Maya!)
+- arg: -qt=True, enables access to O3DE Qt .dlls and PySide2 python package support(-qt)
+- ^ great for standalone PySide2 which can operate outside of the O3DE editor
+- arg: -tp=True, will run a PySide2 test (pop-up button) to validate access
+- note: config.py has a number of other cli args you may find useful
+
+__What does this look like?__
+Using just these basic options (no -dm, devmode): -py=True -qt=True -tp=True
+The synthetic environment looks like:
+![image](https://user-images.githubusercontent.com/23222931/154307884-752875dd-060c-4f83-88f0-ff4fe574d744.png)
+
+## Contribute
+
+For information about contributing to Open 3D Engine, visit [https://o3de.org/docs/contributing/](https://o3de.org/docs/contributing/).
+
+## License
+
+For terms please see the LICENSE*.TXT files at the root of this distribution.
+
+---
+LICENSE INFO
+
+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
+
+---

+ 78 - 0
Gems/O3DE/StudioTools/Tools/dccsi.cmd

@@ -0,0 +1,78 @@
+@echo off
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+:: Set up and run O3DE Python CMD prompt
+:: Sets up the DccScriptingInterface_Env,
+:: Puts you in the CMD within the dev environment
+
+:: Set up window
+TITLE O3DE DCC Scripting Interface Cmd
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE StudioTools (DCCsi), Env CMD ...
+echo _____________________________________________________________________
+echo.
+
+SETLOCAL ENABLEDELAYEDEXPANSION
+
+%~d0
+cd %~dp0
+PUSHD %~dp0
+
+SET PATH_DCCSIG_ENV_WIN=%CD%\Env\Win
+echo     PATH_DCCSIG_ENV_WIN = %PATH_DCCSIG_ENV_WIN%
+
+:: Initialize env
+CALL %PATH_DCCSIG_ENV_WIN%\O3DE_Core.bat
+
+:: add to the PATH here (this is global)
+SET PATH=%PATH_O3DE_BIN%;%PATH_DCCSIG%;%PATH%
+
+CALL %PATH_DCCSIG_ENV_WIN%\O3DE_Python.bat
+
+:: add to the PYTHONPATH here (this is global)
+SET PATH=%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%PATH%
+
+:: add all python related paths to PYTHONPATH for package imports
+SET PYTHONPATH=%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BIN%;%PYTHONPATH%
+
+CALL %PATH_DCCSIG_ENV_WIN%\O3DE_Qt.bat
+
+SET PATH=%QT_PLUGIN_PATH%;%QTFORPYTHON_PATH%;%PATH_O3DE_PYTHON_INSTALL%;%O3DE_PYTHONHOME%;%DCCSI_PY_IDE%;%PATH%
+SET PYTHONPATH="%QT_PLUGIN_PATH%;%QTFORPYTHON_PATH%;%PATH_DCCSIG%;%PATH_DCCSI_PYTHON_LIB%;%PATH_O3DE_BUILD%;%PYTHONPATH%
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~     Starting O3DE DCCsi python CMD
+echo _____________________________________________________________________
+echo.
+
+echo.
+echo     PATH = %PATH%
+echo.
+echo     PYTHONPATH = %PYTHONPATH%
+echo.
+
+:: Change to root dir
+CD /D %PATH_O3DE_PROJECT%
+
+:: Create command prompt with environment
+CALL %windir%\system32\cmd.exe
+
+ENDLOCAL
+
+:: Return to starting directory
+POPD
+
+:END_OF_FILE

+ 99 - 0
Gems/O3DE/StudioTools/Tools/python.cmd

@@ -0,0 +1,99 @@
+@ECHO OFF
+REM
+REM Copyright (c) Contributors to the Open 3D Engine Project.
+REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
+REM
+REM SPDX-License-Identifier: Apache-2.0 OR MIT
+REM
+REM
+
+REM This script provides a single entry point that you can trust is present.
+REM Depending on this entry point instead of trying to find a python.exe
+REM In a subfolder allows you to keep working if the version of python changes or
+REM other environmental requirements change.
+REM When the project switches to a new version of Python, this file will be updated.
+
+:: Set up window
+TITLE O3DE DCC Scripting Interface Python.cmd
+:: Use obvious color to prevent confusion (Grey with Yellow Text)
+COLOR 8E
+
+echo.
+echo _____________________________________________________________________
+echo.
+echo ~    O3DE DCCsi Python.cmd ...
+echo _____________________________________________________________________
+echo.
+
+SETLOCAL
+SET CMD_DIR=%~dp0
+SET CMD_DIR=%CMD_DIR:~0,-1%
+
+IF "%PATH_DCCSIG%"=="" (set "PATH_DCCSIG=%CMD_DIR%")
+echo     PATH_DCCSIG = %PATH_DCCSIG%
+
+:: Change to DCCsi root dir
+CD /D %PATH_DCCSIG%
+
+IF "%PATH_O3DE_PROJECT%"=="" (set "PATH_O3DE_PROJECT=%PATH_DCCSIG%")
+
+:: This maps up to the o3de root folder
+IF "%O3DE_REL_PATH%"=="" (set "O3DE_REL_PATH=..\..\..\..")
+
+:: Change to root o3de folder
+CD /d %O3DE_REL_PATH%
+IF "%O3DE_DEV%"=="" (set "O3DE_DEV=%CD%")
+:: Restore original directory
+popd
+
+SET O3DE_PYTHON=%O3DE_DEV%\python
+echo     O3DE_PYTHON = %O3DE_PYTHON%
+
+:: O3DE Technical Art Gems Location
+IF "%PATH_O3DE_TECHART_GEMS%"=="" (set "PATH_O3DE_TECHART_GEMS=%O3DE_DEV%\Gems\AtomLyIntegration\TechnicalArt")
+echo     PATH_O3DE_TECHART_GEMS = %PATH_O3DE_TECHART_GEMS%
+
+:: O3DE DccScriptingInterface Gem location
+IF "%PATH_DCCSIG%"=="" (set "DccScriptingInterface")
+echo     PATH_DCCSIG = %PATH_DCCSIG%
+
+SET PATH=%O3DE_DEV%;%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PATH%
+SET PYTHONPATH=%O3DE_DEV%;%PATH_O3DE_TECHART_GEMS%;%PATH_DCCSIG%;%PYTHONPATH%
+
+:: get the o3de python home
+FOR /F "tokens=* USEBACKQ" %%F IN (`%O3DE_PYTHON%\python.cmd %O3DE_PYTHON%\get_python_path.py`) DO (SET O3DE_PYTHONHOME=%%F)
+
+IF EXIST "%O3DE_PYTHONHOME%" GOTO PYTHONHOME_EXISTS
+
+ECHO Python not found in %O3DE_PYTHON%
+ECHO Try running %O3DE_PYTHON%\get_python.bat first.
+exit /B 1
+
+:PYTHONHOME_EXISTS
+
+SET PYTHON=%O3DE_PYTHONHOME%\python.exe
+echo     PYTHON = %PYTHON%
+
+SET PYTHON_ARGS=%*
+
+IF [%1] EQU [debug] (
+    SET PYTHON=%O3DE_PYTHONHOME%\python_d.exe
+    SET PYTHON_ARGS=%PYTHON_ARGS:~6%
+)
+
+IF EXIST "%PYTHON%" GOTO PYTHON_EXISTS
+
+ECHO Could not find python executable at %PYTHON%
+exit /B 1
+
+:PYTHON_EXISTS
+
+:: Change to root dir
+CD /D %PATH_DCCSIG%
+
+echo _____________________________________________________________________
+echo.
+
+SET PYTHONNOUSERSITE=1
+"%PYTHON%" %PYTHON_ARGS%
+exit /B %ERRORLEVEL%

+ 35 - 0
Gems/O3DE/StudioTools/Tools/python.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# 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
+#
+
+SOURCE="${BASH_SOURCE[0]}"
+# While $SOURCE is a symlink, resolve it
+while [[ -h "$SOURCE" ]]; do
+    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+    SOURCE="$( readlink "$SOURCE" )"
+    # If $SOURCE was a relative symlink (so no "/" as prefix, need to resolve it relative to the symlink base directory
+    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
+done
+DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+
+if [[ "$OSTYPE" == *"darwin"* ]]; then
+    PYTHON=$DIR/../../../../runtime/python-3.10.5-rev2-darwin/Python.framework/Versions/3.10/bin/python3
+elif [[ "$OSTYPE" == "msys" ]]; then
+    PYTHON=$DIR/../../../../runtime/python-3.10.5-rev1-windows/python/python.exe
+else
+    PYTHON=$DIR/../../../../runtime/python-3.10.5-rev2-linux/python/bin/python
+fi
+
+if [[ -e "$PYTHON" ]];
+then
+    PYTHONNOUSERSITE=1 "$PYTHON" "$@"
+    exit $?
+fi
+
+echo "Python not found in $DIR/../../../.."
+echo "Try running $DIR/../../../../get_python.sh first."
+exit 1

+ 13 - 0
Gems/O3DE/StudioTools/Tools/return_sys_version_major.py

@@ -0,0 +1,13 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""retreive the O3DE python path"""
+import sys
+print(f"{sys.version_info.major}")

+ 13 - 0
Gems/O3DE/StudioTools/Tools/return_sys_version_minor.py

@@ -0,0 +1,13 @@
+# coding:utf-8
+#!/usr/bin/python
+#
+# 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
+#
+#
+# -------------------------------------------------------------------------
+"""retreive the O3DE python path"""
+import sys
+print(f"{sys.version_info.minor}")

+ 1 - 0
Gems/O3DE/StudioTools/dccsi/__init__.py

@@ -0,0 +1 @@
+

+ 30 - 0
Gems/O3DE/StudioTools/gem.json

@@ -0,0 +1,30 @@
+{
+    "gem_name": "StudioTools",
+    "display_name": "Studio Tools ",
+    "license": "MIT",
+    "license_url": "https://opensource.org/licenses/MIT",
+    "origin": "HogJonny-AMZN",
+    "origin_url": "https://github.com/HogJonny-AMZN/o3de-dccsi-sandbox",
+    "type": "Code",
+    "summary": "Core Gem for DCC Toolchain development.",
+    "canonical_tags": [
+        "Gem"
+    ],
+    "user_tags": [
+        "Python",
+        "StudioTools",
+        "DCC"
+    ],
+    "platforms": [
+        "Linux",
+        "Windows"
+    ],
+    "icon_path": ".",
+    "requirements": "",
+    "documentation_url": "",
+    "dependencies": [
+        "QtForPython"
+    ],
+    "repo_uri": "https://github.com/HogJonny-AMZN/o3de-dccsi-sandbox",
+    "restricted": "StudioTools"
+}

+ 3 - 0
Gems/O3DE/StudioTools/preview.png

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

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff