Просмотр исходного кода

Merged stabilization/2106 -> development (resolved merge conflicts).

Signed-off-by: Chris Galvan <[email protected]>
Chris Galvan 4 лет назад
Родитель
Сommit
3b1873b045
100 измененных файлов с 477 добавлено и 701 удалено
  1. 13 0
      AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
  2. 1 0
      AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py
  3. 0 3
      AutomatedTesting/Gem/Resources/CryEngineLogoLauncher.bmp
  4. 2 2
      AutomatedTesting/Gem/Resources/GameSDK.ico
  5. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadAppIcon152x152.png
  6. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadAppIcon76x76.png
  7. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadProAppIcon167x167.png
  8. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSettingsIcon29x29.png
  9. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSettingsIcon58x58.png
  10. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSpotlightIcon40x40.png
  11. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSpotlightIcon80x80.png
  12. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneAppIcon120x120.png
  13. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneAppIcon180x180.png
  14. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSettingsIcon58x58.png
  15. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSettingsIcon87x87.png
  16. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSpotlightIcon120x120.png
  17. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSpotlightIcon80x80.png
  18. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadAppIcon152x152.png
  19. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadAppIcon76x76.png
  20. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadProAppIcon167x167.png
  21. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSettingsIcon29x29.png
  22. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSettingsIcon58x58.png
  23. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSpotlightIcon40x40.png
  24. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSpotlightIcon80x80.png
  25. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneAppIcon120x120.png
  26. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneAppIcon180x180.png
  27. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSettingsIcon58x58.png
  28. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSettingsIcon87x87.png
  29. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSpotlightIcon120x120.png
  30. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSpotlightIcon80x80.png
  31. 1 37
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/Contents.json
  32. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage1024x768.png
  33. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage1536x2048.png
  34. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage2048x1536.png
  35. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage768x1024.png
  36. 0 3
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage1242x2688.png
  37. 0 3
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage1792x828.png
  38. 0 3
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage2688x1242.png
  39. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage640x1136.png
  40. 2 2
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage640x960.png
  41. 0 3
      AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage828x1792.png
  42. 3 0
      AutomatedTesting/Gem/Resources/LegacyLogoLauncher.bmp
  43. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/Contents.json
  44. 0 3
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png
  45. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128.png
  46. 0 0
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128_2x.png
  47. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_16.png
  48. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_16_2x.png
  49. 0 3
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png
  50. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256.png
  51. 0 0
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256_2x.png
  52. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_32.png
  53. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_32_2x.png
  54. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_512.png
  55. 2 2
      AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_512_2x.png
  56. 0 6
      Code/Editor/Plugins/EditorCommon/EditorCommon.def
  57. BIN
      Code/Editor/Plugins/EditorCommon/res/EditorCommon.rc2
  58. 0 10
      Code/Editor/Plugins/QtMocRule.props
  59. 0 46
      Code/Editor/Plugins/QtMocRule.targets
  60. 0 74
      Code/Editor/Plugins/QtMocRule.xml
  61. 0 10
      Code/Editor/Plugins/QtRccRule.props
  62. 0 46
      Code/Editor/Plugins/QtRccRule.targets
  63. 0 74
      Code/Editor/Plugins/QtRccRule.xml
  64. 0 10
      Code/Editor/Plugins/QtUicRule.props
  65. 0 47
      Code/Editor/Plugins/QtUicRule.targets
  66. 0 74
      Code/Editor/Plugins/QtUicRule.xml
  67. 1 0
      Code/Editor/RenderViewport.h
  68. 1 1
      Code/Editor/TrackView/AtomOutputFrameCapture.cpp
  69. 0 4
      Code/Editor/editor_lib_files.cmake
  70. 0 3
      Code/Editor/res/about_dark.bmp
  71. 0 3
      Code/Editor/res/logo.bmp
  72. 0 3
      Code/Editor/res/logo.gif
  73. 0 3
      Code/Editor/res/sandbox_dark.bmp
  74. 0 3
      Code/Editor/res/sb_welcome_dark.bmp
  75. 1 1
      Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp
  76. 2 2
      Code/Framework/AzFramework/AzFramework/Physics/Material.cpp
  77. 2 2
      Code/Framework/AzFramework/AzFramework/Physics/Material.h
  78. 11 0
      Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp
  79. 2 0
      Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h
  80. 8 0
      Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h
  81. 32 1
      Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp
  82. 12 7
      Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp
  83. 4 0
      Code/Framework/AzQtComponents/AzQtComponents/Components/Style.cpp
  84. 1 0
      Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss
  85. 21 0
      Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MessageBox.qss
  86. 5 4
      Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
  87. 15 0
      Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp
  88. 6 0
      Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp
  89. 2 0
      Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h
  90. 2 0
      Code/LauncherUnified/launcher_generator.cmake
  91. 189 56
      Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli
  92. 8 9
      Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli
  93. 6 8
      Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli
  94. 4 2
      Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h
  95. 11 29
      Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp
  96. 3 2
      Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h
  97. 2 16
      Gems/Atom/Feature/Common/Code/Source/LuxCore/LuxCoreTexturePass.cpp
  98. 2 0
      Gems/Atom/RHI/Code/Source/RHI/RayTracingPipelineState.cpp
  99. 2 0
      Gems/Atom/RPI/Code/CMakeLists.txt
  100. 20 3
      Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h

+ 13 - 0
AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt

@@ -103,6 +103,19 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
             AZ::AssetBundlerBatch
     )
 
+    ly_add_pytest(
+        NAME AssetPipelineTests.AssetBundler_SandBox
+        TEST_SUITE sandbox
+        PATH ${CMAKE_CURRENT_LIST_DIR}/asset_bundler_batch_tests.py
+        PYTEST_MARKS "SUITE_sandbox" # run only sandbox tests in this file
+        EXCLUDE_TEST_RUN_TARGET_FROM_IDE
+        TEST_SERIAL 
+        TIMEOUT 1500
+        RUNTIME_DEPENDENCIES
+            AZ::AssetProcessor
+            AZ::AssetBundlerBatch
+    )
+
     ly_add_pytest(
         NAME AssetPipelineTests.AssetBuilder
         PATH ${CMAKE_CURRENT_LIST_DIR}/asset_builder_tests.py

+ 1 - 0
AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py

@@ -730,6 +730,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
 
     @pytest.mark.BAT
     @pytest.mark.assetpipeline
+    @pytest.mark.SUITE_sandbox
     @pytest.mark.test_case_id("C16877174")
     @pytest.mark.test_case_id("C16877175")
     @pytest.mark.test_case_id("C16877178")

+ 0 - 3
AutomatedTesting/Gem/Resources/CryEngineLogoLauncher.bmp

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

+ 2 - 2
AutomatedTesting/Gem/Resources/GameSDK.ico

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:61efd8df621780af995fc1250918df5e00364ff00f849bef67702cd4b0a152e1
-size 65537
+oid sha256:41239f8345fa91fe546442208461ad3cd17c7a7a7047af45018b97363bfea204
+size 109783

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadAppIcon152x152.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e4901093fa6190bf37291b0fb6de23fba1be8ebbd742775a8565a4106722fbb6
-size 31942
+oid sha256:ebfc95bd4c0cbcc53d0ef9d314d26e09a347a22dabbf210597f405d9ed8646bf
+size 7729

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadAppIcon76x76.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e4ae97c4f44910121a61686862c8342ce598db4cdf9d46b29e96d3cb9e43bd06
-size 22158
+oid sha256:99cb7da9282cfcfa64598455827f27ca6791d45ca0d2c3c2dc090d82468dac03
+size 4447

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadProAppIcon167x167.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:061e2d0ce8dc852dd298c80f2aed5fee8ea4b87511c00662aa2d00922c0ba3c2
-size 30162
+oid sha256:101568e946f1d4cea86d666187bbf71116bbf62e6eaf6d80bc3c5e2e184bdb15
+size 7938

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSettingsIcon29x29.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:0fb4b4b77620d99dae7473b7bd8affe14630419835bd5719167ed200e657fa4f
-size 17504
+oid sha256:cf930ffd4efb0b7b627e05aac6e0f56252ea206623e8b5d097d803aa315cdfb8
+size 1812

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSettingsIcon58x58.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:8aa9b1194f3244025578225a6a87cbc2dd12c70955ff615c8af640ea7f1334f1
-size 19619
+oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
+size 3424

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSpotlightIcon40x40.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:0c25ffb1af8160b3202977de8c32aaa235e22c643ffd8004e4546c96868ef3b9
-size 18317
+oid sha256:cf087f357cd439d14651073ac079542c60f0648a30dced2a8d19912124b3f8b6
+size 2310

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPadSpotlightIcon80x80.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:2db961b8f922a552d8ad374fdb56029efd4049a6cde10399b3d961242c82ce53
-size 22571
+oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
+size 4437

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneAppIcon120x120.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f39d897a57d4da0a70ede7c91339660b28e9d8c57b3e7d749807b13baa4b85f3
-size 28559
+oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
+size 6546

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneAppIcon180x180.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:263b75d58328499eef1f8fa2e64c30706f546badcc0c4464a043b231da93cd0d
-size 34969
+oid sha256:3b8717c5f2109dfce1bf7b017278059d4915b524a6eb7e83cfb1926e54ed6869
+size 7383

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSettingsIcon58x58.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:33522ad8a8e826b22dd9ad214f56e63e24bf55c00bd8c845925d848b855dfb48
-size 19619
+oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
+size 3424

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSettingsIcon87x87.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f405c9f3d908d038aea26049e533b0d10955adfac370c7b3b80209997ea706d0
-size 24407
+oid sha256:a32908a839a6cb0ca2a76d6aa60376ba8a14b4428f06c13149ec277514eb5676
+size 4533

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSpotlightIcon120x120.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d110f6e151799a2327bcdf5ef94d6fc82b114783a8cc973a8915896679ba4a80
-size 28559
+oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
+size 6546

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AppIcon.appiconset/iPhoneSpotlightIcon80x80.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:db8f00568fad4e49b05249aaa7a48c9fbf85c8b7a78489c83dc9b8161778bcef
-size 22571
+oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
+size 4437

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadAppIcon152x152.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e4901093fa6190bf37291b0fb6de23fba1be8ebbd742775a8565a4106722fbb6
-size 31942
+oid sha256:ebfc95bd4c0cbcc53d0ef9d314d26e09a347a22dabbf210597f405d9ed8646bf
+size 7729

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadAppIcon76x76.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e4ae97c4f44910121a61686862c8342ce598db4cdf9d46b29e96d3cb9e43bd06
-size 22158
+oid sha256:99cb7da9282cfcfa64598455827f27ca6791d45ca0d2c3c2dc090d82468dac03
+size 4447

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadProAppIcon167x167.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:061e2d0ce8dc852dd298c80f2aed5fee8ea4b87511c00662aa2d00922c0ba3c2
-size 30162
+oid sha256:101568e946f1d4cea86d666187bbf71116bbf62e6eaf6d80bc3c5e2e184bdb15
+size 7938

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSettingsIcon29x29.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:0fb4b4b77620d99dae7473b7bd8affe14630419835bd5719167ed200e657fa4f
-size 17504
+oid sha256:cf930ffd4efb0b7b627e05aac6e0f56252ea206623e8b5d097d803aa315cdfb8
+size 1812

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSettingsIcon58x58.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:8aa9b1194f3244025578225a6a87cbc2dd12c70955ff615c8af640ea7f1334f1
-size 19619
+oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
+size 3424

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSpotlightIcon40x40.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:0c25ffb1af8160b3202977de8c32aaa235e22c643ffd8004e4546c96868ef3b9
-size 18317
+oid sha256:cf087f357cd439d14651073ac079542c60f0648a30dced2a8d19912124b3f8b6
+size 2310

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPadSpotlightIcon80x80.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:2db961b8f922a552d8ad374fdb56029efd4049a6cde10399b3d961242c82ce53
-size 22571
+oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
+size 4437

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneAppIcon120x120.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f39d897a57d4da0a70ede7c91339660b28e9d8c57b3e7d749807b13baa4b85f3
-size 28559
+oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
+size 6546

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneAppIcon180x180.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:263b75d58328499eef1f8fa2e64c30706f546badcc0c4464a043b231da93cd0d
-size 34969
+oid sha256:3b8717c5f2109dfce1bf7b017278059d4915b524a6eb7e83cfb1926e54ed6869
+size 7383

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSettingsIcon58x58.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:33522ad8a8e826b22dd9ad214f56e63e24bf55c00bd8c845925d848b855dfb48
-size 19619
+oid sha256:ba5fea53b349e254b4625035a308d5731cb06f6d0adc278874d14db2627962cb
+size 3424

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSettingsIcon87x87.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f405c9f3d908d038aea26049e533b0d10955adfac370c7b3b80209997ea706d0
-size 24407
+oid sha256:a32908a839a6cb0ca2a76d6aa60376ba8a14b4428f06c13149ec277514eb5676
+size 4533

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSpotlightIcon120x120.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d110f6e151799a2327bcdf5ef94d6fc82b114783a8cc973a8915896679ba4a80
-size 28559
+oid sha256:0d0044ebf7e0a5dd23ed64a1289c705d8f6c3c41a62d65e5a1371058855b8cec
+size 6546

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/AutomatedTestingAppIcon.appiconset/iPhoneSpotlightIcon80x80.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:db8f00568fad4e49b05249aaa7a48c9fbf85c8b7a78489c83dc9b8161778bcef
-size 22571
+oid sha256:421ad4db14c28ed18666158f9ec30747c5b8c757405c1efb32442978911b0c06
+size 4437

+ 1 - 37
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/Contents.json

@@ -1,41 +1,5 @@
 {
   "images" : [
-    {
-      "extent" : "full-screen",
-      "filename" : "iPhoneLaunchImage1242x2688.png",
-      "idiom" : "iphone",
-      "minimum-system-version" : "12.0",
-      "orientation" : "portrait",
-      "scale" : "3x",
-      "subtype" : "2688h"
-    },
-    {
-      "extent" : "full-screen",
-      "filename" : "iPhoneLaunchImage2688x1242.png",
-      "idiom" : "iphone",
-      "minimum-system-version" : "12.0",
-      "orientation" : "landscape",
-      "scale" : "3x",
-      "subtype" : "2688h"
-    },
-    {
-      "extent" : "full-screen",
-      "filename" : "iPhoneLaunchImage828x1792.png",
-      "idiom" : "iphone",
-      "minimum-system-version" : "12.0",
-      "orientation" : "portrait",
-      "scale" : "2x",
-      "subtype" : "1792h"
-    },
-    {
-      "extent" : "full-screen",
-      "filename" : "iPhoneLaunchImage1792x828.png",
-      "idiom" : "iphone",
-      "minimum-system-version" : "12.0",
-      "orientation" : "landscape",
-      "scale" : "2x",
-      "subtype" : "1792h"
-    },
     {
       "extent" : "full-screen",
       "idiom" : "iphone",
@@ -202,4 +166,4 @@
     "version" : 1,
     "author" : "xcode"
   }
-}
+}

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage1024x768.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:31afa7ed44c5d9844c8d6ce08beccac482c3f43590869a3d190d06e2df377ccc
-size 137472
+oid sha256:a4018d9df45b4a04d4cf24a40fe01aa7e30e44a9fdd8ad9a41b0d87791786c12
+size 30442

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage1536x2048.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:0aac8ef9899442820bec0df8bf6434a46cc787d57c5d6d38a04727b8dc310048
-size 338281
+oid sha256:2eea06cb8ad05acefe9664551af5645d52d9763b82473b1fd4a2b2b6f62e96d3
+size 53550

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage2048x1536.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:c07495891f15b138ba09f142777b0f43217bf8be05cbb74ba938319f3425980c
-size 321125
+oid sha256:90991aca91ab7222fdb85c03947cff38f549a6492551e7447e0c8f55022aae48
+size 52467

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPadLaunchImage768x1024.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d6bf6acb92421a453a36fc143ab6cefda14d631ea5e6dbf95c6e252a445fcbac
-size 144797
+oid sha256:6c8439a64d18dbff17dd67f6405bf49f99695e9b22fc2cc541dc72c6e3167307
+size 30564

+ 0 - 3
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage1242x2688.png

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

+ 0 - 3
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage1792x828.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6c7191be3bdae09dc621012a26b0c1b9c15de1d567cf65ff1079e00f8636a32a
-size 220720

+ 0 - 3
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage2688x1242.png

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

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage640x1136.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e9ad650fda925b1c076a67d1ef70315fe4f14db888c9fd36ee4eba1d18c1e7d1
-size 166749
+oid sha256:f752615184160d7a78f28d9eef354c86e544f11eb1dde9f651d7acd315b3f2e6
+size 35934

+ 2 - 2
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage640x960.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:16f6e9d7bd15fc528d934c252213de8792812e708b1810191c5f1767f7165852
-size 142331
+oid sha256:1a43f1d893e85aa99d335a657ec0f6c13a741db976c033451ab9a2328b8a5970
+size 35559

+ 0 - 3
AutomatedTesting/Gem/Resources/IOSLauncher/Images.xcassets/LaunchImage.launchimage/iPhoneLaunchImage828x1792.png

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

+ 3 - 0
AutomatedTesting/Gem/Resources/LegacyLogoLauncher.bmp

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

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/Contents.json

@@ -33,7 +33,7 @@
     {
       "size" : "128x128",
       "idiom" : "mac",
-      "filename" : "icon_128 _2x.png",
+      "filename" : "icon_128_2x.png",
       "scale" : "2x"
     },
     {
@@ -45,7 +45,7 @@
     {
       "size" : "256x256",
       "idiom" : "mac",
-      "filename" : "icon_256 _2x.png",
+      "filename" : "icon_256_2x.png",
       "scale" : "2x"
     },
     {

+ 0 - 3
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png

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

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:9f41a37d2347a617e93bd97adaf6d4c161c471ca3ef7e04b98c65ddda52396dc
-size 27833
+oid sha256:f3c651ca45a83d0f68bdaa466826a29b2ca6f674e225d90e68b7dbadc2ba582d
+size 6620

+ 0 - 0
Templates/DefaultProject/Template/Resources/Platform/Mac/Images.xcassets/TestDPAppIcon.appiconset/icon_128 _2x.png → AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_128_2x.png


+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_16.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:b07984494059bf827bc485cbea06d12e0283811face1a18799495f9ba7ae8af1
-size 20779
+oid sha256:f7d5b15add5104d91a03df7d86898f4bc415d095d11c23555b24440497371948
+size 1061

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_16_2x.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926
-size 21857
+oid sha256:148fdae6493d7b7e1bb6cc6aae1861e0469838f54dcb3c15cc157a548c707fec
+size 1910

+ 0 - 3
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:07631f41b8dea80713d2463f81a713a9a93798975b6fb50afbeeb13d26c57fa2
-size 48899

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2
-size 32037
+oid sha256:094620c172320b062f9a1f8cc758ef4bbee11bc0a6049f46ad6b42f9bf613c92
+size 9679

+ 0 - 0
Templates/DefaultProject/Template/Resources/Platform/Mac/Images.xcassets/TestDPAppIcon.appiconset/icon_256 _2x.png → AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_256_2x.png


+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_32.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926
-size 21857
+oid sha256:148fdae6493d7b7e1bb6cc6aae1861e0469838f54dcb3c15cc157a548c707fec
+size 1910

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_32_2x.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:ad83faf98b49f4e37112baedeae726f4f8d71bcdd1961d9cdad31f043f8ca666
-size 24003
+oid sha256:749bcd29d73e5ef2d1ef8b2d878626d0bca09c6b0d5f1c9dc6cefe7b9082c8cc
+size 3758

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_512.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:68529a6c11d5ffa7ecd9d5bbb11ceea28e6852bd45946b525af09602c9a1e1bf
-size 48899
+oid sha256:934502e242ff7a2e34e21eed1424b5e0953e701761d158520b3297944132328e
+size 18716

+ 2 - 2
AutomatedTesting/Gem/Resources/MacLauncher/Images.xcassets/AppIcon.appiconset/icon_512_2x.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:8a70003840b418848b2ce6c18ed7cbbfcd6fcf76598a6601dca8b98d9b6c1a2f
-size 114706
+oid sha256:5719043940db268dccd2e20bd9d6aa13131890d43edf002a173714ae33890422
+size 29510

+ 0 - 6
Code/Editor/Plugins/EditorCommon/EditorCommon.def

@@ -1,6 +0,0 @@
-; EditorCommon.def : Declares the module parameters for the DLL.
-
-LIBRARY
-
-EXPORTS
-    ; Explicit exports can go here

BIN
Code/Editor/Plugins/EditorCommon/res/EditorCommon.rc2


+ 0 - 10
Code/Editor/Plugins/QtMocRule.props

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemDefinitionGroup>
-	<QtMOC>
-	  <OutputFileName>%(RootDir)%(Directory)%(FileName).moc</OutputFileName>
-      <CommandLineTemplate>$(QTDIR)\bin\moc.exe [AllOptions] [Inputs]</CommandLineTemplate>
-      <ExecutionDescription>Moc'ing %(Filename)%(Extension)...</ExecutionDescription>
-    </QtMOC>
-  </ItemDefinitionGroup>
-</Project>

+ 0 - 46
Code/Editor/Plugins/QtMocRule.targets

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <PropertyPageSchema
-      Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
-      <AvailableItemName Include="QtMOC">
-        <Targets>_QtMOC</Targets>
-      </AvailableItemName>
-  </ItemGroup>
-  <UsingTask
-	TaskName="QtMOC"
-	TaskFactory="XamlTaskFactory"
-	AssemblyName="Microsoft.Build.Tasks.v4.0">
-	<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task> 
-  </UsingTask>
-  <Target
-    Name="_QtMOC"
-    BeforeTargets="ClCompile"
-    AfterTargets="CustomBuild"
-    Condition="'@(QtMOC)' != ''"
-    Outputs="%(QtMOC.OutputFileName)"
-    Inputs="%(QtMOC.Identity);$(MSBuildProjectFile)"
-    DependsOnTargets="_SelectedFiles">
-    <ItemGroup Condition="'@(SelectedFiles)' != ''">
-	  <QtMOC Remove="@(QtMOC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
-    </ItemGroup>
-	<ItemGroup>
-		<QtMOC_tlog Include="%(QtMOC.OutputFileName)" Condition="'%(QtMOC.OutputFileName)' != '' and '%(QtMOC.ExcludedFromBuild)' != 'true'">
-			<Source>@(QtMOC, '|')</Source>
-		</QtMOC_tlog>
-	</ItemGroup>
-    <Message
-      Importance="High"
-      Text="%(QtMOC.ExecutionDescription)" />
-	<WriteLinesToFile
-		Condition="'@(QtMOC_tlog)' != '' and '%(QtMOC_tlog.ExcludedFromBuild)' != 'true'"
-		File="$(IntDir)$(ProjectName).moc.1.tlog"
-		Lines="^%(QtMOC_tlog.Source);@(QtMOC_tlog-&gt;'%(Fullpath)')"/>
-	<QtMOC
-	  Condition="'@(QtMOC)' != '' and '%(QtMOC.ExcludedFromBuild)' != 'true'"
-      CommandLineTemplate="%(QtMOC.CommandLineTemplate)"
-	  OutputFileName="%(QtMOC.OutputFileName)"
-	  AdditionalOptions="%(QtMOC.AdditionalOptions)"
-      Inputs="%(QtMOC.Fullpath)" />
-  </Target>
-</Project>

+ 0 - 74
Code/Editor/Plugins/QtMocRule.xml

@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
-  <Rule
-    Name="QtMOC"
-    PageTemplate="tool"
-    DisplayName="Qt MOC"
-    Order="200">
-    <Rule.DataSource>
-      <DataSource
-        Persistence="ProjectFile"
-        ItemType="QtMOC" />
-    </Rule.DataSource>
-    <Rule.Categories>
-	  <Category
-		Name="General">
-		<Category.DisplayName>
-			<sys:String>General</sys:String>
-		</Category.DisplayName>
-	  </Category>
-      <Category
-        Name="Command Line"
-        Subtype="CommandLine">
-        <Category.DisplayName>
-          <sys:String>Command Line</sys:String>
-        </Category.DisplayName>
-      </Category>
-    </Rule.Categories>
-	<StringProperty
-	  Name="OutputFileName"
-	  Category="General"
-	  DisplayName="Output File Name"
-	  Description="Specifies the name of the output file." 
-	  Switch="-o&quot;[value]&quot;"/>
-    <StringProperty
-      Name="Inputs"
-      Category="Command Line"
-      IsRequired="true">
-      <StringProperty.DataSource>
-        <DataSource
-          Persistence="ProjectFile"
-          ItemType="QtMOC"
-          SourceType="Item" />
-      </StringProperty.DataSource>
-    </StringProperty>
-    <StringProperty
-      Name="CommandLineTemplate"
-      DisplayName="Command Line"
-      Visible="False"
-      IncludeInCommandLine="False" />
-    <StringProperty
-      Name="ExecutionDescription"
-      DisplayName="Execution Description"
-      IncludeInCommandLine="False"
-      Visible="False" />
-	<StringProperty
-	  Subtype="AdditionalOptions"
-	  Name="AdditionalOptions"
-	  Category="Command Line">
-	  <StringProperty.DisplayName>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.DisplayName>
-      <StringProperty.Description>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.Description>
-	</StringProperty>
-  </Rule>
-  <ItemType
-    Name="QtMOC"
-    DisplayName="Qt MOC" />
-  <ContentType
-    Name="QtMOC"
-    DisplayName="Qt MOC"
-    ItemType="QtMOC" />
-</ProjectSchemaDefinitions>

+ 0 - 10
Code/Editor/Plugins/QtRccRule.props

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemDefinitionGroup>
-	<QtRCC>
-	  <OutputFileName>%(RootDir)%(Directory)rcc_%(FileName).h</OutputFileName>
-      <CommandLineTemplate>$(QTDIR)\bin\rcc.exe [AllOptions] [Inputs]</CommandLineTemplate>
-      <ExecutionDescription>Rcc'ing %(Filename)%(Extension)...</ExecutionDescription>
-    </QtRCC>
-  </ItemDefinitionGroup>
-</Project>

+ 0 - 46
Code/Editor/Plugins/QtRccRule.targets

@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <PropertyPageSchema
-      Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
-      <AvailableItemName Include="QtRCC">
-        <Targets>_QtRCC</Targets>
-      </AvailableItemName>
-  </ItemGroup>
-  <UsingTask
-	TaskName="QtRCC"
-	TaskFactory="XamlTaskFactory"
-	AssemblyName="Microsoft.Build.Tasks.v4.0">
-	<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task> 
-  </UsingTask>
-  <Target
-    Name="_QtRCC"
-    BeforeTargets="ClCompile"
-    AfterTargets="CustomBuild"
-    Condition="'@(QtRCC)' != ''"
-    Outputs="%(QtRCC.OutputFileName)"
-    Inputs="%(QtRCC.Identity);$(MSBuildProjectFile)"
-    DependsOnTargets="_SelectedFiles">
-    <ItemGroup Condition="'@(SelectedFiles)' != ''">
-	  <QtRCC Remove="@(QtRCC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
-    </ItemGroup>
-	<ItemGroup>
-		<QtRCC_tlog Include="%(QtRCC.OutputFileName)" Condition="'%(QtRCC.OutputFileName)' != '' and '%(QtRCC.ExcludedFromBuild)' != 'true'">
-			<Source>@(QtRCC, '|')</Source>
-		</QtRCC_tlog>
-	</ItemGroup>
-    <Message
-      Importance="High"
-      Text="%(QtRCC.ExecutionDescription)" />
-	<WriteLinesToFile
-		Condition="'@(QtRCC_tlog)' != '' and '%(QtRCC_tlog.ExcludedFromBuild)' != 'true'"
-		File="$(IntDir)$(ProjectName).rcc.1.tlog"
-		Lines="^%(QtRCC_tlog.Source);@(QtRCC_tlog-&gt;'%(Fullpath)')"/>
-	<QtRCC
-	  Condition="'@(QtRCC)' != '' and '%(QtRCC.ExcludedFromBuild)' != 'true'"
-      CommandLineTemplate="%(QtRCC.CommandLineTemplate)"
-	  OutputFileName="%(QtRCC.OutputFileName)"
-	  AdditionalOptions="%(QtRCC.AdditionalOptions)"
-      Inputs="%(QtRCC.Fullpath)" />
-  </Target>
-</Project>

+ 0 - 74
Code/Editor/Plugins/QtRccRule.xml

@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
-  <Rule
-    Name="QtRCC"
-    PageTemplate="tool"
-    DisplayName="Qt RCC"
-    Order="200">
-    <Rule.DataSource>
-      <DataSource
-        Persistence="ProjectFile"
-        ItemType="QtRCC" />
-    </Rule.DataSource>
-    <Rule.Categories>
-	  <Category
-		Name="General">
-		<Category.DisplayName>
-			<sys:String>General</sys:String>
-		</Category.DisplayName>
-	  </Category>
-      <Category
-        Name="Command Line"
-        Subtype="CommandLine">
-        <Category.DisplayName>
-          <sys:String>Command Line</sys:String>
-        </Category.DisplayName>
-      </Category>
-    </Rule.Categories>
-	<StringProperty
-	  Name="OutputFileName"
-	  Category="General"
-	  DisplayName="Output File Name"
-	  Description="Specifies the name of the output file." 
-	  Switch="-o &quot;[value]&quot;"/>
-    <StringProperty
-      Name="Inputs"
-      Category="Command Line"
-      IsRequired="true">
-      <StringProperty.DataSource>
-        <DataSource
-          Persistence="ProjectFile"
-          ItemType="QtRCC"
-          SourceType="Item" />
-      </StringProperty.DataSource>
-    </StringProperty>
-    <StringProperty
-      Name="CommandLineTemplate"
-      DisplayName="Command Line"
-      Visible="False"
-      IncludeInCommandLine="False" />
-    <StringProperty
-      Name="ExecutionDescription"
-      DisplayName="Execution Description"
-      IncludeInCommandLine="False"
-      Visible="False" />
-	<StringProperty
-	  Subtype="AdditionalOptions"
-	  Name="AdditionalOptions"
-	  Category="Command Line">
-	  <StringProperty.DisplayName>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.DisplayName>
-      <StringProperty.Description>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.Description>
-	</StringProperty>
-  </Rule>
-  <ItemType
-    Name="QtRCC"
-    DisplayName="Qt RCC" />
-  <ContentType
-    Name="QtRCC"
-    DisplayName="Qt RCC"
-    ItemType="QtRCC" />
-</ProjectSchemaDefinitions>

+ 0 - 10
Code/Editor/Plugins/QtUicRule.props

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemDefinitionGroup>
-	<QtUIC>
-	  <OutputFileName>%(RootDir)%(Directory)ui_%(FileName).h</OutputFileName>
-      <CommandLineTemplate>$(QTDIR)\bin\uic.exe [AllOptions] [Inputs]</CommandLineTemplate>
-      <ExecutionDescription>Uic'ing %(Filename)%(Extension)...</ExecutionDescription>
-    </QtUIC>
-  </ItemDefinitionGroup>
-</Project>

+ 0 - 47
Code/Editor/Plugins/QtUicRule.targets

@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <PropertyPageSchema
-      Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
-      <AvailableItemName Include="QtUIC">
-        <Targets>_QtUIC</Targets>
-      </AvailableItemName>
-  </ItemGroup>
-  <UsingTask
-	TaskName="QtUIC"
-	TaskFactory="XamlTaskFactory"
-	AssemblyName="Microsoft.Build.Tasks.v4.0">
-	<Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task> 
-  </UsingTask>
-  <Target
-    Name="_QtUIC"
-    BeforeTargets="ClCompile"
-    AfterTargets="CustomBuild"
-    Condition="'@(QtUIC)' != ''"
-    Outputs="%(QtUIC.OutputFileName)"
-    Inputs="%(QtUIC.Identity);$(MSBuildProjectFile)"
-    DependsOnTargets="_SelectedFiles">
-    <ItemGroup Condition="'@(SelectedFiles)' != ''">
-	  <QtUIC Remove="@(QtUIC)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
-    </ItemGroup>
-	<ItemGroup>
-		<QtUIC_tlog Include="%(QtUIC.OutputFileName)" Condition="'%(QtUIC.OutputFileName)' != '' and '%(QtUIC.ExcludedFromBuild)' != 'true'">
-			<Source>@(QtUIC, '|')</Source>
-		</QtUIC_tlog>
-	</ItemGroup>
-    <Message
-      Importance="High"
-      Text="%(QtUIC.ExecutionDescription)" />
-	<WriteLinesToFile
-		Condition="'@(QtUIC_tlog)' != '' and '%(QtUIC_tlog.ExcludedFromBuild)' != 'true'"
-		File="$(IntDir)$(ProjectName).uic.1.tlog"
-		Lines="^%(QtUIC_tlog.Source);@(QtUIC_tlog-&gt;'%(Fullpath)')"/>
-	<QtUIC
-	  Condition="'@(QtUIC)' != '' and '%(QtUIC.ExcludedFromBuild)' != 'true'"
-      CommandLineTemplate="%(QtUIC.CommandLineTemplate)"
-	  OutputFileName="%(QtUIC.OutputFileName)"
-	  AdditionalOptions="%(QtUIC.AdditionalOptions)"
-      Inputs="%(QtUIC.Fullpath)" /> <!-- CRC TODO: Should use identity instead? Inputs="%(QtUIC.Identity)" /> -->
-      
-  </Target>
-</Project>

+ 0 - 74
Code/Editor/Plugins/QtUicRule.xml

@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
-  <Rule
-    Name="QtUIC"
-    PageTemplate="tool"
-    DisplayName="Qt UIC"
-    Order="200">
-    <Rule.DataSource>
-      <DataSource
-        Persistence="ProjectFile"
-        ItemType="QtUIC" />
-    </Rule.DataSource>
-    <Rule.Categories>
-	  <Category
-		Name="General">
-		<Category.DisplayName>
-			<sys:String>General</sys:String>
-		</Category.DisplayName>
-	  </Category>
-      <Category
-        Name="Command Line"
-        Subtype="CommandLine">
-        <Category.DisplayName>
-          <sys:String>Command Line</sys:String>
-        </Category.DisplayName>
-      </Category>
-    </Rule.Categories>
-	<StringProperty
-	  Name="OutputFileName"
-	  Category="General"
-	  DisplayName="Output File Name"
-	  Description="Specifies the name of the output file." 
-	  Switch="-o &quot;[value]&quot;"/>
-    <StringProperty
-      Name="Inputs"
-      Category="Command Line"
-      IsRequired="true">
-      <StringProperty.DataSource>
-        <DataSource
-          Persistence="ProjectFile"
-          ItemType="QtUIC"
-          SourceType="Item" />
-      </StringProperty.DataSource>
-    </StringProperty>
-    <StringProperty
-      Name="CommandLineTemplate"
-      DisplayName="Command Line"
-      Visible="False"
-      IncludeInCommandLine="False" />
-    <StringProperty
-      Name="ExecutionDescription"
-      DisplayName="Execution Description"
-      IncludeInCommandLine="False"
-      Visible="False" />
-	<StringProperty
-	  Subtype="AdditionalOptions"
-	  Name="AdditionalOptions"
-	  Category="Command Line">
-	  <StringProperty.DisplayName>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.DisplayName>
-      <StringProperty.Description>
-	    <sys:String>Additional Options</sys:String>
-	  </StringProperty.Description>
-	</StringProperty>
-  </Rule>
-  <ItemType
-    Name="QtUIC"
-    DisplayName="Qt UIC" />
-  <ContentType
-    Name="QtUIC"
-    DisplayName="Qt UIC"
-    ItemType="QtUIC" />
-</ProjectSchemaDefinitions>

+ 1 - 0
Code/Editor/RenderViewport.h

@@ -219,6 +219,7 @@ public:
     void SetFullScreenState(bool fullScreenState) override;
     bool CanToggleFullScreenState() const override;
     void ToggleFullScreenState() override;
+    float GetDpiScaleFactor() const override { return 1.0f; };
 
     void ConnectViewportInteractionRequestBus();
     void DisconnectViewportInteractionRequestBus();

+ 1 - 1
Code/Editor/TrackView/AtomOutputFrameCapture.cpp

@@ -73,7 +73,7 @@ namespace TrackView
         bool startedCapture = false;
         AZ::Render::FrameCaptureRequestBus::BroadcastResult(
             startedCapture, &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachmentWithCallback, m_passHierarchy,
-            AZStd::string("Output"), attachmentReadbackCallback);
+            AZStd::string("Output"), attachmentReadbackCallback, AZ::RPI::PassAttachmentReadbackOption::Output);
 
         return startedCapture;
     }

+ 0 - 4
Code/Editor/editor_lib_files.cmake

@@ -21,7 +21,6 @@ set(FILES
     res/TreeView.bmp
     res/VisualLog_PlayerButtons.bmp
     res/ab_toolbar.bmp
-    res/about_dark.bmp
     res/anim.bmp
     res/animatio.bmp
     res/animations_tree_soundevent.bmp
@@ -137,7 +136,6 @@ set(FILES
     res/litebulb.bmp
     res/lock_sel.bmp
     res/locksele.bmp
-    res/logo.bmp
     res/mainfram.bmp
     res/mann_tagdef_toolbar.bmp
     res/mann_tagdef_tree.bmp
@@ -184,8 +182,6 @@ set(FILES
     res/rename.ico
     res/replace.ico
     res/ribbon_system_button.png
-    res/sandbox_dark.bmp
-    res/sb_welcome_dark.bmp
     res/selectobj.bmp
     res/seq_1_colour_keys.bmp
     res/seq_2_colour_keys.bmp

+ 0 - 3
Code/Editor/res/about_dark.bmp

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:887d184cf49cf78c62a1fe53eac3cb8e7b071bb67e09b801a4893445ac4c800f
-size 542456

+ 0 - 3
Code/Editor/res/logo.bmp

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8b65af2765042354ae4110dc7bcbde905e4a55a4995f66b626d15ec6c0fa18c1
-size 96056

+ 0 - 3
Code/Editor/res/logo.gif

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:79412e83b32bb6712d9701f78465878a2057a590698a4dc8d8c7aa11de2623ef
-size 4227

+ 0 - 3
Code/Editor/res/sandbox_dark.bmp

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:887d184cf49cf78c62a1fe53eac3cb8e7b071bb67e09b801a4893445ac4c800f
-size 542456

+ 0 - 3
Code/Editor/res/sb_welcome_dark.bmp

@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:704faeb96d930d3e6992a1449908aa6d7860b648e2feb38da8bf37cd7268a694
-size 184856

+ 1 - 1
Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp

@@ -1155,7 +1155,7 @@ namespace Benchmark
     class StorageDriveWindowsFixture : public benchmark::Fixture
     {
     public:
-        constexpr static char* TestFileName = "StreamerBenchmark.bin";
+        constexpr static const char* TestFileName = "StreamerBenchmark.bin";
         constexpr static size_t FileSize = 64_mib;
             
         void SetupStreamer(bool enableFileSharing)

+ 2 - 2
Code/Framework/AzFramework/AzFramework/Physics/Material.cpp

@@ -504,7 +504,7 @@ namespace Physics
         }
     }
 
-    const AZ::Data::Asset<Physics::MaterialLibraryAsset>& MaterialSelection::GetMaterialLibrary()
+    AZ::Data::Asset<Physics::MaterialLibraryAsset> MaterialSelection::GetMaterialLibrary()
     {
         if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get())
         {
@@ -516,7 +516,7 @@ namespace Physics
         return s_invalidMaterialLibrary;
     }
 
-    const AZ::Data::AssetId& MaterialSelection::GetMaterialLibraryId()
+    AZ::Data::AssetId MaterialSelection::GetMaterialLibraryId()
     {
         return GetMaterialLibrary().GetId();
     }

+ 2 - 2
Code/Framework/AzFramework/AzFramework/Physics/Material.h

@@ -306,8 +306,8 @@ namespace Physics
         
         void SyncSelectionToMaterialLibrary();
         
-        static const AZ::Data::Asset<Physics::MaterialLibraryAsset>& GetMaterialLibrary();
-        static const AZ::Data::AssetId& GetMaterialLibraryId();
+        static AZ::Data::Asset<Physics::MaterialLibraryAsset> GetMaterialLibrary();
+        static AZ::Data::AssetId GetMaterialLibraryId();
 
         bool AreMaterialSlotsReadOnly() const;
 

+ 11 - 0
Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp

@@ -116,6 +116,11 @@ namespace AzFramework
         SetFullScreenState(!GetFullScreenState());
     }
 
+    float NativeWindow::GetDpiScaleFactor() const
+    {
+        return m_pimpl->GetDpiScaleFactor();
+    }
+
     /*static*/ bool NativeWindow::GetFullScreenStateOfDefaultWindow()
     {
         NativeWindowHandle defaultWindowHandle = nullptr;
@@ -228,4 +233,10 @@ namespace AzFramework
         return false;
     }
 
+    float NativeWindow::Implementation::GetDpiScaleFactor() const
+    {
+        // For platforms that aren't DPI-aware, we simply return a 1.0 ratio for no scaling
+        return 1.0f;
+    }
+
 } // namespace AzFramework

+ 2 - 0
Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h

@@ -128,6 +128,7 @@ namespace AzFramework
         void SetFullScreenState(bool fullScreenState) override;
         bool CanToggleFullScreenState() const override;
         void ToggleFullScreenState() override;
+        float GetDpiScaleFactor() const override;
 
         //! Get the full screen state of the default window.
         //! \return True if the default window is currently in full screen, false otherwise.
@@ -169,6 +170,7 @@ namespace AzFramework
             virtual bool GetFullScreenState() const;
             virtual void SetFullScreenState(bool fullScreenState);
             virtual bool CanToggleFullScreenState() const;
+            virtual float GetDpiScaleFactor() const;
 
         protected:
             uint32_t m_width = 0;

+ 8 - 0
Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h

@@ -68,6 +68,11 @@ namespace AzFramework
 
         //! Toggle the full screen state of the window.
         virtual void ToggleFullScreenState() = 0;
+
+        //! Returns a scalar multiplier representing how many dots-per-inch this window has, compared
+        //! to a "standard" value of 96, the default for Windows in a DPI unaware setting. This can
+        //! be used to scale user interface elements to ensure legibility on high density displays.
+        virtual float GetDpiScaleFactor() const = 0;
     };
     using WindowRequestBus = AZ::EBus<WindowRequests>;
 
@@ -87,6 +92,9 @@ namespace AzFramework
         //! This is called once when the window is Activated and also called if the user resizes the window.
         virtual void OnWindowResized(uint32_t width, uint32_t height) { AZ_UNUSED(width); AZ_UNUSED(height); };
 
+        //! This is called if the window's underyling DPI scaling factor changes.
+        virtual void OnDpiScaleFactorChanged(float dpiScaleFactor) { AZ_UNUSED(dpiScaleFactor); }
+
         //! This is called when the window is deactivated from code or if the user closes the window.
         virtual void OnWindowClosed() {};
     };

+ 32 - 1
Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp

@@ -8,6 +8,7 @@
 #include <AzFramework/Input/Buses/Notifications/RawInputNotificationBus_Windows.h>
 #include <AzFramework/Windowing/NativeWindow.h>
 
+#include <AzCore/Module/DynamicModuleHandle.h>
 #include <AzCore/PlatformIncl.h>
 
 namespace AzFramework
@@ -17,7 +18,7 @@ namespace AzFramework
     {
     public:
         AZ_CLASS_ALLOCATOR(NativeWindowImpl_Win32, AZ::SystemAllocator, 0);
-        NativeWindowImpl_Win32() = default;
+        NativeWindowImpl_Win32();
         ~NativeWindowImpl_Win32() override;
 
         // NativeWindow::Implementation overrides...
@@ -33,6 +34,7 @@ namespace AzFramework
         bool GetFullScreenState() const override;
         void SetFullScreenState(bool fullScreenState) override;
         bool CanToggleFullScreenState() const override { return true; }
+        float GetDpiScaleFactor() const override;
 
     private:
         static DWORD ConvertToWin32WindowStyleMask(const WindowStyleMasks& styleMasks);
@@ -49,6 +51,9 @@ namespace AzFramework
         RECT m_windowRectToRestoreOnFullScreenExit; //!< The position and size of the window to restore when exiting full screen.
         UINT m_windowStyleToRestoreOnFullScreenExit; //!< The style(s) of the window to restore when exiting full screen.
         bool m_isInBorderlessWindowFullScreenState = false; //!< Was a borderless window used to enter full screen state?
+
+        using GetDpiForWindowType = UINT(HWND hwnd);
+        GetDpiForWindowType* m_getDpiFunction = nullptr;
     };
 
     const char* NativeWindowImpl_Win32::s_defaultClassName = "O3DEWin32Class";
@@ -58,6 +63,15 @@ namespace AzFramework
         return aznew NativeWindowImpl_Win32();
     }
 
+    NativeWindowImpl_Win32::NativeWindowImpl_Win32()
+    {
+        // Attempt to load GetDpiForWindow from user32 at runtime, available on Windows 10+ versions >= 1607
+        if (auto user32module = AZ::DynamicModuleHandle::Create("user32"); user32module->Load(false))
+        {
+            m_getDpiFunction = user32module->GetFunction<GetDpiForWindowType*>("GetDpiForWindow");
+        }
+    }
+
     NativeWindowImpl_Win32::~NativeWindowImpl_Win32()
     {
         DestroyWindow(m_win32Handle);
@@ -237,6 +251,12 @@ namespace AzFramework
             // Send all other WM_SYSKEYDOWN messages to the default WndProc.
             break;
         }
+        case WM_DPICHANGED:
+        {
+            const float newScaleFactor = nativeWindowImpl->GetDpiScaleFactor();
+            WindowNotificationBus::Event(nativeWindowImpl->GetWindowHandle(), &WindowNotificationBus::Events::OnDpiScaleFactorChanged, newScaleFactor);
+            break;
+        }
         default:
             return DefWindowProc(hWnd, message, wParam, lParam);
             break;
@@ -330,6 +350,17 @@ namespace AzFramework
         }
     }
 
+    float NativeWindowImpl_Win32::GetDpiScaleFactor() const
+    {
+        constexpr UINT defaultDotsPerInch = 96;
+        UINT dotsPerInch = defaultDotsPerInch;
+        if (m_getDpiFunction)
+        {
+            dotsPerInch = m_getDpiFunction(m_win32Handle);
+        }
+        return aznumeric_cast<float>(dotsPerInch) / aznumeric_cast<float>(defaultDotsPerInch);
+    }
+
     void NativeWindowImpl_Win32::EnterBorderlessWindowFullScreen()
     {
         if (m_isInBorderlessWindowFullScreenState)

+ 12 - 7
Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp

@@ -3288,15 +3288,20 @@ namespace AzQtComponents
         }
 
         // Untab tabbed dock widgets before restoring, as the restore only works on dock widgets parented directly to the main window
-        const QList<QDockWidget*> dockWidgets = m_mainWindow->findChildren<QDockWidget*>();
-        for (QDockWidget* dockWidget : dockWidgets)
+        for (QDockWidget* dockWidget : m_mainWindow->findChildren<QDockWidget*>(
+            QRegularExpression(QString("%1.*").arg(m_tabContainerIdentifierPrefix)), Qt::FindChildrenRecursively))
         {
-            if (QStackedWidget* stackedWidget = qobject_cast<QStackedWidget*>(dockWidget->parentWidget()))
+            DockTabWidget* tabWidget = qobject_cast<DockTabWidget*>(dockWidget->widget());
+            if (!tabWidget)
             {
-                if (AzQtComponents::DockTabWidget* tabWidget = qobject_cast<AzQtComponents::DockTabWidget*>(stackedWidget->parentWidget()))
-                {
-                    tabWidget->removeTab(dockWidget);
-                }
+                continue;
+            }
+
+            // Remove the tabs from the tab widget (we don't actually want to close them, which could delete them at this point)
+            int numTabs = tabWidget->count();
+            for (int i = 0; i < numTabs; ++i)
+            {
+                tabWidget->removeTab(0);
             }
         }
 

+ 4 - 0
Code/Framework/AzQtComponents/AzQtComponents/Components/Style.cpp

@@ -1303,6 +1303,10 @@ namespace AzQtComponents
             }
             break;
 
+            case QStyle::SP_MessageBoxInformation:
+                return QIcon(QString::fromUtf8(":/stylesheet/img/UI20/Info.svg"));
+                break;
+
             default:
                 break;
         }

+ 1 - 0
Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/BaseStyleSheet.qss

@@ -123,6 +123,7 @@ QPlainTextEdit:focus
 @import "LineEdit.qss";
 @import "Menu.qss";
 @import "MenuBar.qss";
+@import "MessageBox.qss";
 @import "ProgressBar.qss";
 @import "PushButton.qss";
 @import "QDockWidget.qss";

+ 21 - 0
Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/MessageBox.qss

@@ -0,0 +1,21 @@
+
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project
+ * 
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+ /* correct the padding around the two main labels to give space at the borders */
+QMessageBox QLabel#qt_msgbox_label
+{
+    padding-top: 20px;
+    padding-right: 20px;
+    padding-bottom: 20px;
+}
+
+QMessageBox QLabel#qt_msgboxex_icon_label
+{
+    padding-left: 20px;
+    padding-top: 20px;
+}

+ 5 - 4
Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc

@@ -354,17 +354,17 @@
     <file>img/UI20/toolbar/Grid.svg</file>
     <file>img/UI20/toolbar/Lighting.svg</file>
     <file>img/UI20/toolbar/Load.svg</file>
-	<file>img/UI20/toolbar/Local.svg</file>
+    <file>img/UI20/toolbar/Local.svg</file>
     <file>img/UI20/toolbar/Locked.svg</file>
     <file>img/UI20/toolbar/Locked_Status.svg</file>
-	<file>img/UI20/toolbar/LUA.svg</file>
+    <file>img/UI20/toolbar/LUA.svg</file>
     <file>img/UI20/toolbar/Material.svg</file>
     <file>img/UI20/toolbar/Measure.svg</file>
     <file>img/UI20/toolbar/Move.svg</file>
     <file>img/UI20/toolbar/Object_follow_terrain.svg</file>
     <file>img/UI20/toolbar/Object_height.svg</file>
     <file>img/UI20/toolbar/Object_list.svg</file>
-	<file>img/UI20/toolbar/Parent.svg</file>
+    <file>img/UI20/toolbar/Parent.svg</file>
     <file>img/UI20/toolbar/particle.svg</file>
     <file>img/UI20/toolbar/Play.svg</file>
     <file>img/UI20/toolbar/Redo.svg</file>
@@ -385,7 +385,7 @@
     <file>img/UI20/toolbar/undo.svg</file>
     <file>img/UI20/toolbar/Unlocked.svg</file>
     <file>img/UI20/toolbar/Vertex_snapping.svg</file>
-	<file>img/UI20/toolbar/World.svg</file>
+    <file>img/UI20/toolbar/World.svg</file>
     <file>img/UI20/toolbar/X_axis.svg</file>
     <file>img/UI20/toolbar/Y_axis.svg</file>
     <file>img/UI20/toolbar/Z_axis.svg</file>
@@ -459,6 +459,7 @@
     <file>Widgets/ComboBoxConfig.ini</file>
     <file>Widgets/Menu.qss</file>
     <file>Widgets/MenuBar.qss</file>
+    <file>Widgets/MessageBox.qss</file>
     <file>Widgets/ProgressBarConfig.ini</file>
     <file>Widgets/ProgressBar.qss</file>
     <file>Widgets/PushButton.qss</file>

+ 15 - 0
Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp

@@ -222,6 +222,21 @@ namespace AzToolsFramework
 
         void AssetBrowserTreeView::UpdateAfterFilter(bool hasFilter, bool selectFirstValidEntry)
         {
+            const QModelIndexList& selectedIndexes = selectionModel()->selectedRows();
+
+            // If we've cleared the filter but had something selected, ensure it stays selected and visible.
+            if (!hasFilter && !selectedIndexes.isEmpty())
+            {
+                QModelIndex curIndex = selectedIndexes[0];
+                m_expandToEntriesByDefault = true;
+                m_treeStateSaver->ApplySnapshot();
+
+                setCurrentIndex(curIndex);
+                scrollTo(curIndex);
+
+                return;
+            }
+
             // Flag our default expansion state so that we expand down to source entries after filtering
             m_expandToEntriesByDefault = hasFilter;
             // Then ask our state saver to apply its current snapshot again, falling back on asking us if entries should be expanded or not

+ 6 - 0
Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp

@@ -151,6 +151,12 @@ namespace LegacyFramework
         specializations.Append("tools");
     }
 
+    void Application::CreateReflectionManager()
+    {
+        AZ::ComponentApplication::CreateReflectionManager();
+        GetSerializeContext()->CreateEditContext();
+    }
+
     int Application::Run(const ApplicationDesc& desc)
     {
         if (!AZ::AllocatorInstance<AZ::OSAllocator>::IsReady())

+ 2 - 0
Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h

@@ -56,6 +56,8 @@ namespace LegacyFramework
         virtual int Run(const ApplicationDesc& desc);
         Application();
 
+        void CreateReflectionManager() override;
+
     protected:
 
         // ------------------------------------------------------------------

+ 2 - 0
Code/LauncherUnified/launcher_generator.cmake

@@ -122,6 +122,8 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC
             FOLDER ${project_name}
     )
 
+    # After ensuring that we correctly support DPI scaling, this should be switched to "PerMonitor"
+    set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DPI_AWARE "OFF")
     if(LY_DEFAULT_PROJECT_PATH)
         set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${LY_DEFAULT_PROJECT_PATH}\"")
     endif()

+ 189 - 56
Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli

@@ -80,14 +80,44 @@ float3x3 BuildViewAlignedOrthonormalBasis(in float3 normal, in float3 dirToView)
 // xy plane in positive z space.
 float IntegrateEdge(float3 v1, float3 v2)
 {
+    // This alternate version may work better for platforms where acos() precision is low.
+    /*
+    float x = dot(v1, v2);
+    float y = abs(x);
+
+    float a = 5.42031 + (3.12829 + 0.0902326 * y) * y;
+    float b = 3.45068 + (4.18814 + y) * y;
+    float theta_sinTheta = a / b;
+
+    if (x < 0.0)
+    {
+        theta_sinTheta = PI * rsqrt(saturate(1.0 - x * x)) - theta_sinTheta;
+    }
+
+    float3 u = cross(v1, v2);
+    return theta_sinTheta * u.z;
+    */
+
     float cosTheta = dot(v1, v2);
-    cosTheta = clamp(cosTheta, -0.9999, 0.9999);
+    float theta = acos(cosTheta);
 
     // calculate 1.0 / sin(theta)
-    float invSinTheta = rsqrt(1.0 - cosTheta * cosTheta);
+    float invSinTheta = rsqrt(saturate(1.0 - cosTheta * cosTheta));
 
-    float theta = acos(cosTheta);
-    return cross(v1, v2).z * theta * invSinTheta;
+    return cross(v1, v2).z * ((theta > 0.001) ? theta * invSinTheta : 1.0);
+}
+
+// Cheaper version of above which is good enough for diffuse
+float IntegrateEdgeDiffuse(float3 v1, float3 v2)
+{
+    float cosTheta = dot(v1, v2);
+    float absCosTheta = abs(cosTheta);
+    float theta_sinTheta = 1.5708 + (-0.879406 + 0.308609 * absCosTheta) * absCosTheta;
+    if (cosTheta < 0.0)
+    {
+        theta_sinTheta = PI * rsqrt(1.0 - cosTheta * cosTheta) - theta_sinTheta;
+    }
+    return theta_sinTheta * cross(v1, v2).z;
 }
 
 // Returns the unnormalized z plane intersection point between pointAboveHorizon and pointBelowHorizon.
@@ -189,42 +219,90 @@ void ClipQuadToHorizon(inout float3 p[5], out int vertexCount)
     }
 }
 
-// Takes 4 points (p) from a quad plus a 5th dummy point, rotates them into the space of the normal, then transforms
-// the points by the LTC matrix provided. The points are then clipped to the normal's hemisphere. The number of points
-// after the clip is returned in vertexCount. It's possible for the resulting clipped quad to be a triangle (when 3
-// points are below the horizon), or a pentagon (when one point is below the horizon), or be a regular 4 point quad.
-void LtcClipAndNormalizeQuad(in float3 normal, in float3 dirToView, float3x3 ltcMat, inout float3 p[5], out int vertexCount)
+// Applies the LTC matrix to the clipped points of a quad.
+void ApplyLtcMatrixToQuad(in float3x3 ltcMat, inout float3 p[5], in int vertexCount)
 {
-    // Rotate ltc matrix
-    ltcMat = mul(ltcMat, BuildViewAlignedOrthonormalBasis(normal, dirToView));
-
     // Transform points into ltc space
-    p[0] = mul(ltcMat, p[0].xyz);
-    p[1] = mul(ltcMat, p[1].xyz);
-    p[2] = mul(ltcMat, p[2].xyz);
-    p[3] = mul(ltcMat, p[3].xyz);
-
-    ClipQuadToHorizon(p, vertexCount);
+    p[0] = mul(ltcMat, p[0]);
+    p[1] = mul(ltcMat, p[1]);
+    p[2] = mul(ltcMat, p[2]);
 
-    // visibility check
-    if (vertexCount == 0)
+    if (vertexCount > 3)
     {
-        return;
+        p[3] = mul(ltcMat, p[3]);
+    }
+    if (vertexCount > 4)
+    {
+        p[4] = mul(ltcMat, p[4]);
     }
+}
 
-    // project onto sphere
+// Projects the clipped points of a quad onto the sphere.
+void NormalizeQuadPoints(inout float3 p[5], in int vertexCount)
+{
+    // project quad points onto a sphere.
     p[0] = normalize(p[0]);
     p[1] = normalize(p[1]);
     p[2] = normalize(p[2]);
-    p[3] = normalize(p[3]);
-    p[4] = normalize(p[4]);
+
+    if (vertexCount > 3)
+    {
+        p[3] = normalize(p[3]);
+    }
+    if (vertexCount > 4)
+    {
+        p[4] = normalize(p[4]);
+    }
+}
+
+// Transforms the 4 points of a quad into the hemisphere of the normal
+void TransformQuadToOrthonormalBasis(in float3 normal, in float3 dirToView, inout float3 p[4])
+{
+    float3x3 orthoNormalBasis = BuildViewAlignedOrthonormalBasis(normal, dirToView);
+
+    // Transform points into orthonormal space
+    p[0] = mul(orthoNormalBasis, p[0]);
+    p[1] = mul(orthoNormalBasis, p[1]);
+    p[2] = mul(orthoNormalBasis, p[2]);
+    p[3] = mul(orthoNormalBasis, p[3]);
 }
 
-float IntegrateQuad(in float3 v[5], in float vertexCount, in bool doubleSided)
+// Integrates the edges of a quad for lambertian diffuse contribution.
+float IntegrateQuadDiffuse(in float3 v[5], in float vertexCount, in bool doubleSided)
 {
-    // Integrate
     float sum = 0.0;
 
+    NormalizeQuadPoints(v, vertexCount);
+
+    // There must be at least 3 points so don't check for the first 2 edges.
+    sum += IntegrateEdgeDiffuse(v[0], v[1]);
+    sum += IntegrateEdgeDiffuse(v[1], v[2]);
+
+    if (vertexCount > 3)
+    {
+        sum += IntegrateEdgeDiffuse(v[2], v[3]);
+        if (vertexCount == 5)
+        {
+            sum += IntegrateEdgeDiffuse(v[3], v[4]);
+        }
+    }
+
+    // Close the polygon
+    sum += IntegrateEdgeDiffuse(v[vertexCount - 1], v[0]);
+
+    // Note: negated due to winding order
+    sum = doubleSided ? abs(sum) : max(0.0, -sum);
+
+    return sum;
+}
+
+// Integrates the edges of a quad for specular contribution.
+float IntegrateQuadSpecular(in float3 v[5], in float vertexCount, in bool doubleSided)
+{
+    float sum = 0.0;
+
+    NormalizeQuadPoints(v, vertexCount);
+
     // There must be at least 3 points so don't check for the first 2 edges.
     sum += IntegrateEdge(v[0], v[1]);
     sum += IntegrateEdge(v[1], v[2]);
@@ -247,26 +325,62 @@ float IntegrateQuad(in float3 v[5], in float vertexCount, in bool doubleSided)
     return sum;
 }
 
-float LtcQuadEvaluate(in float3 normal, in float3 dirToView, in float3x3 ltcMat, in float3 p[4], in bool doubleSided)
+// Evaluate linear transform cosine lighting for a 4 point quad.
+//   normal - The surface normal
+//   dirToView - Normalized direction from the surface to the view
+//   ltcMat - The LTC matrix for specular, or identity for diffuse.
+//   p[4] - The 4 light positions relative to the surface position.
+//   doubleSided - If the quad emits light from both sides
+//   diffuse - The output diffuse response for the quad light
+//   specular - The output specular response for the quad light
+void LtcQuadEvaluate(
+    in float3 normal,
+    in float3 dirToView,
+    in float3x3 ltcMat,
+    in float3 p[4],
+    in bool doubleSided,
+    out float diffuse,
+    out float specular)
 {
+    // Transform the points of the light into the space of the normal's hemisphere.
+    TransformQuadToOrthonormalBasis(normal, dirToView, p);
+
     // Initialize quad with dummy point at end in case one corner is clipped (resulting in 5 sided polygon)
     float3 v[5] = {p[0], p[1], p[2], p[3], float3(0.0, 0.0, 0.0)};
 
+    // Clip the light polygon to the normal hemisphere. This is done before the LTC matrix is applied to prevent
+    // parts of the light below the horizon from impacting the surface. The number of points remaining after
+    // the clip is returned in vertexCount. It's possible for the vertexCount of the resulting clipped quad to be
+    // 0 - all points clipped (no work to do, so return)
+    // 3 - 3 points clipped, leaving only a triangular corner of the quad
+    // 4 - 2 or 0 points clipped, leaving a quad
+    // 5 - 1 point clipped leaving a pentagon.
+
     int vertexCount = 0;
-    LtcClipAndNormalizeQuad(normal, dirToView, ltcMat, v, vertexCount);
+    ClipQuadToHorizon(v, vertexCount);
 
-    if (vertexCount > 0)
+    if (vertexCount == 0)
     {
-       return IntegrateQuad(v, vertexCount, doubleSided);
+        // Entire light is below the horizon.
+        return;
     }
-    return 0.0;
+
+    // IntegrateQuadDiffuse is a cheap approximation compared to specular.
+    diffuse = IntegrateQuadDiffuse(v, vertexCount, doubleSided);
+
+    ApplyLtcMatrixToQuad(ltcMat, v, vertexCount);
+
+    // IntegrateQuadSpecular uses more accurate integration to handle smooth surfaces correctly.
+    specular = IntegrateQuadSpecular(v, vertexCount, doubleSided);
 }
 
 // Checks an edge against the horizon and integrates it.
-//   p0 - first point
-//   p1 - second point
-//   prevClipPoint - the clip point saved from the last time an edge went from above to below the horizon
-//   sum - the sum total of all integrations to contribute to.
+//   p0 - First point
+//   p1 - Second point
+//   prevClipPoint - The clip point saved from the last time an edge went from above to below the horizon
+//   ltcMat - The ltc lookup matrix for specular
+//   diffuse - The current sum total of diffuse contribution to apply additional contribution to
+//   specular - The current sum total of specular contribution to apply additional contribution to
 //
 // Explanation:
 // When evaluating edges of a polygon there are four possible states to deal with
@@ -283,28 +397,34 @@ float LtcQuadEvaluate(in float3 normal, in float3 dirToView, in float3x3 ltcMat,
 // 4. Both points are below the horizon
 //    - Do nothing.
 
-void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, inout float sum)
+void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, in float3x3 ltcMat, inout float diffuse, inout float specular)
 {
     if (p0.z > 0.0)
     {
         if (p1.z > 0.0)
         {
             // Both above horizon
-            sum += IntegrateEdge(normalize(p0), normalize(p1));
+            diffuse += IntegrateEdgeDiffuse(normalize(p0), normalize(p1));
+            specular += IntegrateEdge(normalize(mul(ltcMat, p0)), normalize(mul(ltcMat, p1)));
         }
         else
         {
             // Going from above to below horizon
-            prevClipPoint = normalize(ClipEdge(p0, p1));
-            sum += IntegrateEdge(normalize(p0), prevClipPoint);
+            prevClipPoint = ClipEdge(p0, p1);
+            diffuse += IntegrateEdgeDiffuse(normalize(p0), normalize(prevClipPoint));
+            specular += IntegrateEdge(normalize(mul(ltcMat, p0)), normalize(mul(ltcMat, prevClipPoint)));
         }
     }
     else if (p1.z > 0.0)
     {
         // Going from below to above horizon
-        float3 clipPoint = normalize(ClipEdge(p1, p0));
-        sum += IntegrateEdge(prevClipPoint, clipPoint);
-        sum += IntegrateEdge(clipPoint, normalize(p1));
+        float3 clipPoint = ClipEdge(p1, p0);
+        diffuse += IntegrateEdgeDiffuse(normalize(prevClipPoint), normalize(clipPoint));
+        diffuse += IntegrateEdgeDiffuse(normalize(clipPoint), normalize(p1));
+        
+        clipPoint = mul(ltcMat, clipPoint);
+        specular += IntegrateEdge(normalize(mul(ltcMat, prevClipPoint)), normalize(clipPoint));
+        specular += IntegrateEdge(normalize(clipPoint), normalize(mul(ltcMat, p1)));
     }
 }
 
@@ -316,26 +436,38 @@ void EvaluatePolyEdge(in float3 p0, in float3 p1, inout float3 prevClipPoint, in
 //   positions - The buffer where the polygon positions are
 //   startIdx - The index of the first polygon position
 //   endIdx - The index of the point directly after the last polygon position
-//
+//   diffuse - The output diffuse response for the polygon light
+//   specular - The output specular response for the polygon light
 // The most complicated aspect of this function is clipping the polygon against the horizon of the surface point. See
 // EvaluatePolyEdge() above for details on the general concept. However, this function must deal with the case of the
 // first point being below the horizon. In that case, it needs to search in reverse from the end for the first point 
 // above the horizon, and save the intersection point between the above and below points so it can be used in 
 // EvaluatePolyEdge() later. During this search it also adjusts the end point index as necessary to avoid processing
 // those points that are below the horizon.
-float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, in float3x3 ltcMat, in StructuredBuffer<float4> positions, in uint startIdx, in uint endIdx)
+void LtcPolygonEvaluate(
+    in float3 pos, 
+    in float3 normal, 
+    in float3 dirToView,
+    in float3x3 ltcMat,
+    in StructuredBuffer<float4> positions,
+    in uint startIdx,
+    in uint endIdx,
+    out float diffuse,
+    out float specular
+)
 {
     if (endIdx - startIdx < 3)
     {
-        return 0.0; // Must have at least 3 points to form a polygon.
+        return; // Must have at least 3 points to form a polygon.
     }
 
     // Rotate ltc matrix
-    ltcMat = mul(ltcMat, BuildViewAlignedOrthonormalBasis(normal, dirToView));
+    float3x3 orthonormalMat = BuildViewAlignedOrthonormalBasis(normal, dirToView);
 
     // Prepare initial values
-    float sum = 0.0; // sum of edge integation
-    float3 p0 = mul(ltcMat, positions[startIdx].xyz - pos); // First point in polygon
+    float3 p0 = mul(orthonormalMat, positions[startIdx].xyz - pos); // First point in polygon
+    diffuse = 0.0;
+    specular = 0.0;
     
     float3 prevClipPoint = float3(0.0, 0.0, 0.0); // Used to hold previous clip point when polygon dips below horizon.
     float3 closePoint = p0;
@@ -349,10 +481,10 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
         // searching backwards, updating the endIdx along the way to avoid reprocessing those points later
         for ( ; endIdx > startIdx + 1; --endIdx)
         {
-            float3 prevPoint = mul(ltcMat, positions[endIdx - 1].xyz - pos);
-            if (prevPoint.z > 0)
+            float3 prevPoint = mul(orthonormalMat, positions[endIdx - 1].xyz - pos);
+            if (prevPoint.z > 0.0)
             {
-                prevClipPoint = normalize(ClipEdge(prevPoint, p0));
+                prevClipPoint = ClipEdge(prevPoint, p0);
                 closePoint = prevClipPoint;
                 break;
             }
@@ -362,7 +494,7 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
         // Check if all points below horizon
         if (endIdx == startIdx + 1)
         {
-            return 0.0; 
+            return; 
         }
 
         p0 = firstPoint; // Restore the original p0
@@ -371,13 +503,14 @@ float LtcPolygonEvaluate(in float3 pos, in float3 normal, in float3 dirToView, i
     // Evaluate all the points
     for (uint curIdx = startIdx + 1; curIdx < endIdx; ++curIdx)
     {
-        float3 p1 = mul(ltcMat, positions[curIdx].xyz - pos); // Current point in polygon
-        EvaluatePolyEdge(p0, p1, prevClipPoint, sum);
+        float3 p1 = mul(orthonormalMat, positions[curIdx].xyz - pos); // Current point in polygon
+        EvaluatePolyEdge(p0, p1, prevClipPoint, ltcMat, diffuse, specular);
         p0 = p1;
     }
     
-    EvaluatePolyEdge(p0, closePoint, prevClipPoint, sum);
+    EvaluatePolyEdge(p0, closePoint, prevClipPoint, ltcMat, diffuse, specular);
 
     // Note: negated due to winding order
-    return -sum;
+    diffuse = -diffuse;
+    specular = -specular;
 }

+ 8 - 9
Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli

@@ -50,26 +50,25 @@ void ApplyPoylgonLight(ViewSrg::PolygonLight light, Surface surface, inout Light
     float radiusAttenuation = 1.0 - (falloff * falloff);
     radiusAttenuation = radiusAttenuation * radiusAttenuation;
 
-    // Diffuse
-    static const float3x3 identityMatrix = float3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
-    float diffuse = LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, identityMatrix, ViewSrg::m_polygonLightPoints, startIndex, endIndex);
-    diffuse = doubleSided ? abs(diffuse) : max(0.0, diffuse);
-
-    // Specular
     float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear);
     float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords);
-    float3 specular = LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, ltcMat, ViewSrg::m_polygonLightPoints, startIndex, endIndex);
+
+    float diffuse = 0.0;
+    float specular = 0.0;
+
+    LtcPolygonEvaluate(surface.position, surface.normal, lightingData.dirToCamera, ltcMat, ViewSrg::m_polygonLightPoints, startIndex, endIndex, diffuse, specular);
+    diffuse = doubleSided ? abs(diffuse) : max(0.0, diffuse);
     specular = doubleSided ? abs(specular) : max(0.0, specular);
 
     // Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel)
     float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy;
-    specular *= schlick.x + (1.0 - surface.specularF0) * schlick.y;
+    float3 specularRGB = specular * (schlick.x + (1.0 - surface.specularF0) * schlick.y);
 
     // Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity
     float3 intensity = 0.5 * INV_PI * radiusAttenuation * abs(light.m_rgbIntensityNits);
 
     lightingData.diffuseLighting += surface.albedo * diffuse * intensity;
-    lightingData.specularLighting += surface.specularF0 * specular * intensity;
+    lightingData.specularLighting += surface.specularF0 * specularRGB * intensity;
 }
 
 void ApplyPolygonLights(Surface surface, inout LightingData lightingData)

+ 6 - 8
Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli

@@ -111,24 +111,22 @@ void ApplyQuadLight(ViewSrg::QuadLight light, Surface surface, inout LightingDat
         {
             float3 p[4] = {p0, p1, p2, p3};
             
-            // Diffuse
-            float3x3 identityMatrix = float3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
-            float diffuse = LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, identityMatrix, p, doubleSided);
-
-            // Specular
             float2 ltcCoords = LtcCoords(dot(surface.normal, lightingData.dirToCamera), surface.roughnessLinear);
             float3x3 ltcMat = LtcMatrix(SceneSrg::m_ltcMatrix, ltcCoords);
-            float3 specular = LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, ltcMat, p, doubleSided);
+            
+            float diffuse = 0.0;
+            float specular = 0.0;
+            LtcQuadEvaluate(surface.normal, lightingData.dirToCamera, ltcMat, p, doubleSided, diffuse, specular);
 
             // Apply BRDF scale terms (BRDF magnitude and Schlick Fresnel)
             float2 schlick = SceneSrg::m_ltcAmplification.Sample(PassSrg::LinearSampler, ltcCoords).xy;
-            specular *= schlick.x + (1.0 - surface.specularF0) * schlick.y;
+            float3 specularRGB = specular * (schlick.x + (1.0 - surface.specularF0) * schlick.y);
 
             // Scale by inverse surface area of hemisphere (1/2pi), attenuation, and light intensity
             float3 intensity = 0.5 * INV_PI * radiusAttenuation * light.m_rgbIntensityNits;
 
             lightingData.diffuseLighting += surface.albedo * diffuse * intensity;
-            lightingData.specularLighting += surface.specularF0 * specular * intensity;
+            lightingData.specularLighting += surface.specularF0 * specularRGB * intensity;
         }
         else
         {

+ 4 - 2
Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h

@@ -46,14 +46,16 @@ namespace AZ
             //! Save a buffer attachment or a image attachment binded to a pass's slot to a data file.
             //! @param passHierarchy For finding the pass by using PassHierarchyFilter
             //! @param slotName Name of the pass's slot. The attachment bound to this slot will be captured.
+            //! @param option Only valid for an InputOutput attachment. Use PassAttachmentReadbackOption::Input to capture the input state
+            //!               and use PassAttachmentReadbackOption::Output to capture the output state
             //! @param outputFilename The output file path. 
             virtual bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
-                , const AZStd::string& outputFilePath) = 0;
+                , const AZStd::string& outputFilePath, RPI::PassAttachmentReadbackOption option) = 0;
 
             //! Similar to CapturePassAttachment. But instead of saving the read back result to a file, it will call the callback function provide
             //! in the input when callback is finished
             virtual bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
-                , RPI::AttachmentReadback::CallbackFunction callback) = 0;
+                , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option) = 0;
 
         };
         using FrameCaptureRequestBus = EBus<FrameCaptureRequests>;

+ 11 - 29
Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp

@@ -343,7 +343,7 @@ namespace AZ
         }
 
         bool FrameCaptureSystemComponent::CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slot,
-            const AZStd::string& outputFilePath)
+            const AZStd::string& outputFilePath, RPI::PassAttachmentReadbackOption option)
         {
             InitReadback();
 
@@ -376,40 +376,22 @@ namespace AZ
                 return false;
             }
 
-            AZ::RPI::RenderPass* renderPass = azrtti_cast<AZ::RPI::RenderPass*>(foundPasses[0]);
-            if (renderPass)
+            AZ::RPI::Pass* pass = foundPasses[0];
+            if (pass->ReadbackAttachment(m_readback, Name(slot), option))
             {
-                Name slotName = Name(slot);
-                AZ::RPI::PassAttachment* attachment = nullptr;
-                for (auto& binding : renderPass->GetAttachmentBindings())
-                {
-                    if (binding.m_name == slotName)
-                    {
-                        attachment = binding.m_attachment.get();
-                        break;
-                    }
-                }
-                if (attachment)
-                {
-                    m_state = State::Pending;
-                    m_result = FrameCaptureResult::None;
-                    SystemTickBus::Handler::BusConnect();
-                    renderPass->ReadbackAttachment(m_readback, attachment);
-                }
-                else
-                {
-                    AZ_Warning("FrameCaptureSystemComponent", false, "Failed to find attachment bound to pass [%s] slot [%s]",
-                        renderPass->GetName().GetCStr(), slotName.GetCStr());
-                    return false;
-                }
+                m_state = State::Pending;
+                m_result = FrameCaptureResult::None;
+                SystemTickBus::Handler::BusConnect();
+                return true;
             }
-            return true;
+            AZ_Warning("FrameCaptureSystemComponent", false, "Failed to readback the attachment bound to pass [%s] slot [%s]", pass->GetName().GetCStr(), slot.c_str());
+            return false;
         }
 
         bool FrameCaptureSystemComponent::CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
-            , RPI::AttachmentReadback::CallbackFunction callback)
+            , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option)
         {
-            bool result = CapturePassAttachment(passHierarchy, slotName, "");
+            bool result = CapturePassAttachment(passHierarchy, slotName, "", option);
 
             // Append state change to user provided call back
             AZ::RPI::AttachmentReadback::CallbackFunction callbackSetState = [&, callback](const AZ::RPI::AttachmentReadback::ReadbackResult& result)

+ 3 - 2
Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h

@@ -36,9 +36,10 @@ namespace AZ
             bool CaptureScreenshot(const AZStd::string& filePath) override;
             bool CaptureScreenshotForWindow(const AZStd::string& filePath, AzFramework::NativeWindowHandle windowHandle) override;
             bool CaptureScreenshotWithPreview(const AZStd::string& outputFilePath) override;
-            bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName, const AZStd::string& outputFilePath) override;
+            bool CapturePassAttachment(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName, const AZStd::string& outputFilePath,
+                RPI::PassAttachmentReadbackOption option) override;
             bool CapturePassAttachmentWithCallback(const AZStd::vector<AZStd::string>& passHierarchy, const AZStd::string& slotName
-                , RPI::AttachmentReadback::CallbackFunction callback) override;
+                , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option) override;
 
         private:
             void CaptureAttachmentCallback(const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult);

+ 2 - 16
Gems/Atom/Feature/Common/Code/Source/LuxCore/LuxCoreTexturePass.cpp

@@ -64,23 +64,9 @@ namespace AZ
                 // Set up read back attachment before children prepare
                 if (m_readback->IsReady())
                 {
-                    AZ::RPI::RenderPass* renderPass = azrtti_cast<AZ::RPI::RenderPass*>(m_renderTargetPass.get());
-                    if (renderPass)
+                    if (m_renderTargetPass)
                     {
-                        RPI::PassAttachment* attachment = nullptr;
-                        for (auto& binding : renderPass->GetAttachmentBindings())
-                        {
-                            if (binding.m_slotType == RPI::PassSlotType::Output)
-                            {
-                                attachment = binding.m_attachment.get();
-                                break;
-                            }
-                        }
-                        if (attachment)
-                        {
-                            renderPass->ReadbackAttachment(m_readback, attachment);
-                            m_attachmentReadbackComplete = true;
-                        }
+                        m_attachmentReadbackComplete = m_renderTargetPass->ReadbackAttachment(m_readback, AZ::Name("RenderTargetOutput"));                           
                     }
                 }
             }

+ 2 - 0
Gems/Atom/RHI/Code/Source/RHI/RayTracingPipelineState.cpp

@@ -142,6 +142,8 @@ namespace AZ
 
         void RayTracingPipelineState::Shutdown()
         {
+            ShutdownInternal();
+            DeviceObject::Shutdown();
         }
     }
 }

+ 2 - 0
Gems/Atom/RPI/Code/CMakeLists.txt

@@ -25,6 +25,8 @@ ly_add_target(
         ../Assets/atom_rpi_asset_files.cmake
         ${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
         ${MASKED_OCCLUSION_CULLING_FILES}
+    PLATFORM_INCLUDE_FILES
+        ${CMAKE_CURRENT_LIST_DIR}/Source/Platform/Common/${PAL_TRAIT_COMPILER_ID}/atom_rpi_public_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
     INCLUDE_DIRECTORIES
         PRIVATE
             Source

+ 20 - 3
Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h

@@ -57,6 +57,7 @@ namespace AZ
         class PassTemplate;
         struct PassRequest;
         struct PassValidationResults;
+        class AttachmentReadback;
 
         using SortedPipelineViewTags = AZStd::set<PipelineViewTag, AZNameSortAscending>;
         using PassesByDrawList = AZStd::map<RHI::DrawListTag, const Pass*>;
@@ -65,7 +66,12 @@ namespace AZ
         const uint32_t PassInputBindingCountMax = 16;
         const uint32_t PassInputOutputBindingCountMax = PassInputBindingCountMax;
         const uint32_t PassOutputBindingCountMax = PassInputBindingCountMax;
-
+                
+        enum class PassAttachmentReadbackOption : uint8_t
+        {
+            Input = 0,
+            Output
+        };
 
         //! Atom's base pass class (every pass class in Atom must derive from this class).
         //! 
@@ -222,6 +228,14 @@ namespace AZ
             //! Enables/Disables PipelineStatistics queries for this pass
             virtual void SetPipelineStatisticsQueryEnabled(bool enable);
 
+            //! Readback an attachment attached to the specified slot name
+            //! @param readback The AttachmentReadback object which is used for readback. Its callback function will be called when readback is finished.
+            //! @param slotName The attachment bind to the slot with this slotName is to be readback
+            //! @param option The option is used for choosing input or output state when readback an InputOutput attachment.
+            //!               It's ignored if the attachment isn't an InputOutput attachment.
+            //! Return true if the readback request was successful. User may expect the AttachmentReadback's callback function would be called. 
+            bool ReadbackAttachment(AZStd::shared_ptr<AttachmentReadback> readback, const Name& slotName, PassAttachmentReadbackOption option = PassAttachmentReadbackOption::Output);
+
             //! Returns whether the Timestamp queries is enabled/disabled for this pass
             bool IsTimestampQueryEnabled() const;
 
@@ -266,7 +280,6 @@ namespace AZ
             // Update output bindings on this pass that are connected to bindings on other passes
             void UpdateConnectedOutputBindings();
 
-
         protected:
             explicit Pass(const PassDescriptor& descriptor);
 
@@ -349,6 +362,7 @@ namespace AZ
             void FrameEnd();
             virtual void FrameEndInternal() { }
 
+            void UpdateReadbackAttachment(FramePrepareParams params, bool beforeAddScopes);
 
             // --- Protected Members ---
 
@@ -442,7 +456,10 @@ namespace AZ
             // Sort type to be used by the default sort implementation. Passes can also provide
             // fully custom sort implementations by overriding the SortDrawList() function.
             RHI::DrawListSortType m_drawListSortType = RHI::DrawListSortType::KeyThenDepth;
-
+            
+            // For read back attachment
+            AZStd::shared_ptr<AttachmentReadback> m_attachmentReadback;
+            PassAttachmentReadbackOption m_readbackOption;
 
         private:
             // Return the Timestamp result of this pass

Некоторые файлы не были показаны из-за большого количества измененных файлов