Pārlūkot izejas kodu

Merging dev latest. Will this fix Jenkins test fails?

Signed-off-by: AMZN-Gene <[email protected]>
AMZN-Gene 8 mēneši atpakaļ
vecāks
revīzija
e6535cba67
100 mainītis faili ar 1146 papildinājumiem un 1771 dzēšanām
  1. 91 0
      .github/ISSUE_TEMPLATE/24.09-bug-report.yml
  2. 19 3
      Assets/Editor/Scripts/TrackView/example.py
  3. 5 3
      AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Main.py
  4. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_arch.material
  5. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_background.material
  6. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_bricks.material
  7. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_ceiling.material
  8. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_chain.material
  9. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columna.material
  10. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columnb.material
  11. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columnc.material
  12. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtainblue.material
  13. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtaingreen.material
  14. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtainred.material
  15. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_details.material
  16. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricblue.material
  17. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricgreen.material
  18. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricred.material
  19. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_flagpole.material
  20. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_floor.material
  21. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_leaf.material
  22. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_lion.material
  23. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vase.material
  24. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vasehanging.material
  25. 1 0
      AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vaseround.material
  26. 62 1
      AutomatedTesting/Levels/Graphics/SilhouetteTest/SilhouetteTest.prefab
  27. 626 0
      AutomatedTesting/ScriptCanvas/Silhouette.scriptcanvas
  28. 4 0
      AutomatedTesting/ShaderLib/scenesrg.srgi
  29. 4 0
      AutomatedTesting/ShaderLib/viewsrg.srgi
  30. 15 0
      Code/Editor/AnimationContext.cpp
  31. 5 3
      Code/Editor/AnimationContext.h
  32. 1 1
      Code/Editor/CMakeLists.txt
  33. 12 0
      Code/Editor/Controls/ReflectedPropertyControl/ReflectedPropertyItem.cpp
  34. 1 1
      Code/Editor/Controls/SplineCtrlEx.cpp
  35. 6 4
      Code/Editor/Controls/SplineCtrlEx.h
  36. 0 31
      Code/Editor/Core/EditorActionsHandler.cpp
  37. 2 19
      Code/Editor/CryEdit.cpp
  38. 0 10
      Code/Editor/CryEdit.h
  39. 4 0
      Code/Editor/GameEngine.cpp
  40. 1 56
      Code/Editor/IEditor.h
  41. 1 91
      Code/Editor/IEditorImpl.cpp
  42. 0 27
      Code/Editor/IEditorImpl.h
  43. 0 65
      Code/Editor/Include/IImageUtil.h
  44. 0 33
      Code/Editor/Include/ILogFile.h
  45. 1 16
      Code/Editor/Lib/Tests/IEditorMock.h
  46. 0 54
      Code/Editor/LogFileImpl.cpp
  47. 0 34
      Code/Editor/LogFileImpl.h
  48. 0 74
      Code/Editor/LogFile_mac.mm
  49. 0 1
      Code/Editor/Platform/Mac/platform_mac_files.cmake
  50. 1 0
      Code/Editor/Resource.h
  51. 0 6
      Code/Editor/Settings.h
  52. 1 1
      Code/Editor/TrackView/2DBezierKeyUIControls.cpp
  53. 1 1
      Code/Editor/TrackView/AssetBlendKeyUIControls.cpp
  54. 4 4
      Code/Editor/TrackView/AtomOutputFrameCapture.cpp
  55. 1 1
      Code/Editor/TrackView/CaptureKeyUIControls.cpp
  56. 1 1
      Code/Editor/TrackView/CommentKeyUIControls.cpp
  57. 1 1
      Code/Editor/TrackView/ConsoleKeyUIControls.cpp
  58. 1 1
      Code/Editor/TrackView/EventKeyUIControls.cpp
  59. 1 1
      Code/Editor/TrackView/GotoKeyUIControls.cpp
  60. 13 13
      Code/Editor/TrackView/KeyUIControls.h
  61. 1 1
      Code/Editor/TrackView/ScreenFaderKeyUIControls.cpp
  62. 1 1
      Code/Editor/TrackView/SelectKeyUIControls.cpp
  63. 1 1
      Code/Editor/TrackView/SequenceKeyUIControls.cpp
  64. 1 1
      Code/Editor/TrackView/SoundKeyUIControls.cpp
  65. 1 1
      Code/Editor/TrackView/TimeRangeKeyUIControls.cpp
  66. 1 1
      Code/Editor/TrackView/TrackEventKeyUIControls.cpp
  67. 6 2
      Code/Editor/TrackView/TrackViewAnimNode.cpp
  68. 3 3
      Code/Editor/TrackView/TrackViewAnimNode.h
  69. 4 4
      Code/Editor/TrackView/TrackViewDialog.cpp
  70. 10 10
      Code/Editor/TrackView/TrackViewDopeSheetBase.cpp
  71. 30 26
      Code/Editor/TrackView/TrackViewKeyPropertiesDlg.cpp
  72. 4 5
      Code/Editor/TrackView/TrackViewKeyPropertiesDlg.h
  73. 5 3
      Code/Editor/TrackView/TrackViewNode.cpp
  74. 1 1
      Code/Editor/TrackView/TrackViewNode.h
  75. 4 12
      Code/Editor/TrackView/TrackViewNodes.cpp
  76. 9 9
      Code/Editor/TrackView/TrackViewPythonFuncs.cpp
  77. 5 5
      Code/Editor/TrackView/TrackViewSequence.cpp
  78. 2 2
      Code/Editor/TrackView/TrackViewSequence.h
  79. 5 1
      Code/Editor/TrackView/TrackViewSequenceManager.cpp
  80. 2 2
      Code/Editor/TrackView/TrackViewTrack.cpp
  81. 4 4
      Code/Editor/TrackView/TrackViewTrack.h
  82. 85 30
      Code/Editor/TrackViewNewSequenceDialog.cpp
  83. 11 7
      Code/Editor/TrackViewNewSequenceDialog.h
  84. 4 5
      Code/Editor/Undo/Undo.cpp
  85. 1 0
      Code/Editor/Undo/Undo.h
  86. 0 526
      Code/Editor/Util/ImageUtil.cpp
  87. 0 78
      Code/Editor/Util/ImageUtil.h
  88. 0 83
      Code/Editor/Util/ImageUtil_impl.cpp
  89. 0 68
      Code/Editor/Util/ImageUtil_impl.h
  90. 2 3
      Code/Editor/Util/MemoryBlock.cpp
  91. 1 270
      Code/Editor/Viewport.cpp
  92. 0 36
      Code/Editor/Viewport.h
  93. 0 1
      Code/Editor/editor_core_files.cmake
  94. 0 7
      Code/Editor/editor_lib_files.cmake
  95. 2 2
      Code/Editor/splashscreen_background.png
  96. 12 0
      Code/Framework/AzAndroid/CMakeLists.txt
  97. 6 2
      Code/Framework/AzCore/AzCore/Component/Entity.cpp
  98. 4 0
      Code/Framework/AzCore/AzCore/Console/Console.cpp
  99. 10 0
      Code/Framework/AzCore/AzCore/Console/ConsoleTypeHelpers.inl
  100. 1 1
      Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp

+ 91 - 0
.github/ISSUE_TEMPLATE/24.09-bug-report.yml

@@ -0,0 +1,91 @@
+name: 24.09 Release Bug Report
+description: Template for submitting a bug for the 24.09 O3DE Release
+title: '24.09 Release - BUG NAME'
+labels: "kind/bug-2409,needs-triage,needs-sig"
+assignees:
+  - Ulrick28
+body:
+- type: textarea
+  id: bug-description
+  attributes:
+    label: Bug Description
+    description: "A clear and concise description of what the bug is. Try to isolate the issue to help 
+    the community to reproduce it easily and increase chances for a fast fix."
+  validations:
+    required: true
+- type: textarea
+  id: assets-required
+  attributes:
+    label: Assets-Required
+    description: "Please provide sample assets needed to reproduce the issue, either as an 
+    [attachment](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files) 
+    or as a link to a public asset in Github."
+  validations:
+    required: true
+- type: textarea
+  id: steps-to-reproduce
+  attributes:
+    label: Steps to Reproduce
+    description: "Steps to reproduce the behavior:
+    1. Go to '...'
+    2. Click on '...'
+    3. Select attached asset '...'
+    4. Scroll down to '...'
+    5. See error"
+  validations:
+    required: true
+- type: textarea
+  id: expected-behavior
+  attributes:
+    label: Expected Behavior
+    description: "A clear and concise description of what you expected to happen."
+  validations:
+    required: true
+- type: textarea
+  id: actual-behavior
+  attributes:
+    label: Actual Behavior
+    description: "A clear and concise description of what actually happened."
+  validations:
+    required: true
+- type: textarea
+  id: screenshots-videos
+  attributes:
+    label: Screenshots/Videos
+    description: "If applicable, add screenshots and/or a video to help explain your problem."
+  validations:
+    required: true
+- type: textarea
+  id: found-in-branch
+  attributes:
+    label: Found In Branch
+    description: "Name of or link to the branch where the issue occurs."
+  validations:
+    required: true
+- type: textarea
+  id: commit-ID-from
+  attributes:
+    label: Commit ID From
+    description: "Please provide the SHA/hash that identifies the latest commit from the o3de/o3de 
+    repository if the issue is reproducible in the development or other official branches. You can get 
+    the commit ID by running the `git rev-parse HEAD` command on your current branch."
+  validations:
+    required: true
+- type: textarea
+  id: desktop-device
+  attributes:
+    label: Desktop/Device
+    description: "Desktop/Device: Please please complete the following information
+     - Device: [e.g. PC, Mac, iPhone, Samsung] 
+     - OS: [e.g. Windows, macOS, iOS, Android]
+     - Version [e.g. 10, Monterey, Oreo]
+     - CPU [e.g. Intel I9-9900k , Ryzen 5900x, ]
+     - GPU [AMD 6800 XT, NVidia RTX 3090]
+     - Memory [e.g. 16GB]"
+  validations:
+    required: true
+- type: textarea
+  id: additional-context
+  attributes:
+    label: Additional Context
+    description: "Add any other context about the problem here."

+ 19 - 3
Assets/Editor/Scripts/TrackView/example.py

@@ -9,7 +9,23 @@
 This example script prints info of all TrackView sequences
 '''
 
-numTracks = trackview.get_num_sequences()
+import azlmbr.bus as bus
+import azlmbr.track_view as track_view
 
-for i in range(numTracks):
-    print "Sequence '", trackview.get_sequence_name(i), "':"
+test_sequence_name = 'Test Sequence 01'
+
+num_sequences = track_view.EditorLayerTrackViewRequestBus(bus.Broadcast, 'GetNumSequences')
+
+if num_sequences > 0:
+    print(f"Found {num_sequences} sequences")
+else:
+    track_view.EditorLayerTrackViewRequestBus(bus.Broadcast, 'NewSequence', test_sequence_name, 1)
+    print(f"Created new sequence {test_sequence_name}")
+
+num_sequences = track_view.EditorLayerTrackViewRequestBus(bus.Broadcast, 'GetNumSequences')
+print(f"Number of Sequences: {num_sequences}")
+
+for i in range(0, num_sequences):
+    returned_name = track_view.EditorLayerTrackViewRequestBus(bus.Broadcast, 'GetSequenceName', i)
+    time_range = track_view.EditorLayerTrackViewRequestBus(bus.Broadcast, 'GetSequenceTimeRange', returned_name)
+    print(f"Sequence {i}: {returned_name} | Start: {time_range.start} End: {time_range.end}")

+ 5 - 3
AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Main.py

@@ -37,11 +37,12 @@ def save_multiplayer_level_cache_folder_artifact(workspace, multiplayer_level):
 class TestAutomation(EditorTestSuite):
     class test_Multiplayer_BasicConnectivity_Connects(EditorSingleTest):
         from .tests import Multiplayer_BasicConnectivity_Connects as test_module
+        
+        timeout = 60.0 * 15.0 # increase timeout to ~15 minutes to accommodate for slow server startup
 
         def __init__(self):
             super(test_Multiplayer_BasicConnectivity_Connects, self).__init__()
-            self.timeout = 60.0 * 15.0 # increase timeout to ~15 minutes to accommodate for slow server startup
-        
+
         @classmethod
         def setup(cls, instance, request, workspace):
             save_multiplayer_level_cache_folder_artifact(workspace, "basicconnectivity_connects")
@@ -49,6 +50,7 @@ class TestAutomation(EditorTestSuite):
     class test_Multiplayer_BasicConnectivity_Connects_ClientServer(EditorSingleTest):
         from .tests import Multiplayer_BasicConnectivity_Connects_ClientServer as test_module
 
+        timeout = 60.0 * 15.0 # increase timeout to ~15 minutes to accommodate for slow server startup
+
         def __init__(self):
             super(test_Multiplayer_BasicConnectivity_Connects_ClientServer, self).__init__()
-            self.timeout = 60.0 * 15.0 # increase timeout to ~15 minutes to accommodate for slow server startup

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_arch.material

@@ -11,6 +11,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/arch_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/arch_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.050999999046325684,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_background.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/background_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/background_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.03099999949336052,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_bricks.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/bricks_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/bricks_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.algorithm": "ContactRefinement",

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_ceiling.material

@@ -16,6 +16,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/ceiling_1k_normal.png",
+        "normal.flipY": true,
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/ceiling_1k_roughness.png"
     }

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_chain.material

@@ -13,6 +13,7 @@
         "general.doubleSided": true,
         "metallic.factor": 0.8899999856948853,
         "normal.textureMap": "../Textures/chain_normal.jpg",
+        "normal.flipY": true,
         "opacity.alphaSource": "Split",
         "opacity.factor": 1.0,
         "opacity.mode": "Cutout",

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columna.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/columnA_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/columnA_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.017000000923871994,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columnb.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/columnB_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/columnB_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.020999999716877937,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_columnc.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/columnC_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/columnC_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.014000000432133675,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtainblue.material

@@ -13,6 +13,7 @@
         "metallic.textureMap": "../Textures/curtain_metallic.png",
         "normal.factor": 0.5,
         "normal.textureMap": "../Textures/curtain_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/curtain_ao.png",
         "roughness.textureMap": "../Textures/curtain_roughness.png",
         "specularF0.enableMultiScatterCompensation": true

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtaingreen.material

@@ -13,6 +13,7 @@
         "metallic.textureMap": "../Textures/curtain_metallic.png",
         "normal.factor": 0.5,
         "normal.textureMap": "../Textures/curtain_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/curtain_ao.png",
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/curtain_roughness.png"

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_curtainred.material

@@ -12,6 +12,7 @@
         ],
         "metallic.textureMap": "../Textures/curtain_metallic.png",
         "normal.textureMap": "../Textures/curtain_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/curtain_ao.png",
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/curtain_roughness.png",

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_details.material

@@ -9,6 +9,7 @@
         "general.applySpecularAA": true,
         "metallic.textureMap": "../Textures/details_1k_metallic.png",
         "normal.textureMap": "../Textures/details_1k_normal.png",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/details_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.02500000037252903,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricblue.material

@@ -14,6 +14,7 @@
         "metallic.textureMap": "../Textures/fabric_metallic.png",
         "normal.factor": 0.5,
         "normal.textureMap": "../Textures/fabric_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/fabric_ao.png",
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/fabric_roughness.png"

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricgreen.material

@@ -14,6 +14,7 @@
         "metallic.textureMap": "../Textures/fabric_metallic.png",
         "normal.factor": 0.5,
         "normal.textureMap": "../Textures/fabric_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/fabric_ao.png",
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/fabric_roughness.png"

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_fabricred.material

@@ -14,6 +14,7 @@
         "metallic.textureMap": "../Textures/fabric_metallic.png",
         "normal.factor": 0.5,
         "normal.textureMap": "../Textures/fabric_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/fabric_ao.png",
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/fabric_roughness.png"

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_flagpole.material

@@ -12,6 +12,7 @@
         ],
         "metallic.textureMap": "../Textures/flagpole_1k_metallic.png",
         "normal.textureMap": "../Textures/flagpole_1k_normal.png",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/flagpole_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.014000000432133675,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_floor.material

@@ -14,6 +14,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/floor_1k_normal.png",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/floor_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.012000000104308128,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_leaf.material

@@ -15,6 +15,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/thorn_normal.jpg",
+        "normal.flipY": true,
         "opacity.alphaSource": "Split",
         "opacity.factor": 0.20000000298023224,
         "opacity.mode": "Cutout",

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_lion.material

@@ -16,6 +16,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/lion_1k_normal.jpg",
+        "normal.flipY": true,
         "opacity.factor": 1.0,
         "roughness.textureMap": "../Textures/lion_1k_roughness.png"
     }

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vase.material

@@ -12,6 +12,7 @@
         ],
         "metallic.textureMap": "../Textures/vase_1k_metallic.png",
         "normal.textureMap": "../Textures/vase_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/vase_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.027000000700354576,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vasehanging.material

@@ -12,6 +12,7 @@
         ],
         "metallic.textureMap": "../Textures/vaseHanging_1k_metallic.png",
         "normal.textureMap": "../Textures/vaseHanging_1k_normal.png",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/vaseHanging_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.04600000008940697,

+ 1 - 0
AutomatedTesting/Gem/Sponza/Assets/objects/sponza_mat_vaseround.material

@@ -15,6 +15,7 @@
             1.0
         ],
         "normal.textureMap": "../Textures/vaseRound_1k_normal.jpg",
+        "normal.flipY": true,
         "occlusion.diffuseTextureMap": "../Textures/vaseRound_1k_ao.png",
         "opacity.factor": 1.0,
         "parallax.factor": 0.019999999552965164,

+ 62 - 1
AutomatedTesting/Levels/Graphics/SilhouetteTest/SilhouetteTest.prefab

@@ -26,7 +26,8 @@
                     "Entity_[6289932813408]",
                     "Entity_[6010759939168]",
                     "Entity_[4195937910594]",
-                    "Entity_[1014068446616]"
+                    "Entity_[1014068446616]",
+                    "Entity_[500470478144]"
                 ]
             },
             "Component_[15230859088967841193]": {
@@ -651,6 +652,66 @@
                 }
             }
         },
+        "Entity_[500470478144]": {
+            "Id": "Entity_[500470478144]",
+            "Name": "SilhouetteCVAR",
+            "Components": {
+                "EditorDisabledCompositionComponent": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 9117092890701956949
+                },
+                "EditorEntityIconComponent": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 7579579611351949855
+                },
+                "EditorEntitySortComponent": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 15290678515227949929
+                },
+                "EditorInspectorComponent": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 13610854406190871550
+                },
+                "EditorLockComponent": {
+                    "$type": "EditorLockComponent",
+                    "Id": 3717411995798002536
+                },
+                "EditorOnlyEntityComponent": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 13680329333075483739
+                },
+                "EditorPendingCompositionComponent": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 2975523452465594470
+                },
+                "EditorScriptCanvasComponent": {
+                    "$type": "EditorScriptCanvasComponent",
+                    "Id": 13629354981518808831,
+                    "configuration": {
+                        "sourceHandle": {
+                            "id": "{1C739A69-B4B6-5055-A2F7-8F3C8F6FA040}",
+                            "path": "ScriptCanvas/Silhouette.scriptcanvas"
+                        },
+                        "sourceName": "Silhouette.scriptcanvas",
+                        "propertyOverrides": {
+                            "source": {
+                                "id": "{1C739A69-B4B6-5055-A2F7-8F3C8F6FA040}",
+                                "path": "ScriptCanvas/Silhouette.scriptcanvas"
+                            }
+                        }
+                    }
+                },
+                "EditorVisibilityComponent": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 13963243713210499304
+                },
+                "TransformComponent": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 15981358364288810544,
+                    "Parent Entity": "Entity_[1146574390643]"
+                }
+            }
+        },
         "Entity_[515852240280]": {
             "Id": "Entity_[515852240280]",
             "Name": "Shader Ball (Visible)",

+ 626 - 0
AutomatedTesting/ScriptCanvas/Silhouette.scriptcanvas

@@ -0,0 +1,626 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "ScriptCanvasData",
+    "ClassData": {
+        "m_scriptCanvas": {
+            "Id": {
+                "id": 655089300800
+            },
+            "Name": "Script Canvas Graph",
+            "Components": {
+                "Component_[12884397704112171065]": {
+                    "$type": "EditorGraph",
+                    "Id": 12884397704112171065,
+                    "m_graphData": {
+                        "m_nodes": [
+                            {
+                                "Id": {
+                                    "id": 5495517443392
+                                },
+                                "Name": "SC-Node(ExecuteConsoleCommand)",
+                                "Components": {
+                                    "Component_[16978772701306804442]": {
+                                        "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+                                        "Id": 16978772701306804442,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{191CEB6C-0A98-4D3F-A78D-F46E699CE287}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "String",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{656CC550-632A-4BB4-851D-C376358B5A3F}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B7CD92CE-BE03-4818-B75D-E5C178390262}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Out",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 5
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+                                                "value": "r_silhouette 0",
+                                                "label": "Command"
+                                            }
+                                        ],
+                                        "methodType": 0,
+                                        "methodName": "ExecuteConsoleCommand",
+                                        "className": "ConsoleRequestBus",
+                                        "inputSlots": [
+                                            {
+                                                "m_id": "{191CEB6C-0A98-4D3F-A78D-F46E699CE287}"
+                                            }
+                                        ],
+                                        "prettyClassName": "ConsoleRequestBus"
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 16769806595392
+                                },
+                                "Name": "EBusEventHandler",
+                                "Components": {
+                                    "Component_[2956567096039969287]": {
+                                        "$type": "EBusEventHandler",
+                                        "Id": 2956567096039969287,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{366F0012-CAB6-4FD1-A660-C15D69D95B65}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Connect",
+                                                "toolTip": "Connect this event handler to the specified entity.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B70E4A19-A39E-4176-890B-FFAF53D959F2}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Disconnect",
+                                                "toolTip": "Disconnect this event handler.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{41A4A51E-60A8-4A5F-AB00-E8E2BBBFA0DF}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnConnected",
+                                                "toolTip": "Signaled when a connection has taken place.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{DAD77787-1391-4200-B68C-32E400BC4683}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnDisconnected",
+                                                "toolTip": "Signaled when this event handler is disconnected.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{E182A1D8-16D7-40E1-9FAC-172EA4AC93BB}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnFailure",
+                                                "toolTip": "Signaled when it is not possible to connect this handler.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{F2B6C70F-C6FC-4CB2-ABB8-82AD7879E6EF}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Source",
+                                                "toolTip": "ID used to connect on a specific Event address (Type: EntityId)",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{5293BB09-79D0-4CE7-AFD6-27545A74ECDC}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{93008807-7799-4E9C-9E1D-DDBB455B87F4}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnEntityActivated",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{2644B100-E433-41B4-80A0-00FEBE570792}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{E0BAF21D-FE72-4119-A150-1EE9CAF18CB6}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnEntityDeactivated",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 1
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "EntityId",
+                                                "value": {
+                                                    "id": 2901262558
+                                                }
+                                            }
+                                        ],
+                                        "Id": 2956567096039969287,
+                                        "m_eventMap": [
+                                            {
+                                                "Key": {
+                                                    "Value": 245425936
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnEntityActivated",
+                                                    "m_eventId": {
+                                                        "Value": 245425936
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{93008807-7799-4E9C-9E1D-DDBB455B87F4}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{5293BB09-79D0-4CE7-AFD6-27545A74ECDC}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 1
+                                                }
+                                            },
+                                            {
+                                                "Key": {
+                                                    "Value": 4273369222
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnEntityDeactivated",
+                                                    "m_eventId": {
+                                                        "Value": 4273369222
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{E0BAF21D-FE72-4119-A150-1EE9CAF18CB6}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{2644B100-E433-41B4-80A0-00FEBE570792}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 1
+                                                }
+                                            }
+                                        ],
+                                        "m_ebusName": "EntityBus",
+                                        "m_busId": {
+                                            "Value": 3358774020
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 3296494187840
+                                },
+                                "Name": "SC-Node(ExecuteConsoleCommand)",
+                                "Components": {
+                                    "Component_[4104562768843824295]": {
+                                        "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+                                        "Id": 4104562768843824295,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{CB50526B-6071-4675-9195-2E65841C0EB7}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "String",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{A65F464C-8276-43AF-BE4D-6123338795A0}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{773813E9-2272-4430-ACBF-3F22F6D5AAD2}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Out",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 5
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+                                                "value": "r_silhouette 1",
+                                                "label": "Command"
+                                            }
+                                        ],
+                                        "methodType": 0,
+                                        "methodName": "ExecuteConsoleCommand",
+                                        "className": "ConsoleRequestBus",
+                                        "inputSlots": [
+                                            {
+                                                "m_id": "{CB50526B-6071-4675-9195-2E65841C0EB7}"
+                                            }
+                                        ],
+                                        "prettyClassName": "ConsoleRequestBus"
+                                    }
+                                }
+                            }
+                        ],
+                        "m_connections": [
+                            {
+                                "Id": {
+                                    "id": 19329607103808
+                                },
+                                "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(ExecuteConsoleCommand: In)",
+                                "Components": {
+                                    "Component_[3460867018602754265]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 3460867018602754265,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 16769806595392
+                                            },
+                                            "slotId": {
+                                                "m_id": "{93008807-7799-4E9C-9E1D-DDBB455B87F4}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 3296494187840
+                                            },
+                                            "slotId": {
+                                                "m_id": "{A65F464C-8276-43AF-BE4D-6123338795A0}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 20446298600768
+                                },
+                                "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityDeactivated), destEndpoint=(ExecuteConsoleCommand: In)",
+                                "Components": {
+                                    "Component_[9498010169431111038]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 9498010169431111038,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 16769806595392
+                                            },
+                                            "slotId": {
+                                                "m_id": "{E0BAF21D-FE72-4119-A150-1EE9CAF18CB6}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 5495517443392
+                                            },
+                                            "slotId": {
+                                                "m_id": "{656CC550-632A-4BB4-851D-C376358B5A3F}"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        ]
+                    },
+                    "versionData": {
+                        "_grammarVersion": 1,
+                        "_runtimeVersion": 1,
+                        "_fileVersion": 1
+                    },
+                    "GraphCanvasData": [
+                        {
+                            "Key": {
+                                "id": 655089300800
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+                                        "$type": "SceneComponentSaveData",
+                                        "ViewParams": {
+                                            "AnchorX": 13.0,
+                                            "AnchorY": -5.0
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 3296494187840
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "MethodNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            620.0,
+                                            180.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData",
+                                        "SubStyle": ".method"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{E0A0CF0F-E6FC-4C90-B167-3CB2C399C9A1}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 5495517443392
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "MethodNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            640.0,
+                                            460.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData",
+                                        "SubStyle": ".method"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{56393B3E-DD52-4094-B9A3-008377CFFDC9}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 16769806595392
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            180.0,
+                                            160.0
+                                        ]
+                                    },
+                                    "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": {
+                                        "$type": "EBusHandlerNodeDescriptorSaveData",
+                                        "EventIds": [
+                                            {
+                                                "Value": 245425936
+                                            },
+                                            {
+                                                "Value": 4273369222
+                                            }
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{EA05E2BE-62ED-454D-A7A2-8D359AA3A4E2}"
+                                    }
+                                }
+                            }
+                        }
+                    ],
+                    "StatisticsHelper": {
+                        "InstanceCounter": [
+                            {
+                                "Key": 5842116757075334384,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 5842116761103598202,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 13774516393157610292,
+                                "Value": 2
+                            }
+                        ]
+                    }
+                },
+                "Component_[5601587301036697695]": {
+                    "$type": "EditorGraphVariableManagerComponent",
+                    "Id": 5601587301036697695
+                }
+            }
+        }
+    }
+}

+ 4 - 0
AutomatedTesting/ShaderLib/scenesrg.srgi

@@ -14,6 +14,10 @@
 
 #include <Atom/Features/SrgSemantics.azsli>
 
+#define AZ_COLLECTING_PARTIAL_SRG_INCLUDES
+#include <Atom/Feature/Common/Assets/ShaderResourceGroups/ViewSrgIncludesAll.azsli>
+#undef AZ_COLLECTING_PARTIAL_SRG_INCLUDES
+
 partial ShaderResourceGroup SceneSrg : SRG_PerScene
 {
 /* Intentionally Empty. Helps define the SrgSemantic for SceneSrg once.*/

+ 4 - 0
AutomatedTesting/ShaderLib/viewsrg.srgi

@@ -14,6 +14,10 @@
 
 #include <Atom/Features/SrgSemantics.azsli>
 
+#define AZ_COLLECTING_PARTIAL_SRG_INCLUDES
+#include <Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgIncludesAll.azsli>
+#undef AZ_COLLECTING_PARTIAL_SRG_INCLUDES
+
 partial ShaderResourceGroup ViewSrg : SRG_PerView
 {
 /* Intentionally Empty. Helps define the SrgSemantic for ViewSrg once.*/

+ 15 - 0
Code/Editor/AnimationContext.cpp

@@ -18,6 +18,7 @@
 #include "TrackView/TrackViewDialog.h"
 #include "ViewManager.h"
 
+#include <AzCore/Serialization/Locale.h>
 #include <AzCore/Time/ITime.h>
 
 //////////////////////////////////////////////////////////////////////////
@@ -112,11 +113,13 @@ CAnimationContext::CAnimationContext()
     GetIEditor()->GetUndoManager()->AddListener(this);
     GetIEditor()->GetSequenceManager()->AddListener(this);
     GetIEditor()->RegisterNotifyListener(this);
+    AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler::BusConnect();
 }
 
 //////////////////////////////////////////////////////////////////////////
 CAnimationContext::~CAnimationContext()
 {
+    AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler::BusDisconnect();
     GetIEditor()->GetSequenceManager()->RemoveListener(this);
     GetIEditor()->GetUndoManager()->RemoveListener(this);
     GetIEditor()->UnregisterNotifyListener(this);
@@ -601,7 +604,11 @@ void CAnimationContext::GoToFrameCmd(IConsoleCmdArgs* pArgs)
         return;
     }
 
+    // console commands are in the invariant locale, for atof()
+    AZ::Locale::ScopedSerializationLocale scopedLocale;
     float targetFrame = (float)atof(pArgs->GetArg(1));
+    scopedLocale.Deactivate();
+
     if (pSeq->GetTimeRange().start > targetFrame || targetFrame > pSeq->GetTimeRange().end)
     {
         gEnv->pLog->LogError("GoToFrame: requested time %f is outside the range of sequence %s (%f, %f)", targetFrame, pSeq->GetName().c_str(), pSeq->GetTimeRange().start, pSeq->GetTimeRange().end);
@@ -647,6 +654,14 @@ void CAnimationContext::EndUndoTransaction()
     SetRecordingInternal(m_bSavedRecordingState);
 }
 
+void CAnimationContext::OnPrefabInstancePropagationEnd()
+{
+    if (m_pSequence)
+    {
+        m_pSequence->BindToEditorObjects();
+    }
+}
+
 //////////////////////////////////////////////////////////////////////////
 void CAnimationContext::TogglePlay()
 {

+ 5 - 3
Code/Editor/AnimationContext.h

@@ -16,6 +16,7 @@
 #include "TrackView/TrackViewSequenceManager.h"
 #include <Range.h>
 #include <IMovieSystem.h>
+#include <AzToolsFramework/Prefab/PrefabPublicNotificationBus.h>
 
 class CTrackViewSequence;
 
@@ -27,17 +28,16 @@ struct IAnimationContextListener
     virtual void OnTimeChanged([[maybe_unused]] float newTime) {}
 };
 
-AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
 /** CAnimationContext stores information about current editable animation sequence.
         Stores information about whenever animation is being recorded know,
         current sequence, current time in sequence etc.
 */
-class SANDBOX_API CAnimationContext
+class CAnimationContext
     : public IEditorNotifyListener
     , public IUndoManagerListener
     , public ITrackViewSequenceManagerListener
+    , public AzToolsFramework::Prefab::PrefabPublicNotificationBus::Handler
 {
-    AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
 public:
     //////////////////////////////////////////////////////////////////////////
     // Constructors.
@@ -192,6 +192,8 @@ private:
     virtual void BeginUndoTransaction() override;
     virtual void EndUndoTransaction() override;
 
+    void OnPrefabInstancePropagationEnd() override;
+
     virtual void OnSequenceRemoved(CTrackViewSequence* pSequence) override;
 
     virtual void OnEditorNotifyEvent(EEditorNotifyEvent event) override;

+ 1 - 1
Code/Editor/CMakeLists.txt

@@ -111,7 +111,7 @@ ly_add_target(
             AZ::AtomCore
             Gem::Atom_RPI.Edit
             Gem::Atom_RPI.Public
-            Gem::Atom_Feature_Common.Static
+            Gem::Atom_Feature_Common.Public
             Gem::AtomToolsFramework.Static
             Gem::AtomViewportDisplayInfo
             Gem::EditorModeFeedback.Editor.Static

+ 12 - 0
Code/Editor/Controls/ReflectedPropertyControl/ReflectedPropertyItem.cpp

@@ -18,6 +18,8 @@
 #include "ReflectedPropertyCtrl.h"
 #include "Undo/UndoVariableChange.h"
 
+#include <AzCore/Serialization/Locale.h>
+
 // default number of increments to cover the range of a property - determined experimentally by feel
 const float ReflectedPropertyItem::s_DefaultNumStepIncrements = 500.0f;
 
@@ -32,6 +34,16 @@ const float ReflectedPropertyItem::s_DefaultNumStepIncrements = 500.0f;
 
 static ColorF StringToColor(const QString &value)
 {
+    // note that converting back and forth between these values is happening in 2 cases
+    // one is when its being read from the UI and the other is when it is being read from XML
+    // XML is always in "C" locale, and the GUI is ultimately using @ref type_convertor in Variable.h
+    // which itself uses QString::number, which is always in the "C" locale (invariant culture).
+    // for example, color is converted using the following line
+    // void operator()(const Vec4& value, QString& to) const { to = QString::fromLatin1("%1,%2,%3,%4").arg(value.x).arg(value.y).arg(value.z).arg(value.w); }
+    // qstring::arg uses the "C" Locale unless explicitly using the notation %L1, %L2, etc, so the input will be invariant.
+
+    AZ::Locale::ScopedSerializationLocale localeScope;
+
     ColorF color;
     float r, g, b, a;
     int res = azsscanf(value.toUtf8().data(), "%f,%f,%f,%f", &r, &g, &b, &a);

+ 1 - 1
Code/Editor/Controls/SplineCtrlEx.cpp

@@ -2667,7 +2667,7 @@ void AbstractSplineWidget::SelectAll()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void SplineWidget::SendNotifyEvent(int nEvent)
+void SplineWidget::SendNotifyEvent(const uint32_t nEvent)
 {
     if (nEvent == SPLN_BEFORE_CHANGE)
     {

+ 6 - 4
Code/Editor/Controls/SplineCtrlEx.h

@@ -37,8 +37,10 @@
 #define SPLN_KEY_SELECTION_CHANGE (0x0005)
 
 #ifndef NM_CLICK
-#define NM_CLICK (-2)
-#define NM_RCLICK (-5)
+// from commctrl.h
+#define NM_FIRST (0U - 0U)
+#define NM_CLICK (NM_FIRST - 2)
+#define NM_RCLICK (NM_FIRST - 5)
 #endif
 
 #ifdef LoadCursor
@@ -233,7 +235,7 @@ protected:
 
     void SetHorizontalExtent(int min, int max);
 
-    virtual void SendNotifyEvent(int nEvent) = 0;
+    virtual void SendNotifyEvent(const uint32_t nEvent) = 0;
 
     virtual void SelectRectangle(const QRect& rc, bool bSelect);
     //////////////////////////////////////////////////////////////////////////
@@ -403,7 +405,7 @@ protected:
 
     void DrawTangentHandle(QPainter* pDC, int nSpline, int nKey, int nDimension);
 
-    void SendNotifyEvent(int nEvent) override;
+    void SendNotifyEvent(const uint32_t nEvent) override;
 
     void captureMouseImpl() override { grabMouse(); }
     void releaseMouseImpl() override { releaseMouse(); }

+ 0 - 31
Code/Editor/Core/EditorActionsHandler.cpp

@@ -1417,21 +1417,6 @@ void EditorActionsHandler::OnActionRegistrationHook()
         );
     }
 
-    // GameLift Documentation
-    {
-        AzToolsFramework::ActionProperties actionProperties;
-        actionProperties.m_name = "GameLift Documentation";
-        actionProperties.m_category = "Help";
-
-        m_actionManagerInterface->RegisterAction(
-            EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.documentation.gamelift", actionProperties,
-            [cryEdit = m_cryEditApp]
-            {
-                cryEdit->OnDocumentationGamelift();
-            }
-        );
-    }
-
     // Release Notes
     {
         AzToolsFramework::ActionProperties actionProperties;
@@ -1477,21 +1462,6 @@ void EditorActionsHandler::OnActionRegistrationHook()
         );
     }
 
-    // AWS Support
-    {
-        AzToolsFramework::ActionProperties actionProperties;
-        actionProperties.m_name = "AWS Support";
-        actionProperties.m_category = "Help";
-
-        m_actionManagerInterface->RegisterAction(
-            EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.resources.awssupport", actionProperties,
-            [cryEdit = m_cryEditApp]
-            {
-                cryEdit->OnDocumentationAWSSupport();
-            }
-        );
-    }
-
     // About O3DE
     {
         AzToolsFramework::ActionProperties actionProperties;
@@ -1967,7 +1937,6 @@ void EditorActionsHandler::OnMenuBindingHook()
         {
             m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, "o3de.action.help.resources.gamedevblog", 100);
             m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, "o3de.action.help.resources.forums", 200);
-            m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, "o3de.action.help.resources.awssupport", 300);
         }
         m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::HelpMenuIdentifier, 500);
         m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpMenuIdentifier, "o3de.action.help.abouto3de", 600);

+ 2 - 19
Code/Editor/CryEdit.cpp

@@ -1962,12 +1962,6 @@ void CCryEditApp::OnDocumentationO3DE()
     QDesktopServices::openUrl(QUrl(webLink));
 }
 
-void CCryEditApp::OnDocumentationGamelift()
-{
-    QString webLink = tr("https://docs.aws.amazon.com/gamelift/");
-    QDesktopServices::openUrl(QUrl(webLink));
-}
-
 void CCryEditApp::OnDocumentationReleaseNotes()
 {
     QString webLink = tr("https://o3de.org/docs/release-notes/");
@@ -1976,19 +1970,13 @@ void CCryEditApp::OnDocumentationReleaseNotes()
 
 void CCryEditApp::OnDocumentationGameDevBlog()
 {
-    QString webLink = tr("https://aws.amazon.com/blogs/gamedev");
+    QString webLink = tr("https://o3de.org/news-blogs/");
     QDesktopServices::openUrl(QUrl(webLink));
 }
 
 void CCryEditApp::OnDocumentationForums()
 {
-    QString webLink = tr("https://o3de.org/community/");
-    QDesktopServices::openUrl(QUrl(webLink));
-}
-
-void CCryEditApp::OnDocumentationAWSSupport()
-{
-    QString webLink = tr("https://aws.amazon.com/contact-us");
+    QString webLink = tr("https://discord.com/invite/o3de");
     QDesktopServices::openUrl(QUrl(webLink));
 }
 
@@ -3318,11 +3306,6 @@ void CCryEditApp::PrintAlways(const AZStd::string& output)
     m_stdoutRedirection.WriteBypassingRedirect(output.c_str(), static_cast<unsigned int>(output.size()));
 }
 
-QString CCryEditApp::GetRootEnginePath() const
-{
-    return m_rootEnginePath;
-}
-
 void CCryEditApp::RedirectStdoutToNull()
 {
     m_stdoutRedirection.RedirectTo(AZ::IO::SystemFile::GetNullFilename());

+ 0 - 10
Code/Editor/CryEdit.h

@@ -109,7 +109,6 @@ public:
 
     static CCryEditApp* instance();
 
-    bool GetRootEnginePath(QDir& rootEnginePath) const;
     bool CreateLevel(bool& wasCreateLevelOperationCancelled);
     void LoadFile(QString fileName);
     void ForceNextIdleProcessing() { m_bForceProcessIdle = true; }
@@ -170,8 +169,6 @@ public:
 
     CCryDocManager* GetDocManager() { return m_pDocManager; }
 
-    void RegisterActionHandlers();
-
     // Implementation
     void OnCreateLevel();
     void OnOpenLevel();
@@ -181,23 +178,17 @@ public:
     void OnDocumentationTutorials();
     void OnDocumentationGlossary();
     void OnDocumentationO3DE();
-    void OnDocumentationGamelift();
     void OnDocumentationReleaseNotes();
     void OnDocumentationGameDevBlog();
     void OnDocumentationForums();
-    void OnDocumentationAWSSupport();
-    void OnCommercePublish();
-    void OnCommerceMerch();
     void OnEditHold();
     void OnEditFetch();
     void OnFileExportToGameNoSurfaceTexture();
     void OnViewSwitchToGame();
     void OnViewSwitchToGameFullScreen();
-    void OnViewDeploy();
     void OnMoveObject();
     void OnRenameObj();
     void OnUndo();
-    void OnOpenAssetImporter();
     void OnEditLevelData();
     void OnFileEditLogFile();
     void OnFileEditEditorini();
@@ -359,7 +350,6 @@ private:
     void OnViewConfigureLayout();
 
     void OnCustomizeKeyboard();
-    void OnToolsConfiguretools();
     void OnToolsScriptHelp();
     void OnViewCycle2dviewport();
     void OnDisplayGotoPosition();

+ 4 - 0
Code/Editor/GameEngine.cpp

@@ -19,6 +19,7 @@
 #include <AzCore/Component/ComponentApplication.h>
 #include <AzCore/IO/IStreamer.h>
 #include <AzCore/IO/Streamer/FileRequest.h>
+#include <AzCore/Serialization/Locale.h>
 #include <AzCore/std/parallel/binary_semaphore.h>
 #include <AzCore/Console/IConsole.h>
 
@@ -277,6 +278,9 @@ void KillMemory(IConsoleCmdArgs* /* pArgs */)
 
 static void CmdGotoEditor(IConsoleCmdArgs* pArgs)
 {
+    // Console commands are assumed to be in the culture invariant locale since they can come from data files.
+    AZ::Locale::ScopedSerializationLocale scopedLocale;
+
     // feature is mostly useful for QA purposes, this works with the game "goto" command
     // this console command actually is used by the game command, the editor command shouldn't be used by the user
     int iArgCount = pArgs->GetArgCount();

+ 1 - 56
Code/Editor/IEditor.h

@@ -60,9 +60,7 @@ struct AABB;
 struct IErrorReport; // Vladimir@conffx
 struct IFileUtil;  // Vladimir@conffx
 struct IEditorLog;  // Vladimir@conffx
-struct IImageUtil;  // Vladimir@conffx
 struct IEditorParticleUtils;  // Leroy@conffx
-struct ILogFile; // Vladimir@conffx
 
 // Qt
 
@@ -230,17 +228,6 @@ enum AxisConstrains
     AXIS_TERRAIN,
 };
 
-//! Reference coordinate system values
-enum RefCoordSys
-{ // Don't change this order. Should be in the same order as MainWindow::CreateRefCoordComboBox()
-    COORDS_VIEW = 0,
-    COORDS_LOCAL,
-    COORDS_PARENT,
-    COORDS_WORLD,
-    COORDS_USERDEFINED,
-    LAST_COORD_SYSTEM, // Must always be the last member
-};
-
 // Insert locations for menu items
 enum EMenuInsertLocation
 {
@@ -256,14 +243,6 @@ enum EMenuInsertLocation
     eMenuHelp
 };
 
-//! Global editor operation mode
-enum EOperationMode
-{
-    eOperationModeNone = 0, // None
-    eCompositingMode, // Normal operation mode where objects are composited in the scene
-    eModellingMode // Geometry modeling mode
-};
-
 //! Mouse events that viewport can send
 enum EMouseEvent
 {
@@ -457,15 +436,6 @@ struct IEditor
     virtual void SetActiveView(CViewport* viewport) = 0;
     virtual struct IEditorFileMonitor* GetFileMonitor() = 0;
 
-    //! QMimeData is used by the Qt clipboard.
-    //! IMPORTANT: Any QMimeData allocated for the clipboard will be deleted
-    //! when the editor exists. If a QMimeData is allocated by a different
-    //! memory allocator (for example, in a different DLL) than the one used
-    //! by the main editor, a crash will occur on exit, if data is left in
-    //! the clipboard. The solution is to enfore all allocations of QMimeData
-    //! using CreateQMimeData().
-    virtual QMimeData* CreateQMimeData() const = 0;
-    virtual void DestroyQMimeData(QMimeData* data) const = 0;
 
     //////////////////////////////////////////////////////////////////////////
     // Access for CLevelIndependentFileMan
@@ -478,33 +448,16 @@ struct IEditor
     virtual void ResetViews() = 0;
     //! Update information in track view dialog.
     virtual void ReloadTrackView() = 0;
-    //! Current position marker
-    virtual Vec3 GetMarkerPosition() = 0;
-    //! Set current position marker.
-    virtual void    SetMarkerPosition(const Vec3& pos) = 0;
-    //! Set current selected region.
-    virtual void    SetSelectedRegion(const AABB& box) = 0;
-    //! Get currently selected region.
-    virtual void    GetSelectedRegion(AABB& box) = 0;
-
-    virtual void SetOperationMode(EOperationMode mode) = 0;
-    virtual EOperationMode GetOperationMode() = 0;
+
     //! Set constrain on specified axis for objects construction and modifications.
     //! @param axis one of AxisConstrains enumerations.
     virtual void SetAxisConstraints(AxisConstrains axis) = 0;
     //! Get axis constrain for objects construction and modifications.
     virtual AxisConstrains GetAxisConstrains() = 0;
-    //! Set whether axes are forced to the same value when they are changed (x = y = z).
-    virtual void SetAxisVectorLock(bool bAxisVectorLock) = 0;
-    //! Get whether axes are forced to the same value when they are changed (x = y = z).
-    virtual bool IsAxisVectorLocked() = 0;
     //! If set, when axis terrain constrain is selected, snapping only to terrain.
     virtual void SetTerrainAxisIgnoreObjects(bool bIgnore) = 0;
     virtual bool IsTerrainAxisIgnoreObjects() = 0;
-    //! Set current reference coordinate system used when constructing/modifying objects.
-    virtual void SetReferenceCoordSys(RefCoordSys refCoords) = 0;
     //! Get current reference coordinate system used when constructing/modifying objects.
-    virtual RefCoordSys GetReferenceCoordSys() = 0;
     virtual XmlNodeRef FindTemplate(const QString& templateName) = 0;
     virtual void AddTemplate(const QString& templateName, XmlNodeRef& tmpl) = 0;
 
@@ -583,10 +536,6 @@ struct IEditor
     virtual void RegisterNotifyListener(IEditorNotifyListener* listener) = 0;
     //! Unregister Editor notifications listener.
     virtual void UnregisterNotifyListener(IEditorNotifyListener* listener) = 0;
-    //! Register document notifications listener.
-    virtual void RegisterDocListener(IDocListener* listener) = 0;
-    //! Unregister document notifications listener.
-    virtual void UnregisterDocListener(IDocListener* listener) = 0;
 
     virtual void ReduceMemory() = 0;
 
@@ -594,13 +543,9 @@ struct IEditor
     virtual void ReloadTemplates() = 0;
     virtual void ShowStatusText(bool bEnable) = 0;
 
-
     virtual SSystemGlobalEnvironment* GetEnv() = 0;
-    virtual IImageUtil* GetImageUtil() = 0;  // Vladimir@conffx
     virtual SEditorSettings* GetEditorSettings() = 0;
 
-    virtual ILogFile* GetLogFile() = 0;  // Vladimir@conffx
-
     // unload all plugins
     virtual void UnloadPlugins() = 0;
 

+ 1 - 91
Code/Editor/IEditorImpl.cpp

@@ -55,8 +55,6 @@
 #include "MainStatusBar.h"
 
 #include "Util/FileUtil_impl.h"
-#include "Util/ImageUtil_impl.h"
-#include "LogFileImpl.h"
 
 #include "Editor/AssetDatabase/AssetDatabaseLocationListener.h"
 #include "Editor/AzAssetBrowser/AzAssetBrowserRequestHandler.h"
@@ -79,17 +77,13 @@ static CCryEditDoc * theDocument;
 const char* CEditorImpl::m_crashLogFileName = "SessionStatus/editor_statuses.json";
 
 CEditorImpl::CEditorImpl()
-    : m_operationMode(eOperationModeNone)
-    , m_pSystem(nullptr)
+    : m_pSystem(nullptr)
     , m_pFileUtil(nullptr)
     , m_pCommandManager(nullptr)
     , m_pPluginManager(nullptr)
     , m_pViewManager(nullptr)
     , m_pUndoManager(nullptr)
-    , m_marker(0, 0, 0)
     , m_selectedAxis(AXIS_TERRAIN)
-    , m_refCoordsSys(COORDS_LOCAL)
-    , m_bAxisVectorLock(false)
     , m_bUpdates(true)
     , m_bTerrainAxisIgnoreObjects(false)
     , m_pDisplaySettings(nullptr)
@@ -109,15 +103,12 @@ CEditorImpl::CEditorImpl()
     , m_bInitialized(false)
     , m_bExiting(false)
     , m_QtApplication(static_cast<Editor::EditorQtApplication*>(qApp))
-    , m_pImageUtil(nullptr)
-    , m_pLogFile(nullptr)
 {
     // note that this is a call into EditorCore.dll, which stores the g_pEditorPointer for all shared modules that share EditorCore.dll
     // this means that they don't need to do SetIEditor(...) themselves and its available immediately
     SetIEditor(this);
 
     m_pFileUtil = new CFileUtil_impl();
-    m_pLogFile = new CLogFileImpl();
     m_pLevelIndependentFileMan = new CLevelIndependentFileMan;
     SetPrimaryCDFolder();
     gSettings.Load();
@@ -135,9 +126,6 @@ CEditorImpl::CEditorImpl()
     m_pSequenceManager = new CTrackViewSequenceManager;
     m_pAnimationContext = new CAnimationContext;
 
-    m_pImageUtil = new CImageUtil_impl();
-    m_selectedRegion.min = Vec3(0, 0, 0);
-    m_selectedRegion.max = Vec3(0, 0, 0);
     DetectVersion();
     RegisterTools();
 
@@ -280,8 +268,6 @@ CEditorImpl::~CEditorImpl()
     SAFE_DELETE(m_pErrorReport);
 
     SAFE_DELETE(m_pFileUtil); // Vladimir@Conffx
-    SAFE_DELETE(m_pImageUtil); // Vladimir@Conffx
-    SAFE_DELETE(m_pLogFile); // Vladimir@Conffx
 }
 
 void CEditorImpl::SetPrimaryCDFolder()
@@ -482,17 +468,6 @@ IMainStatusBar* CEditorImpl::GetMainStatusBar()
     return MainWindow::instance()->StatusBar();
 }
 
-void CEditorImpl::SetOperationMode(EOperationMode mode)
-{
-    m_operationMode = mode;
-    gSettings.operationMode = mode;
-}
-
-EOperationMode CEditorImpl::GetOperationMode()
-{
-    return m_operationMode;
-}
-
 void CEditorImpl::SetAxisConstraints(AxisConstrains axisFlags)
 {
     m_selectedAxis = axisFlags;
@@ -518,29 +493,6 @@ bool CEditorImpl::IsTerrainAxisIgnoreObjects()
     return m_bTerrainAxisIgnoreObjects;
 }
 
-void CEditorImpl::SetReferenceCoordSys(RefCoordSys refCoords)
-{
-    m_refCoordsSys = refCoords;
-
-    // Update all views.
-    UpdateViews(eUpdateObjects, nullptr);
-
-    // Update the construction plane infos.
-    CViewport* pViewport = GetActiveView();
-    if (pViewport)
-    {
-        pViewport->MakeConstructionPlane(GetIEditor()->GetAxisConstrains());
-    }
-
-    Notify(eNotify_OnRefCoordSysChange);
-}
-
-RefCoordSys CEditorImpl::GetReferenceCoordSys()
-{
-    return m_refCoordsSys;
-}
-
-
 CSettingsManager* CEditorImpl::GetSettingsManager()
 {
     // Do not go any further before XML class is ready to use
@@ -631,16 +583,6 @@ const QColor& CEditorImpl::GetColorByName(const QString& name)
     return m_QtApplication->GetColorByName(name);
 }
 
-void CEditorImpl::SetSelectedRegion(const AABB& box)
-{
-    m_selectedRegion = box;
-}
-
-void CEditorImpl::GetSelectedRegion(AABB& box)
-{
-    box = m_selectedRegion;
-}
-
 const QtViewPane* CEditorImpl::OpenView(QString sViewClassName, bool reuseOpened)
 {
     auto openMode = reuseOpened ? QtViewPane::OpenMode::None : QtViewPane::OpenMode::MultiplePanes;
@@ -1092,24 +1034,6 @@ ITrackViewSequenceManager* CEditorImpl::GetSequenceManagerInterface()
     return GetSequenceManager();
 }
 
-void CEditorImpl::RegisterDocListener(IDocListener* listener)
-{
-    CCryEditDoc* doc = GetDocument();
-    if (doc)
-    {
-        doc->RegisterListener(listener);
-    }
-}
-
-void CEditorImpl::UnregisterDocListener(IDocListener* listener)
-{
-    CCryEditDoc* doc = GetDocument();
-    if (doc)
-    {
-        doc->UnregisterListener(listener);
-    }
-}
-
 void CEditorImpl::StartLevelErrorReportRecording()
 {
     IErrorReport* errorReport = GetErrorReport();
@@ -1241,17 +1165,3 @@ SEditorSettings* CEditorImpl::GetEditorSettings()
     return &gSettings;
 }
 
-IImageUtil* CEditorImpl::GetImageUtil()
-{
-    return m_pImageUtil;
-}
-
-QMimeData* CEditorImpl::CreateQMimeData() const
-{
-    return new QMimeData();
-}
-
-void CEditorImpl::DestroyQMimeData(QMimeData* data) const
-{
-    delete data;
-}

+ 0 - 27
Code/Editor/IEditorImpl.h

@@ -161,23 +161,13 @@ public:
     void UpdateViews(int flags, const AABB* updateRegion) override;
     void ResetViews() override;
     void ReloadTrackView() override;
-    Vec3 GetMarkerPosition() override { return m_marker; };
-    void SetMarkerPosition(const Vec3& pos) override { m_marker = pos; };
-    void    SetSelectedRegion(const AABB& box) override;
-    void    GetSelectedRegion(AABB& box) override;
     bool AddToolbarItem(uint8 iId, IUIEvent* pIHandler);
     void SetDataModified() override;
-    void SetOperationMode(EOperationMode mode) override;
-    EOperationMode GetOperationMode() override;
 
     void SetAxisConstraints(AxisConstrains axis) override;
     AxisConstrains GetAxisConstrains() override;
-    void SetAxisVectorLock(bool bAxisVectorLock) override { m_bAxisVectorLock = bAxisVectorLock; }
-    bool IsAxisVectorLocked() override { return m_bAxisVectorLock; }
     void SetTerrainAxisIgnoreObjects(bool bIgnore) override;
     bool IsTerrainAxisIgnoreObjects() override;
-    void SetReferenceCoordSys(RefCoordSys refCoords) override;
-    RefCoordSys GetReferenceCoordSys() override;
     XmlNodeRef FindTemplate(const QString& templateName) override;
     void AddTemplate(const QString& templateName, XmlNodeRef& tmpl) override;
 
@@ -231,10 +221,6 @@ public:
     void NotifyExcept(EEditorNotifyEvent event, IEditorNotifyListener* listener) override;
     void RegisterNotifyListener(IEditorNotifyListener* listener) override;
     void UnregisterNotifyListener(IEditorNotifyListener* listener) override;
-    //! Register document notifications listener.
-    void RegisterDocListener(IDocListener* listener) override;
-    //! Unregister document notifications listener.
-    void UnregisterDocListener(IDocListener* listener) override;
 
     void ReduceMemory() override;
     ESystemConfigPlatform GetEditorConfigPlatform() const override;
@@ -242,16 +228,11 @@ public:
     void ShowStatusText(bool bEnable) override;
 
     SSystemGlobalEnvironment* GetEnv() override;
-    IImageUtil* GetImageUtil() override;  // Vladimir@conffx
     SEditorSettings* GetEditorSettings() override;
-    ILogFile* GetLogFile() override { return m_pLogFile; }
 
     void UnloadPlugins() override;
     void LoadPlugins() override;
 
-    QMimeData* CreateQMimeData() const override;
-    void DestroyQMimeData(QMimeData* data) const override;
-
 protected:
 
     AZStd::string LoadProjectIdFromProjectData();
@@ -263,18 +244,13 @@ protected:
     //! List of all notify listeners.
     std::list<IEditorNotifyListener*> m_listeners;
 
-    EOperationMode m_operationMode;
     ISystem* m_pSystem;
     IFileUtil* m_pFileUtil;
     CEditorCommandManager* m_pCommandManager;
     CPluginManager* m_pPluginManager;
     CViewManager*   m_pViewManager;
     CUndoManager* m_pUndoManager;
-    Vec3 m_marker;
-    AABB m_selectedRegion;
     AxisConstrains m_selectedAxis;
-    RefCoordSys m_refCoordsSys;
-    bool m_bAxisVectorLock;
     bool m_bUpdates;
     bool m_bTerrainAxisIgnoreObjects;
     SFileVersion m_fileVersion;
@@ -318,9 +294,6 @@ protected:
     AzAssetBrowserRequestHandler* m_pAssetBrowserRequestHandler;
     AssetEditorRequestsHandler* m_assetEditorRequestsHandler;
 
-    IImageUtil* m_pImageUtil;  // Vladimir@conffx
-    ILogFile* m_pLogFile;  // Vladimir@conffx
-
     AZStd::mutex m_pluginMutex; // protect any pointers that come from plugins, such as the source control cached pointer.
     static const char* m_crashLogFileName;
 };

+ 0 - 65
Code/Editor/Include/IImageUtil.h

@@ -1,65 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#ifndef CRYINCLUDE_EDITOR_INCLUDE_IIMAGEUTIL_H
-#define CRYINCLUDE_EDITOR_INCLUDE_IIMAGEUTIL_H
-#pragma once
-
-#include "Util/Image.h"
-class CAlphaBitmap;
-
-struct IImageUtil
-{
-    virtual ~IImageUtil() = default;
-    
-    //! Load image, detect image type by file extension.
-    // Arguments:
-    //   pQualityLoss - 0 if info is not needed, pointer to the result otherwise - not need to preinitialize
-    virtual bool LoadImage(const QString& fileName, CImageEx& image, bool* pQualityLoss = 0) = 0;
-
-    //! Save image, detect image type by file extension.
-    virtual bool SaveImage(const QString& fileName, CImageEx& image) = 0;
-
-    // General image fucntions
-    virtual bool LoadJPEG(const QString& strFileName, CImageEx& image) = 0;
-
-    virtual bool SaveJPEG(const QString& strFileName, CImageEx& image) = 0;
-
-    virtual bool SaveBitmap(const QString& szFileName, CImageEx& image) = 0;
-
-    virtual bool LoadBmp(const QString& file, CImageEx& image) = 0;
-
-    virtual bool SavePGM(const QString& fileName, const CImageEx& image) = 0;
-
-    virtual bool LoadPGM(const QString& fileName, CImageEx& image) = 0;
-
-    //! Scale source image to fit size of target image.
-    virtual void ScaleToFit(const CByteImage& srcImage, CByteImage& trgImage) = 0;
-
-    //! Scale source image to fit size of target image.
-    virtual void ScaleToFit(const CImageEx& srcImage, CImageEx& trgImage) = 0;
-
-    //! Scale source image to fit twice side by side in target image.
-    virtual void ScaleToDoubleFit(const CImageEx& srcImage, CImageEx& trgImage) = 0;
-
-    //! Scale source image twice down image with filering
-    enum _EAddrMode
-    {
-        WRAP, CLAMP
-    };
-    virtual void DownScaleSquareTextureTwice(const CImageEx& srcImage, CImageEx& trgImage, _EAddrMode eAddressingMode = WRAP) = 0;
-
-    //! Smooth image.
-    virtual void SmoothImage(CByteImage& image, int numSteps) = 0;
-
-    //! behavior outside of the texture is not defined
-    //! \param iniX in fix point 24.8
-    //! \param iniY in fix point 24.8
-    //! \return 0..255
-    virtual unsigned char GetBilinearFilteredAt(const int iniX256, const int iniY256, const CByteImage& image) = 0;
-};
-#endif // CRYINCLUDE_EDITOR_INCLUDE_IIMAGEUTIL_H

+ 0 - 33
Code/Editor/Include/ILogFile.h

@@ -1,33 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#ifndef CRYINCLUDE_EDITORCORE_INCLUDE_ILOGFILE_H
-#define CRYINCLUDE_EDITORCORE_INCLUDE_ILOGFILE_H
-
-#pragma once
-
-struct ILogFile
-{
-    virtual ~ILogFile() = default;
-    
-    virtual const char* GetLogFileName() = 0;
-
-    //! Write to log spanpshot of current process memory usage.
-    virtual QString GetMemUsage() = 0;
-
-    virtual void WriteString(const char* pszString) = 0;
-    virtual void WriteLine(const char* pszLine) = 0;
-    virtual void FormatLine(const char* pszMessage, ...) = 0;
-
-    // logs some useful information
-    // should be called after CryLog() is available
-    virtual void AboutSystem() = 0;
-
-    virtual void Warning(const char* format, ...) = 0;
-};
-
-#endif // CRYINCLUDE_EDITORCORE_INCLUDE_ILOGFILE_H

+ 1 - 16
Code/Editor/Lib/Tests/IEditorMock.h

@@ -81,26 +81,15 @@ public:
     MOCK_METHOD0(GetActiveView, class CViewport* ());
     MOCK_METHOD1(SetActiveView, void(CViewport*));
     MOCK_METHOD0(GetFileMonitor, struct IEditorFileMonitor* ());
-    MOCK_CONST_METHOD0(CreateQMimeData, QMimeData* ());
-    MOCK_CONST_METHOD1(DestroyQMimeData, void(QMimeData*));
     MOCK_METHOD0(GetLevelIndependentFileMan, class CLevelIndependentFileMan* ());
     MOCK_METHOD2(UpdateViews, void(int , const AABB* ));
     MOCK_METHOD0(ResetViews, void());
     MOCK_METHOD0(ReloadTrackView, void());
-    MOCK_METHOD0(GetMarkerPosition, Vec3());
-    MOCK_METHOD1(SetMarkerPosition, void(const Vec3&));
-    MOCK_METHOD1(SetSelectedRegion, void(const AABB& box));
-    MOCK_METHOD1(GetSelectedRegion, void(AABB& box));
-    MOCK_METHOD1(SetOperationMode, void(EOperationMode ));
-    MOCK_METHOD0(GetOperationMode, EOperationMode());
+
     MOCK_METHOD1(SetAxisConstraints, void(AxisConstrains ));
     MOCK_METHOD0(GetAxisConstrains, AxisConstrains());
-    MOCK_METHOD1(SetAxisVectorLock, void(bool));
-    MOCK_METHOD0(IsAxisVectorLocked, bool());
     MOCK_METHOD1(SetTerrainAxisIgnoreObjects, void(bool));
     MOCK_METHOD0(IsTerrainAxisIgnoreObjects, bool());
-    MOCK_METHOD1(SetReferenceCoordSys, void(RefCoordSys ));
-    MOCK_METHOD0(GetReferenceCoordSys, RefCoordSys());
     MOCK_METHOD1(FindTemplate, XmlNodeRef(const QString& ));
     MOCK_METHOD2(AddTemplate, void(const QString& , XmlNodeRef& ));
     MOCK_METHOD2(OpenView, const QtViewPane* (QString , bool ));
@@ -140,16 +129,12 @@ public:
     MOCK_METHOD2(NotifyExcept, void(EEditorNotifyEvent , IEditorNotifyListener* ));
     MOCK_METHOD1(RegisterNotifyListener, void(IEditorNotifyListener* ));
     MOCK_METHOD1(UnregisterNotifyListener, void(IEditorNotifyListener* ));
-    MOCK_METHOD1(RegisterDocListener, void(IDocListener* ));
-    MOCK_METHOD1(UnregisterDocListener, void(IDocListener* ));
     MOCK_METHOD0(ReduceMemory, void());
     MOCK_CONST_METHOD0(GetEditorConfigPlatform, ESystemConfigPlatform());
     MOCK_METHOD0(ReloadTemplates, void());
     MOCK_METHOD1(ShowStatusText, void(bool ));
     MOCK_METHOD0(GetEnv, SSystemGlobalEnvironment* ());
-    MOCK_METHOD0(GetImageUtil, IImageUtil* ());
     MOCK_METHOD0(GetEditorSettings, SEditorSettings* ());
-    MOCK_METHOD0(GetLogFile, ILogFile* ());
     MOCK_METHOD0(UnloadPlugins, void());
     MOCK_METHOD0(LoadPlugins, void());
     MOCK_METHOD1(GetSearchPath, QString(EEditorPathName));

+ 0 - 54
Code/Editor/LogFileImpl.cpp

@@ -1,54 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#include "EditorDefs.h"
-
-#include "LogFileImpl.h"
-
-// Interface which we expose via GetIEditor()
-#include "LogFile.h"
-
-const char* CLogFileImpl::GetLogFileName()
-{
-    return CLogFile::GetLogFileName();
-}
-
-QString CLogFileImpl::GetMemUsage()
-{
-    return CLogFile::GetMemUsage();
-}
-
-void CLogFileImpl::WriteString(const char* pszString)
-{
-    CLogFile::WriteString(pszString);
-}
-
-void CLogFileImpl::WriteLine(const char* pszLine)
-{
-    CLogFile::WriteLine(pszLine);
-}
-
-void CLogFileImpl::FormatLine(const char* pszMessage, ...)
-{
-    va_list ArgList;
-    va_start(ArgList, pszMessage);
-    CLogFile::FormatLineV(pszMessage, ArgList);
-    va_end(ArgList);
-}
-
-void CLogFileImpl::AboutSystem()
-{
-    CLogFile::AboutSystem();
-}
-
-void CLogFileImpl::Warning(const char* format, ...)
-{
-    va_list ArgList;
-    va_start(ArgList, format);
-    ::WarningV(format, ArgList);
-    va_end(ArgList);
-}

+ 0 - 34
Code/Editor/LogFileImpl.h

@@ -1,34 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#ifndef CRYINCLUDE_EDITOR_LOGFILEIMPL_H
-#define CRYINCLUDE_EDITOR_LOGFILEIMPL_H
-#pragma once
-
-#include <Include/ILogFile.h>
-
-class CLogFileImpl
-    : public ILogFile
-{
-public:
-    virtual const char* GetLogFileName() override;
-
-    //! Write to log spanpshot of current process memory usage.
-    virtual QString GetMemUsage() override;
-
-    virtual void WriteString(const char* pszString) override;
-    virtual void WriteLine(const char* pszLine) override;
-    virtual void FormatLine(const char* pszMessage, ...) override;
-
-    // logs some useful information
-    // should be called after CryLog() is available
-    virtual void AboutSystem() override;
-
-    virtual void Warning(const char* format, ...) override;
-};
-
-#endif // CRYINCLUDE_EDITOR_LOGFILEIMPL_H

+ 0 - 74
Code/Editor/LogFile_mac.mm

@@ -1,74 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#import <Cocoa/Cocoa.h>
-
-#include <QString>
-
-QString operatingSystemVersionString()
-{
-    NSString* operatingSystemVersionString = [[NSProcessInfo processInfo] operatingSystemVersionString];
-    return QString::fromNSString(operatingSystemVersionString);
-}
-
-QString graphicsCardName()
-{
-    QString name;
-
-    // Get dictionary of all the PCI Devicces
-    CFMutableDictionaryRef matchDict = IOServiceMatching("IOPCIDevice");
-
-    // Create an iterator
-    io_iterator_t iterator;
-
-#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 120000 // Needs to be 120000 instead of __MAC_12_0 because that will not be defined in earlier versions on the SDK.
-    if (IOServiceGetMatchingServices(kIOMainPortDefault,matchDict,
-                                     &iterator) == kIOReturnSuccess)
-#else
-    if (IOServiceGetMatchingServices(kIOMasterPortDefault,matchDict,
-                                     &iterator) == kIOReturnSuccess)
-#endif
-    {
-        // Iterator for devices found
-        io_registry_entry_t regEntry;
-
-        while ((regEntry = IOIteratorNext(iterator))) {
-            // Put this services object into a dictionary object.
-            CFMutableDictionaryRef serviceDictionary;
-            if (IORegistryEntryCreateCFProperties(regEntry,
-                                                  &serviceDictionary,
-                                                  kCFAllocatorDefault,
-                                                  kNilOptions) != kIOReturnSuccess)
-            {
-                // Service dictionary creation failed.
-                IOObjectRelease(regEntry);
-                continue;
-            }
-            const void *GPUModel = CFDictionaryGetValue(serviceDictionary, @"model");
-
-            if (GPUModel != nil) {
-                if (CFGetTypeID(GPUModel) == CFDataGetTypeID()) {
-                    // Create a string from the CFDataRef.
-                    NSString *modelName = [[NSString alloc] initWithData:
-                                           (NSData *)GPUModel encoding:NSASCIIStringEncoding];
-
-                    name = QString::fromNSString(modelName);
-                    [modelName release];
-                }
-            }
-            // Release the dictionary
-            CFRelease(serviceDictionary);
-            // Release the serviceObject
-            IOObjectRelease(regEntry);
-        }
-        // Release the iterator
-        IOObjectRelease(iterator);
-    }
-
-    return name;
-}

+ 0 - 1
Code/Editor/Platform/Mac/platform_mac_files.cmake

@@ -8,7 +8,6 @@
 
 set(FILES
     Editor/Core/QtEditorApplication_mac.mm
-    ../../LogFile_mac.mm
     ../../WindowObserver_mac.h
     ../../WindowObserver_mac.mm
     ../../MainWindow_mac.mm

+ 1 - 0
Code/Editor/Resource.h

@@ -173,6 +173,7 @@
 #define ID_SWITCHCAMERA_SEQUENCECAMERA             33701
 #define ID_SWITCHCAMERA_SELECTEDCAMERA             33702
 #define ID_TV_RECORD_AUTO                          33703
+#define ID_TV_STOP_HARD_RESET                      33704
 #define ID_VIEW_OPENVIEWPANE                       33709
 #define ID_VIEW_OPENPANE_FIRST          33712
 #define ID_VIEW_OPENPANE_LAST           33811

+ 0 - 6
Code/Editor/Settings.h

@@ -361,12 +361,6 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
 
     SGUI_Settings gui;
 
-    // Read only parameter.
-    // Refects the status of GetIEditor()->GetOperationMode
-    // To change current operation mode use GetIEditor()->SetOperationMode
-    // see EOperationMode
-    int operationMode;
-
     // For the texture browser configurations.
     STextureBrowserSettings sTextureBrowserSettings;
 

+ 1 - 1
Code/Editor/TrackView/2DBezierKeyUIControls.cpp

@@ -15,7 +15,7 @@
 #include "Controls/ReflectedPropertyControl/ReflectedPropertyItem.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool C2DBezierKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool C2DBezierKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -34,7 +34,7 @@ void CAssetBlendKeyUIControls::ResetStartEndLimits(float assetBlendKeyDuration)
     mv_blendOutTime.GetVar()->SetLimits(time_zero, assetBlendKeyDuration, step, true, true);
 }
 
-bool CAssetBlendKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CAssetBlendKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -13,7 +13,7 @@
 #include <Atom/RPI.Public/Scene.h>
 #include <Atom/RPI.Public/View.h>
 #include <Atom/RPI.Reflect/System/RenderPipelineDescriptor.h>
-#include <PostProcess/PostProcessFeatureProcessor.h>
+#include <Atom/Feature/PostProcess/PostProcessFeatureProcessorInterface.h>
 #include <AzCore/Component/TransformBus.h>
 #include <AzCore/Math/MatrixUtils.h>
 #include <AzCore/Name/Name.h>
@@ -49,7 +49,7 @@ namespace TrackView
         m_view = AZ::RPI::View::CreateView(viewName, AZ::RPI::View::UsageCamera);
         m_renderPipeline->SetDefaultView(m_view);
         m_targetView = scene.GetDefaultRenderPipeline()->GetDefaultView();
-        if (AZ::Render::PostProcessFeatureProcessor* fp = scene.GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessor>())
+        if (auto* fp = scene.GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessorInterface>())
         {
             // This will be set again to mimic the active camera in UpdateView
             fp->SetViewAlias(m_view, m_targetView);
@@ -58,7 +58,7 @@ namespace TrackView
 
     void AtomOutputFrameCapture::DestroyPipeline(AZ::RPI::Scene& scene)
     {
-        if (AZ::Render::PostProcessFeatureProcessor* fp = scene.GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessor>())
+        if (auto* fp = scene.GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessorInterface>())
         {
             // Remove view alias introduced in CreatePipeline and UpdateView
             fp->RemoveViewAlias(m_view);
@@ -76,7 +76,7 @@ namespace TrackView
         {
             if (AZ::RPI::Scene* scene = SceneFromGameEntityContext())
             {
-                if (AZ::Render::PostProcessFeatureProcessor* fp = scene->GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessor>())
+                if (auto* fp = scene->GetFeatureProcessor<AZ::Render::PostProcessFeatureProcessorInterface>())
                 {
                     fp->SetViewAlias(m_view, targetView);
                     m_targetView = targetView;

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool CCaptureKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CCaptureKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool CCommentKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CCommentKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"  // for CTrackViewKeyUIControls
 
 //////////////////////////////////////////////////////////////////////////
-bool CConsoleKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CConsoleKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -15,7 +15,7 @@
 #include <CryCommon/Maestro/Types/AnimParamType.h>  // AnimParamType
 
 //////////////////////////////////////////////////////////////////////////
-bool CEventKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CEventKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool CGotoKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CGotoKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

+ 13 - 13
Code/Editor/TrackView/KeyUIControls.h

@@ -36,7 +36,7 @@ public:
     {
         return trackType == eAnimCurveType_BezierFloat;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 0; }
@@ -98,7 +98,7 @@ public:
         return valueType == AnimValueType::AssetBlend;
     }
 
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -145,7 +145,7 @@ public:
     {
         return paramType == AnimParamType::Capture;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -207,7 +207,7 @@ public:
     {
         return paramType == AnimParamType::CommentText;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -240,7 +240,7 @@ public:
     {
         return paramType == AnimParamType::Console;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -282,7 +282,7 @@ public:
     {
         return paramType == AnimParamType::Event;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -324,7 +324,7 @@ public:
             return false;
         }
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -390,7 +390,7 @@ public:
 
     //-----------------------------------------------------------------------------
     //!
-    bool OnKeySelectionChange(CTrackViewKeyBundle& keys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& keys) override;
 
     //-----------------------------------------------------------------------------
     //!
@@ -437,7 +437,7 @@ public:
     {
         return valueType == AnimValueType::Select;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -490,7 +490,7 @@ public:
     {
         return paramType == AnimParamType::Sequence;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -535,7 +535,7 @@ public:
     {
         return paramType == AnimParamType::Sound;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -575,7 +575,7 @@ public:
     {
         return paramType == AnimParamType::TimeRanges;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }
@@ -610,7 +610,7 @@ public:
     {
         return paramType == AnimParamType::TrackEvent;
     }
-    bool OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys) override;
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys) override;
     void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys) override;
 
     unsigned int GetPriority() const override { return 1; }

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

@@ -18,7 +18,7 @@
 #include "TrackViewKeyPropertiesDlg.h"
 
 //-----------------------------------------------------------------------------
-bool CScreenFaderKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& keys)
+bool CScreenFaderKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& keys)
 {
     if (!keys.AreAllKeysOfSameType())
     {

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

@@ -23,7 +23,7 @@ CSelectKeyUIControls::~CSelectKeyUIControls()
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool CSelectKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CSelectKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewDialog.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool CSequenceKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CSequenceKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"  // for CTrackViewKeyUIControls
 
 //////////////////////////////////////////////////////////////////////////
-bool CSoundKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CSoundKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -17,7 +17,7 @@
 #include "TrackViewKeyPropertiesDlg.h"              // for CTrackViewKeyUIControls// Editor
 
 //////////////////////////////////////////////////////////////////////////
-bool CTimeRangeKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CTimeRangeKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

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

@@ -18,7 +18,7 @@
 #include "TVEventsDialog.h"
 
 //////////////////////////////////////////////////////////////////////////
-bool CTrackEventKeyUIControls::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CTrackEventKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     if (!selectedKeys.AreAllKeysOfSameType())
     {

+ 6 - 2
Code/Editor/TrackView/TrackViewAnimNode.cpp

@@ -293,8 +293,12 @@ void CTrackViewAnimNode::BindToEditorObjects()
         if (const AZ::EntityId entityId = GetNodeEntityId();
             entityId.IsValid())
         {
-            RegisterEditorObjectListeners(entityId);
-            SetNodeEntityId(entityId);
+            const auto entity = AzToolsFramework::GetEntityById(entityId);
+            if (entity)
+            {
+                RegisterEditorObjectListeners(entityId);
+                SetNodeEntityId(entityId);
+            }
         }
 
         if (ownerChanged)

+ 3 - 3
Code/Editor/TrackView/TrackViewAnimNode.h

@@ -151,9 +151,9 @@ public:
     virtual CTrackViewTrackBundle GetTracksByParam(const CAnimParamType& paramType) const;
 
     // Key getters
-    virtual CTrackViewKeyBundle GetAllKeys() override;
-    virtual CTrackViewKeyBundle GetSelectedKeys() override;
-    virtual CTrackViewKeyBundle GetKeysInTimeRange(const float t0, const float t1) override;
+    CTrackViewKeyBundle GetAllKeys() override;
+    CTrackViewKeyBundle GetSelectedKeys() override;
+    CTrackViewKeyBundle GetKeysInTimeRange(const float t0, const float t1) override;
 
     // Type getters
     AnimNodeType GetType() const;

+ 4 - 4
Code/Editor/TrackView/TrackViewDialog.cpp

@@ -451,11 +451,11 @@ void CTrackViewDialog::InitToolbar()
     {
         QMenu* buttonMenu = new QMenu(this);
         toolButton->setMenu(buttonMenu);
-        qaction = buttonMenu->addAction("Stop");
-        connect(qaction, &QAction::triggered, this, &CTrackViewDialog::OnStop);
-        toolButton->addAction(qaction);
+
+        buttonMenu->addAction(qaction);
         qaction = buttonMenu->addAction("Stop with Hard Reset");
-        qaction->setData(true);
+        qaction->setData(ID_TV_STOP_HARD_RESET);
+        m_actions[ID_TV_STOP_HARD_RESET] = qaction;
         connect(qaction, &QAction::triggered, this, &CTrackViewDialog::OnStopHardReset);
     }
     m_playToolBar->addWidget(toolButton);

+ 10 - 10
Code/Editor/TrackView/TrackViewDopeSheetBase.cpp

@@ -1996,13 +1996,13 @@ void CTrackViewDopeSheetBase::ChangeSequenceTrackSelection(CTrackViewSequence* s
 bool CTrackViewDopeSheetBase::CreateColorKey(CTrackViewTrack* pTrack, float keyTime)
 {
     bool keyCreated = false;
-    Vec3 vColor(0, 0, 0);
+    AZ::Vector3 vColor(0, 0, 0);
     pTrack->GetValue(keyTime, vColor);
 
     const AZ::Color defaultColor(
-        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.x)), 0, 255),
-        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.y)), 0, 255),
-        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.z)), 0, 255),
+        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.GetX())), 0, 255),
+        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.GetY())), 0, 255),
+        clamp_tpl<AZ::u8>(static_cast<AZ::u8>(FloatToIntRet(vColor.GetZ())), 0, 255),
         255);
     AzQtComponents::ColorPicker dlg(AzQtComponents::ColorPicker::Configuration::RGB, QString(), this);
     dlg.setWindowTitle(tr("Select Color"));
@@ -2114,13 +2114,13 @@ void CTrackViewDopeSheetBase::EditSelectedColorKey(CTrackViewTrack* pTrack)
             // init with the first selected key color
             m_colorUpdateKeyTime = selectedKeyBundle.GetKey(0).GetTime();
 
-            Vec3  color;
+            AZ::Vector3  color;
             pTrack->GetValue(m_colorUpdateKeyTime, color);
 
             const AZ::Color defaultColor(
-                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.x)), AZ::u8(0), AZ::u8(255)),
-                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.y)), AZ::u8(0), AZ::u8(255)),
-                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.z)), AZ::u8(0), AZ::u8(255)),
+                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.GetX())), AZ::u8(0), AZ::u8(255)),
+                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.GetY())), AZ::u8(0), AZ::u8(255)),
+                clamp_tpl(static_cast<AZ::u8>(FloatToIntRet(color.GetZ())), AZ::u8(0), AZ::u8(255)),
                 255);
 
             AzQtComponents::ColorPicker picker(AzQtComponents::ColorPicker::Configuration::RGB);
@@ -3584,10 +3584,10 @@ void CTrackViewDopeSheetBase::DrawColorGradient(QPainter* painter, const QRect&
     for (int x = rc.left(); x < rc.right(); ++x)
     {
         // This is really slow. Is there a better way?
-        Vec3 vColor(0, 0, 0);
+        AZ::Vector3 vColor(0, 0, 0);
         pTrack->GetValue(TimeFromPointUnsnapped(QPoint(x, rc.top())), vColor);
 
-        painter->setPen(ColorLinearToGamma(vColor / 255.0f));
+        painter->setPen(ColorToQColor(AZ::Color(vColor).ToU32LinearToGamma()));
         painter->drawLine(x, rc.top(), x, rc.bottom());
     }
     painter->setPen(pOldPen);

+ 30 - 26
Code/Editor/TrackView/TrackViewKeyPropertiesDlg.cpp

@@ -15,6 +15,9 @@
 // Qt
 #include <QMessageBox>
 
+// AzCore
+#include <AzCore/std/sort.h>
+
 // CryCommon
 #include <CryCommon/Maestro/Types/AnimValueType.h>
 
@@ -75,7 +78,7 @@ CTrackViewKeyPropertiesDlg::CTrackViewKeyPropertiesDlg(QWidget* hParentWnd)
     m_keyControls.push_back(new CTrackEventKeyUIControls());
 
     // Sort key controls by descending priority
-    std::stable_sort(m_keyControls.begin(), m_keyControls.end(),
+    AZStd::stable_sort(m_keyControls.begin(), m_keyControls.end(),
         [](const _smart_ptr<CTrackViewKeyUIControls>& a, const _smart_ptr<CTrackViewKeyUIControls>& b)
         {
             return a->GetPriority() > b->GetPriority();
@@ -99,10 +102,10 @@ void CTrackViewKeyPropertiesDlg::OnVarChange(IVariable* pVar)
 //////////////////////////////////////////////////////////////////////////
 void CTrackViewKeyPropertiesDlg::CreateAllVars()
 {
-    for (int i = 0; i < (int)m_keyControls.size(); i++)
+    for (const auto& keyControl : m_keyControls)
     {
-        m_keyControls[i]->SetKeyPropertiesDlg(this);
-        m_keyControls[i]->OnCreateVars();
+        keyControl->SetKeyPropertiesDlg(this);
+        keyControl->OnCreateVars();
     }
 }
 
@@ -132,21 +135,21 @@ void CTrackViewKeyPropertiesDlg::PopulateVariables(ReflectedPropertyControl* pro
 //////////////////////////////////////////////////////////////////////////
 void CTrackViewKeyPropertiesDlg::OnKeysChanged(CTrackViewSequence* pSequence)
 {
-    CTrackViewKeyBundle selectedKeys = pSequence->GetSelectedKeys();
+    const CTrackViewKeyBundle& selectedKeys = pSequence->GetSelectedKeys();
 
     if (selectedKeys.GetKeyCount() > 0 && selectedKeys.AreAllKeysOfSameType())
     {
-        CTrackViewTrack* pTrack = selectedKeys.GetKey(0).GetTrack();
+        const CTrackViewTrack* pTrack = selectedKeys.GetKey(0).GetTrack();
 
-        CAnimParamType paramType = pTrack->GetParameterType();
-        EAnimCurveType trackType = pTrack->GetCurveType();
-        AnimValueType valueType = pTrack->GetValueType();
+        const CAnimParamType paramType = pTrack->GetParameterType();
+        const EAnimCurveType trackType = pTrack->GetCurveType();
+        const AnimValueType valueType = pTrack->GetValueType();
 
-        for (int i = 0; i < (int)m_keyControls.size(); i++)
+        for (const auto& keyControl : m_keyControls)
         {
-            if (m_keyControls[i]->SupportTrackType(paramType, trackType, valueType))
+            if (keyControl->SupportTrackType(paramType, trackType, valueType))
             {
-                m_keyControls[i]->OnKeySelectionChange(selectedKeys);
+                keyControl->OnKeySelectionChange(selectedKeys);
                 break;
             }
         }
@@ -167,11 +170,11 @@ void CTrackViewKeyPropertiesDlg::OnKeySelectionChanged(CTrackViewSequence* seque
         return;
     }
 
-    CTrackViewKeyBundle selectedKeys = sequence->GetSelectedKeys();
+    const CTrackViewKeyBundle& selectedKeys = sequence->GetSelectedKeys();
 
     m_wndTrackProps->OnKeySelectionChange(selectedKeys);
 
-    bool bSelectChangedInSameTrack
+    const bool bSelectChangedInSameTrack
         = m_pLastTrackSelected
             && selectedKeys.GetKeyCount() == 1
             && selectedKeys.GetKey(0).GetTrack() == m_pLastTrackSelected;
@@ -179,7 +182,7 @@ void CTrackViewKeyPropertiesDlg::OnKeySelectionChanged(CTrackViewSequence* seque
     // Every Key in an Asset Blend track can have different min/max values on the float sliders
     // because it's based on the duration of the motion that is set. So don't try to
     // reuse the controls when the selection changes, otherwise the tooltips may be wrong.
-    bool reuseControls = bSelectChangedInSameTrack && m_pLastTrackSelected && (m_pLastTrackSelected->GetValueType() != AnimValueType::AssetBlend);
+    const bool reuseControls = bSelectChangedInSameTrack && m_pLastTrackSelected && (m_pLastTrackSelected->GetValueType() != AnimValueType::AssetBlend);
 
     if (selectedKeys.GetKeyCount() == 1)
     {
@@ -203,21 +206,21 @@ void CTrackViewKeyPropertiesDlg::OnKeySelectionChanged(CTrackViewSequence* seque
     m_wndTrackProps->setEnabled(false);
     if (selectedKeys.GetKeyCount() > 0 && selectedKeys.AreAllKeysOfSameType())
     {
-        CTrackViewTrack* pTrack = selectedKeys.GetKey(0).GetTrack();
+        if (!reuseControls)
+        {
+            const CTrackViewTrack* pTrack = selectedKeys.GetKey(0).GetTrack();
 
-        CAnimParamType paramType = pTrack->GetParameterType();
-        EAnimCurveType trackType = pTrack->GetCurveType();
-        AnimValueType valueType = pTrack->GetValueType();
+            const CAnimParamType paramType = pTrack->GetParameterType();
+            const EAnimCurveType trackType = pTrack->GetCurveType();
+            const AnimValueType valueType = pTrack->GetValueType();
 
-        for (int i = 0; i < (int)m_keyControls.size(); i++)
-        {
-            if (m_keyControls[i]->SupportTrackType(paramType, trackType, valueType))
+            for (const auto& keyControl : m_keyControls)
             {
-                if (!reuseControls)
+                if (keyControl->SupportTrackType(paramType, trackType, valueType))
                 {
-                    AddVars(m_keyControls[i]);
+                    AddVars(keyControl);
+                    break;
                 }
-                break;
             }
         }
 
@@ -238,6 +241,7 @@ void CTrackViewKeyPropertiesDlg::OnKeySelectionChanged(CTrackViewSequence* seque
     {
         PopulateVariables();
     }
+    OnKeysChanged(sequence);
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -301,7 +305,7 @@ void CTrackViewTrackPropsDlg::OnSequenceChanged()
 
 
 //////////////////////////////////////////////////////////////////////////
-bool CTrackViewTrackPropsDlg::OnKeySelectionChange(CTrackViewKeyBundle& selectedKeys)
+bool CTrackViewTrackPropsDlg::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
 {
     m_keyHandle = CTrackViewKeyHandle();
 

+ 4 - 5
Code/Editor/TrackView/TrackViewKeyPropertiesDlg.h

@@ -58,7 +58,7 @@ public:
 
     // Called when user changes selected keys.
     // Return true if control update UI values
-    virtual bool OnKeySelectionChange(CTrackViewKeyBundle& keys) = 0;
+    virtual bool OnKeySelectionChange(const CTrackViewKeyBundle& keys) = 0;
 
     // Called when UI variable changes.
     virtual void OnUIChange(IVariable* pVar, CTrackViewKeyBundle& keys) = 0;
@@ -127,8 +127,7 @@ public:
     ~CTrackViewTrackPropsDlg();
 
     void OnSequenceChanged();
-    bool OnKeySelectionChange(CTrackViewKeyBundle& keys);
-    void ReloadKey();
+    bool OnKeySelectionChange(const CTrackViewKeyBundle& keys);
 
 protected slots:
     void OnUpdateTime();
@@ -163,8 +162,8 @@ public:
     void PopulateVariables(ReflectedPropertyControl* propCtrl);
 
     // ITrackViewSequenceListener
-    virtual void OnKeysChanged(CTrackViewSequence* pSequence) override;
-    virtual void OnKeySelectionChanged(CTrackViewSequence* pSequence) override;
+    void OnKeysChanged(CTrackViewSequence* pSequence) override;
+    void OnKeySelectionChanged(CTrackViewSequence* pSequence) override;
 
 protected:
     //////////////////////////////////////////////////////////////////////////

+ 5 - 3
Code/Editor/TrackView/TrackViewNode.cpp

@@ -14,6 +14,9 @@
 // CryCommon
 #include <CryCommon/Maestro/Types/AnimNodeType.h>
 
+// AzCore
+#include <AzCore/std/sort.h>
+
 // Editor
 #include "TrackView/TrackViewTrack.h"
 #include "TrackView/TrackViewSequence.h"
@@ -555,7 +558,7 @@ void CTrackViewNode::AddNode(CTrackViewNode* pNode)
 void CTrackViewNode::SortNodes()
 {
     // Sort with operator<
-    std::stable_sort(m_childNodes.begin(), m_childNodes.end(),
+    AZStd::stable_sort(m_childNodes.begin(), m_childNodes.end(),
         [&](const std::unique_ptr<CTrackViewNode>& a, const std::unique_ptr<CTrackViewNode>& b) -> bool
         {
             const CTrackViewNode* pA = a.get();
@@ -588,8 +591,7 @@ namespace
         nodeOrder[static_cast<int>(AnimNodeType::ScreenFader)] = 15;
         nodeOrder[static_cast<int>(AnimNodeType::Light)] = 16;
         nodeOrder[static_cast<int>(AnimNodeType::ShadowSetup)] = 17;
-        nodeOrder[static_cast<int>(AnimNodeType::Environment)] = 18;
-        nodeOrder[static_cast<int>(AnimNodeType::Group)] = 19;
+        nodeOrder[static_cast<int>(AnimNodeType::Group)] = 18;
 
         return nodeOrder[static_cast<int>(nodeType)];
     }

+ 1 - 1
Code/Editor/TrackView/TrackViewNode.h

@@ -111,7 +111,7 @@ public:
     bool AreAllKeysOfSameType() const { return m_bAllOfSameType; }
 
     unsigned int GetKeyCount() const { return static_cast<unsigned int>(m_keys.size()); }
-    CTrackViewKeyHandle GetKey(unsigned int index) { return m_keys[index]; }
+    CTrackViewKeyHandle GetKey(unsigned int index) const { return m_keys[index]; }
 
     void SelectKeys(const bool bSelected);
 

+ 4 - 12
Code/Editor/TrackView/TrackViewNodes.cpp

@@ -326,7 +326,6 @@ enum EMenuItem
     eMI_AddDOF = 510,
     eMI_AddScreenfader = 511,
     eMI_AddShadowSetup = 513,
-    eMI_AddEnvironment = 514,
     eMI_EditEvents = 550,
     eMI_SaveToFBX = 12,
     eMI_ImportFromFBX = 14,
@@ -653,6 +652,10 @@ void CTrackViewNodesCtrl::UpdateAnimNodeRecord(CRecord* record, CTrackViewAnimNo
             // In case of a missing entity, color it red.
             record->setForeground(0, TextColorForMissingEntity);
         }
+        else
+        {
+            record->setData(0, Qt::ForegroundRole, QPalette::ColorRole::NoRole);
+        }
     }
 
     // Mark the active director and other directors properly.
@@ -966,12 +969,6 @@ void CTrackViewNodesCtrl::OnNMRclick(QPoint point)
                 groupNode->CreateSubNode("ShadowsSetup", AnimNodeType::ShadowSetup);
                 undoBatch.MarkEntityDirty(groupNode->GetSequence()->GetSequenceComponentEntityId());
             }
-            else if (cmd == eMI_AddEnvironment)
-            {
-                AzToolsFramework::ScopedUndoBatch undoBatch("Add Track View Environment Node");
-                groupNode->CreateSubNode("Environment", AnimNodeType::Environment);
-                undoBatch.MarkEntityDirty(groupNode->GetSequence()->GetSequenceComponentEntityId());
-            }
             else if (cmd == eMI_AddDirectorNode)
             {
                 QString name = groupNode->GetAvailableNodeNameStartingWith("Director");
@@ -1397,11 +1394,6 @@ void CTrackViewNodesCtrl::AddGroupNodeAddItems(SContextMenu& contextMenu, CTrack
         contextMenu.main.addAction("Add Shadows Setup Node")->setData(eMI_AddShadowSetup);
     }
 
-    if (pDirector->GetAnimNodesByType(AnimNodeType::Environment).GetCount() == 0)
-    {
-        contextMenu.main.addAction("Add Environment Node")->setData(eMI_AddEnvironment);
-    }
-
     // A director node cannot have another director node as a child.
     if (animNode->GetType() != AnimNodeType::Director)
     {

+ 9 - 9
Code/Editor/TrackView/TrackViewPythonFuncs.cpp

@@ -456,30 +456,30 @@ namespace
         break;
         case AnimValueType::Quat:
         {
-            Quat value;
+            AZ::Quaternion value;
             pTrack->GetValue(time, value);
-            Ang3 rotation(value);
-            return AZStd::make_any<AZ::Vector3>(rotation.x, rotation.y, rotation.z);
+            const AZ::Vector3 rotation = value.GetEulerDegrees();
+            return AZStd::make_any<AZ::Vector3>(rotation);
         }
         case AnimValueType::Vector:
         {
-            Vec3 value;
+            AZ::Vector3 value;
             pTrack->GetValue(time, value);
-            return AZStd::make_any<AZ::Vector3>(value.x, value.y, value.z);
+            return AZStd::make_any<AZ::Vector3>(value);
         }
         break;
         case AnimValueType::Vector4:
         {
-            Vec4 value;
+            AZ::Vector4 value;
             pTrack->GetValue(time, value);
-            return AZStd::make_any<AZ::Vector4>(value.x, value.y, value.z, value.w);
+            return AZStd::make_any<AZ::Vector4>(value);
         }
         break;
         case AnimValueType::RGB:
         {
-            Vec3 value;
+            AZ::Vector3 value;
             pTrack->GetValue(time, value);
-            return AZStd::make_any<AZ::Color>(value.x, value.y, value.z, 0.0f);
+            return AZStd::make_any<AZ::Color>(value.GetX(), value.GetY(), value.GetZ(), 0.0f);
         }
         break;
         default:

+ 5 - 5
Code/Editor/TrackView/TrackViewSequence.cpp

@@ -604,14 +604,14 @@ void CTrackViewSequence::DequeueNotifications()
 }
 
 //////////////////////////////////////////////////////////////////////////
-void CTrackViewSequence::SubmitPendingNotifcations(bool force)
+void CTrackViewSequence::SubmitPendingNotifications(bool force)
 {
     if (force)
     {
         m_selectionRecursionLevel = 1;
     }
 
-    AZ_Assert(m_selectionRecursionLevel > 0, "Dangling SubmitPendingNotifcations()");
+    AZ_Assert(m_selectionRecursionLevel > 0, "Dangling SubmitPendingNotifications()");
     if (m_selectionRecursionLevel > 0)
     {
         --m_selectionRecursionLevel;
@@ -656,7 +656,7 @@ void CTrackViewSequence::OnSequenceRemoved(CTrackViewSequence* removedSequence)
         // submit any queued notifications before removing
         if (m_bQueueNotifications)
         {
-            SubmitPendingNotifcations(true);
+            SubmitPendingNotifications(true);
         }
 
         // remove ourselves as listeners from the undo manager
@@ -1443,7 +1443,7 @@ void CTrackViewSequence::EndUndoTransaction()
     // if we're queued
     if (m_bQueueNotifications)
     {
-        SubmitPendingNotifcations();
+        SubmitPendingNotifications();
     }
 }
 
@@ -1461,7 +1461,7 @@ void CTrackViewSequence::EndRestoreTransaction()
     // if we're queued
     if (m_bQueueNotifications)
     {
-        SubmitPendingNotifcations();
+        SubmitPendingNotifications();
     }
 }
 

+ 2 - 2
Code/Editor/TrackView/TrackViewSequence.h

@@ -293,7 +293,7 @@ private:
     void QueueNotifications();
     // Used to cancel a previously queued notification.
     void DequeueNotifications();
-    void SubmitPendingNotifcations(bool force = false);
+    void SubmitPendingNotifications(bool force = false);
 
     /////////////////////////////////////////////////////////////////////////
     // overrides for ITrackViewSequenceManagerListener
@@ -356,7 +356,7 @@ public:
     {
         if (m_pSequence)
         {
-            m_pSequence->SubmitPendingNotifcations();
+            m_pSequence->SubmitPendingNotifications();
         }
     }
 

+ 5 - 1
Code/Editor/TrackView/TrackViewSequenceManager.cpp

@@ -19,6 +19,10 @@
 #include <CryCommon/Maestro/Bus/EditorSequenceComponentBus.h>
 #include <CryCommon/Maestro/Types/SequenceType.h>
 
+// AzCore
+#include <AzCore/std/sort.h>
+
+
 // Editor
 #include "AnimationContext.h"
 #include "GameEngine.h"
@@ -380,7 +384,7 @@ void CTrackViewSequenceManager::OnDeleteSequenceEntity(const AZ::EntityId& entit
 ////////////////////////////////////////////////////////////////////////////
 void CTrackViewSequenceManager::SortSequences()
 {
-    std::stable_sort(m_sequences.begin(), m_sequences.end(),
+    AZStd::stable_sort(m_sequences.begin(), m_sequences.end(),
         [](const std::unique_ptr<CTrackViewSequence>& a, const std::unique_ptr<CTrackViewSequence>& b) -> bool
         {
             QString aName = QString::fromUtf8(a.get()->GetName().c_str());

+ 2 - 2
Code/Editor/TrackView/TrackViewTrack.cpp

@@ -268,7 +268,7 @@ CTrackViewKeyBundle CTrackViewTrack::GetKeys(const bool bOnlySelected, const flo
         const float keyTime = m_pAnimTrack->GetKeyTime(keyIndex);
         const bool timeRangeOk = (t0 <= keyTime && keyTime <= t1);
 
-        if ((!bOnlySelected || IsKeySelected(keyIndex)) && timeRangeOk)
+        if (timeRangeOk && (!bOnlySelected || IsKeySelected(keyIndex)))
         {
             CTrackViewKeyHandle keyHandle(this, keyIndex);
             bundle.AppendKey(keyHandle);
@@ -612,7 +612,7 @@ void CTrackViewTrack::SelectKeys(const bool bSelected)
         }
     }
 
-    m_pTrackAnimNode->GetSequence()->SubmitPendingNotifcations();
+    m_pTrackAnimNode->GetSequence()->SubmitPendingNotifications();
 }
 
 

+ 4 - 4
Code/Editor/TrackView/TrackViewTrack.h

@@ -107,9 +107,9 @@ public:
     virtual CTrackViewKeyHandle GetKeyByTime(const float time);
     virtual CTrackViewKeyHandle GetNearestKeyByTime(const float time);
 
-    virtual CTrackViewKeyBundle GetSelectedKeys() override;
-    virtual CTrackViewKeyBundle GetAllKeys() override;
-    virtual CTrackViewKeyBundle GetKeysInTimeRange(const float t0, const float t1) override;
+    CTrackViewKeyBundle GetSelectedKeys() override;
+    CTrackViewKeyBundle GetAllKeys() override;
+    CTrackViewKeyBundle GetKeysInTimeRange(const float t0, const float t1) override;
 
     // Key modifications
     virtual CTrackViewKeyHandle CreateKey(const float time);
@@ -219,7 +219,7 @@ private:
     CTrackViewKeyHandle GetSubTrackKeyHandle(unsigned int index) const;
 
     // Copy selected keys to XML representation for clipboard
-    virtual void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override;
+    void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override;
 
     bool m_bIsCompoundTrack;
     bool m_bIsSubTrack;

+ 85 - 30
Code/Editor/TrackViewNewSequenceDialog.cpp

@@ -12,7 +12,8 @@
 #include "TrackViewNewSequenceDialog.h"
 
 // Qt
-#include <QMessageBox>
+#include <QValidator>
+#include <QPushButton>
 
 // CryCommon
 #include <CryCommon/Maestro/Types/SequenceType.h>
@@ -34,15 +35,98 @@ namespace
     };
 }
 
+class CTVNewSequenceDialogValidator : public QValidator
+{
+    public:
+        CTVNewSequenceDialogValidator(QObject* parent)
+            : QValidator(parent)
+        {
+            m_parentDialog = qobject_cast<CTVNewSequenceDialog*>(parent);
+        }
+
+        QValidator::State validate(QString& input, [[maybe_unused]] int& pos) const override
+        {
+            constexpr int MaxInputLength = 160;
+
+            if (input.isEmpty())
+            {
+                SetEnabled(false);
+                return QValidator::Acceptable;
+            }
+
+            bool isValid = false;
+            SetEnabled(true);
+            if (input.contains('/'))
+            {
+                SetToolTip("A sequence name cannot contain a '/' character");
+            }
+            if (input.length() > MaxInputLength)
+            {
+                SetToolTip(QString("A sequence name cannot exceed %1 characters").arg(MaxInputLength).toStdString().c_str());
+            }
+            else if (input == LIGHT_ANIMATION_SET_NAME)
+            {
+                SetToolTip("The sequence name " LIGHT_ANIMATION_SET_NAME " is reserved.\nPlease choose a different name");
+            }
+            else
+            {
+                bool isNewName = true;
+                for (unsigned int k = 0; k < GetIEditor()->GetSequenceManager()->GetCount(); ++k)
+                {
+                    CTrackViewSequence* pSequence = GetIEditor()->GetSequenceManager()->GetSequenceByIndex(k);
+                    const QString fullname = QString::fromUtf8(pSequence->GetName().c_str());
+
+                    if (fullname.compare(input, Qt::CaseInsensitive) == 0)
+                    {
+                        isNewName = false;
+                        break;
+                    }
+                }
+                if (!isNewName)
+                {
+                    SetToolTip("Sequence with this name already exists");
+                }
+                else
+                {
+                    isValid = true;
+                }
+            }
+
+            if (isValid)
+            {
+                SetToolTip("");
+                return QValidator::Acceptable;
+            }
+
+            return QValidator::Invalid;
+        }
+
+    private:
+
+        void SetEnabled(bool enable) const
+        {
+            m_parentDialog->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enable);
+        }
+
+        void SetToolTip(const char* toolTipText) const
+        {
+            m_parentDialog->ui->NAME->setToolTip(toolTipText);
+        }
+
+        const CTVNewSequenceDialog* m_parentDialog;
+};
+
 // TrackViewNewSequenceDialog dialog
 CTVNewSequenceDialog::CTVNewSequenceDialog(QWidget* parent)
     : QDialog(parent)
     , ui(new Ui::CTVNewSequenceDialog)
     , m_inputFocusSet(false)
+    , m_validator(new CTVNewSequenceDialogValidator(this))
 {
     ui->setupUi(this);
     connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &CTVNewSequenceDialog::OnOK);
     connect(ui->NAME, &QLineEdit::returnPressed, this, &CTVNewSequenceDialog::OnOK);
+    ui->NAME->setValidator(m_validator);
     setWindowTitle("Add New Sequence");
 
     OnInitDialog();
@@ -59,37 +143,8 @@ void CTVNewSequenceDialog::OnInitDialog()
 void CTVNewSequenceDialog::OnOK()
 {
     m_sequenceType = SequenceType::SequenceComponent;
-
     m_sequenceName = ui->NAME->text();
 
-    if (m_sequenceName.isEmpty())
-    {
-        QMessageBox::warning(this, "New Sequence", "A sequence name cannot be empty!");
-        return;
-    }
-    else if (m_sequenceName.contains('/'))
-    {
-        QMessageBox::warning(this, "New Sequence", "A sequence name cannot contain a '/' character!");
-        return;
-    }
-    else if (m_sequenceName == LIGHT_ANIMATION_SET_NAME)
-    {
-        QMessageBox::warning(this, "New Sequence", QString("The sequence name '%1' is reserved.\n\nPlease choose a different name.").arg(LIGHT_ANIMATION_SET_NAME));
-        return;
-    }
-
-    for (unsigned int k = 0; k < GetIEditor()->GetSequenceManager()->GetCount(); ++k)
-    {
-        CTrackViewSequence* pSequence = GetIEditor()->GetSequenceManager()->GetSequenceByIndex(k);
-        QString fullname = QString::fromUtf8(pSequence->GetName().c_str());
-
-        if (fullname.compare(m_sequenceName, Qt::CaseInsensitive) == 0)
-        {
-            QMessageBox::warning(this, "New Sequence", "Sequence with this name already exists!");
-            return;
-        }
-    }
-
     accept();
 }
 

+ 11 - 7
Code/Editor/TrackViewNewSequenceDialog.h

@@ -6,20 +6,23 @@
  *
  */
 
-
-#ifndef CRYINCLUDE_EDITOR_TRACKVIEWNEWSEQUENCEDIALOG_H
-#define CRYINCLUDE_EDITOR_TRACKVIEWNEWSEQUENCEDIALOG_H
 #pragma once
 
+// Qt
 #if !defined(Q_MOC_RUN)
 #include <QScopedPointer>
 #include <QDialog>
 #endif
 
+// CryCommon
+#include <CryCommon/Maestro/Types/SequenceType.h>
+
 namespace Ui {
     class CTVNewSequenceDialog;
+    class CTVNewSequenceDialogValidator;
 }
 
+class QValidator;
 
 class CTVNewSequenceDialog
     : public QDialog
@@ -29,11 +32,13 @@ public:
     CTVNewSequenceDialog(QWidget* pParent = 0);
     virtual ~CTVNewSequenceDialog();
 
-    const QString& GetSequenceName() const { return m_sequenceName; };
-    SequenceType   GetSequenceType() const { return m_sequenceType; };
+    const QString& GetSequenceName() const { return m_sequenceName; }
+    SequenceType   GetSequenceType() const { return m_sequenceType; }
 
     void showEvent(QShowEvent* event) override;
 
+    friend class CTVNewSequenceDialogValidator;
+
 protected:
     virtual void OnOK();
     void OnInitDialog();
@@ -43,6 +48,5 @@ private:
     SequenceType   m_sequenceType;
     QScopedPointer<Ui::CTVNewSequenceDialog> ui;
     bool           m_inputFocusSet;
+    QValidator*    m_validator;
 };
-
-#endif // CRYINCLUDE_EDITOR_TRACKVIEWNEWSEQUENCEDIALOG_H

+ 4 - 5
Code/Editor/Undo/Undo.cpp

@@ -13,7 +13,6 @@
 
 #include "Settings.h"
 #include "IUndoManagerListener.h"
-#include <Include/ILogFile.h>
 #include <list>
 
 #include <QString>
@@ -307,7 +306,7 @@ void CUndoManager::Redo(int numSteps)
 
     if (m_bRecording || m_bSuperRecording)
     {
-        GetIEditor()->GetLogFile()->FormatLine("Cannot Redo while Recording");
+        AZ_Warning("CUndoManager", false, "Cannot Redo while Recording");
         return;
     }
 
@@ -324,7 +323,7 @@ void CUndoManager::Redo(int numSteps)
             CUndoStep* redo = m_redoStack.back();
             redo->Redo();
 
-            GetIEditor()->GetLogFile()->FormatLine(
+            AZ_Printf("CUndoManager",
                 "(Undo: %d, Redo: %d) - Redo last operation: '%s'",
                 m_undoStack.size(),
                 m_redoStack.size(),
@@ -367,7 +366,7 @@ void CUndoManager::Undo(int numSteps)
 
     if (m_bRecording || m_bSuperRecording)
     {
-        GetIEditor()->GetLogFile()->FormatLine("Cannot Undo while Recording");
+        AZ_Warning("CUndoManager", false, "Cannot Undo while Recording");
         return;
     }
 
@@ -384,7 +383,7 @@ void CUndoManager::Undo(int numSteps)
             CUndoStep* undo = m_undoStack.back();
             undo->Undo(true);
 
-            GetIEditor()->GetLogFile()->FormatLine(
+            AZ_Printf("CUndoManager",
                 "(Undo: %d, Redo: %d) - Undo last operation: '%s'",
                 m_undoStack.size(),
                 m_redoStack.size(),

+ 1 - 0
Code/Editor/Undo/Undo.h

@@ -138,6 +138,7 @@ private: // ------------------------------------------------------
 AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
 /*!
  *  CUndoManager is keeping and operating on CUndo class instances.
+ *  TODO: this class is superseded by AzToolsFramework::UndoSystem
  */
 class EDITOR_CORE_API CUndoManager
 {

+ 0 - 526
Code/Editor/Util/ImageUtil.cpp

@@ -1,526 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-// Description : Image utilities implementation.
-
-
-#include "EditorDefs.h"
-
-#include "ImageUtil.h"
-
-// Editor
-#include "Util/ImageGif.h"
-#include "Util/ImageTIF.h"
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::Save(const QString& strFileName, CImageEx& inImage)
-{
-    QImage imgBitmap;
-
-    ImageToQImage(inImage, imgBitmap);
-
-    // Explicitly set the pixels per meter in our images to a consistent default.
-    // The normal default is 96 pixels per inch, or 3780 pixels per meter.
-    // However, the Windows scaling display setting can cause these numbers to vary
-    // on different machines, producing output files that have slightly different
-    // headers from machine to machine, which often isn't desirable.
-    const int defaultPixelsPerMeter = 3780;
-    imgBitmap.setDotsPerMeterX(defaultPixelsPerMeter);
-    imgBitmap.setDotsPerMeterY(defaultPixelsPerMeter);
-    
-    return imgBitmap.save(strFileName);
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::SaveBitmap(const QString& szFileName, CImageEx& inImage)
-{
-    return Save(szFileName, inImage);
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::SaveJPEG(const QString& strFileName, CImageEx& inImage)
-{
-    return Save(strFileName, inImage);
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::Load(const QString& fileName, CImageEx& image)
-{
-    QImage imgBitmap(fileName);
-
-    if (imgBitmap.isNull())
-    {
-        CLogFile::FormatLine("Invalid file:  %s", fileName.toUtf8().data());
-        return false;
-    }
-
-    return QImageToImage(imgBitmap, image);
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::LoadJPEG(const QString& strFileName, CImageEx& outImage)
-{
-    return CImageUtil::Load(strFileName, outImage);
-}
-
-//===========================================================================
-bool CImageUtil::LoadBmp(const QString& fileName, CImageEx& image)
-{
-    return CImageUtil::Load(fileName, image);
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::SavePGM(const QString& fileName, const CImageEx& image)
-{
-    // There are two types of PGM ("Portable Grey Map") files - "raw" (binary) and "plain" (ASCII).  This function supports the "plain PGM"  format.
-    // See http://netpbm.sourceforge.net/doc/pgm.html or https://en.wikipedia.org/wiki/Netpbm_format for the definition.
-
-    uint32 width = image.GetWidth();
-    uint32 height = image.GetHeight();
-    uint32* pixels = image.GetData();
-
-    // Create the file header.
-    AZStd::string fileHeader = AZStd::string::format(
-        // P2 = PGM header for ASCII output.  (P5 is PGM header for binary output)
-        "P2\n"
-        // width and height of the image
-        "%d %d\n"
-        // The maximum grey value in the file.  (i.e. the max value for any given pixel below)
-        "65535\n"
-        , width, height);
-
-    FILE* file = nullptr;
-    azfopen(&file, fileName.toUtf8().data(), "wt");
-    if (!file)
-    {
-        return false;
-    }
-
-    // First print the file header
-    fprintf(file, "%s", fileHeader.c_str());
-
-    // Then print all the pixels.
-    for (uint32 y = 0; y < height; y++)
-    {
-        for (uint32 x = 0; x < width; x++)
-        {
-            fprintf(file, "%d ", pixels[x + (y * width)]);
-        }
-        fprintf(file, "\n");
-    }
-
-    fclose(file);
-    return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::LoadPGM(const QString& fileName, CImageEx& image)
-{
-    FILE* file = nullptr;
-    azfopen(&file, fileName.toUtf8().data(), "rt");
-    if (!file)
-    {
-        return false;
-    }
-
-    const char seps[] = " \n\t\r";
-    char* token;
-
-
-    int32 width = 0;
-    int32 height = 0;
-    int32 numColors = 1;
-
-
-    fseek(file, 0, SEEK_END);
-    int fileSize = static_cast<int>(ftell(file));
-    fseek(file, 0, SEEK_SET);
-
-    char* str = new char[fileSize];
-
-    [[maybe_unused]] auto bytesRead = fread(str, fileSize, 1, file);
-
-    [[maybe_unused]] char* nextToken = nullptr;
-    token = azstrtok(str, 0, seps, &nextToken);
-
-    while (token != nullptr && token[0] == '#')
-    {
-        if (token != nullptr && token[0] == '#')
-        {
-            azstrtok(nullptr, 0, "\n", &nextToken);
-        }
-        token = azstrtok(nullptr, 0, seps, &nextToken);
-    }
-    if (azstricmp(token, "P2") != 0)
-    {
-        // Bad file. not supported pgm.
-        delete[]str;
-        fclose(file);
-        return false;
-    }
-
-    do
-    {
-        token = azstrtok(nullptr, 0, seps, &nextToken);
-        if (token != nullptr && token[0] == '#')
-        {
-            azstrtok(nullptr, 0, "\n", &nextToken);
-        }
-    } while (token != nullptr && token[0] == '#');
-    width = atoi(token);
-
-    do
-    {
-        token = azstrtok(nullptr, 0, seps, &nextToken);
-        if (token != nullptr && token[0] == '#')
-        {
-            azstrtok(nullptr, 0, "\n", &nextToken);
-        }
-    } while (token != nullptr && token[0] == '#');
-    height = atoi(token);
-
-    do
-    {
-        token = azstrtok(nullptr, 0, seps, &nextToken);
-        if (token != nullptr && token[0] == '#')
-        {
-            azstrtok(nullptr, 0, "\n", &nextToken);
-        }
-    } while (token != nullptr && token[0] == '#');
-    numColors = atoi(token);
-
-    image.Allocate(width, height);
-
-    uint32* p = image.GetData();
-    int size = width * height;
-    int i = 0;
-    while (token != nullptr && i < size)
-    {
-        do
-        {
-            token = azstrtok(nullptr, 0, seps, &nextToken);
-        } while (token != nullptr && token[0] == '#');
-        *p++ = atoi(token);
-        i++;
-    }
-
-    delete[]str;
-
-    fclose(file);
-
-    // If we have 16-bit greyscale values that we're storing into 32-bit pixels, denote it with an appropriate texture type.
-    if (numColors > 255)
-    {
-        image.SetFormat(eTF_R16G16);
-    }
-
-    return true;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::LoadImage(const QString& fileName, CImageEx& image, bool* pQualityLoss)
-{
-    char drive[_MAX_DRIVE];
-    char dir[_MAX_DIR];
-    char fname[_MAX_FNAME];
-    char ext[_MAX_EXT];
-
-    if (pQualityLoss)
-    {
-        *pQualityLoss = false;
-    }
-
-    _splitpath_s(fileName.toUtf8().data(), drive, dir, fname, ext);
-
-    // Only DDS has explicit sRGB flag - we'll assume by default all formats are stored in gamma space
-    image.SetSRGB(true);
-
-    if (azstricmp(ext, ".bmp") == 0)
-    {
-        return LoadBmp(fileName, image);
-    }
-    else if (azstricmp(ext, ".tif") == 0)
-    {
-        return CImageTIF().Load(fileName, image);
-    }
-    else if (azstricmp(ext, ".jpg") == 0)
-    {
-        if (pQualityLoss)
-        {
-            *pQualityLoss = true;     // we assume JPG has quality loss
-        }
-        return LoadJPEG(fileName, image);
-    }
-    else if (azstricmp(ext, ".gif") == 0)
-    {
-        return CImageGif().Load(fileName, image);
-    }
-    else if (azstricmp(ext, ".pgm") == 0)
-    {
-        return LoadPGM(fileName, image);
-    }
-    else if (azstricmp(ext, ".png") == 0)
-    {
-        return CImageUtil::Load(fileName, image);
-    }
-    else
-    {
-        return CImageUtil::Load(fileName, image);
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool CImageUtil::SaveImage(const QString& fileName, CImageEx& image)
-{
-    char drive[_MAX_DRIVE];
-    char dir[_MAX_DIR];
-    char fname[_MAX_FNAME];
-    char ext[_MAX_EXT];
-
-    // Remove the read-only attribute so the file can be overwritten.
-    QFile(fileName).setPermissions(QFile::ReadUser | QFile::WriteUser);
-
-    _splitpath_s(fileName.toUtf8().data(), drive, dir, fname, ext);
-    if (azstricmp(ext, ".bmp") == 0)
-    {
-        return SaveBitmap(fileName, image);
-    }
-    else if (azstricmp(ext, ".jpg") == 0)
-    {
-        return SaveJPEG(fileName, image);
-    }
-    else if (azstricmp(ext, ".pgm") == 0)
-    {
-        return SavePGM(fileName, image);
-    }
-    else
-    {
-        return Save(fileName, image);
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CImageUtil::ScaleToFit(const CByteImage& srcImage, CByteImage& trgImage)
-{
-    trgImage.ScaleToFit(srcImage);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CImageUtil::DownScaleSquareTextureTwice(const CImageEx& srcImage, CImageEx& trgImage, IImageUtil::_EAddrMode eAddressingMode)
-{
-    uint32* pSrcData = srcImage.GetData();
-    int nSrcWidth = srcImage.GetWidth();
-    int nSrcHeight = srcImage.GetHeight();
-    int nTrgWidth = srcImage.GetWidth() >> 1;
-    int nTrgHeight = srcImage.GetHeight() >> 1;
-
-    // reallocate target
-    trgImage.Release();
-    trgImage.Allocate(nTrgWidth, nTrgHeight);
-    uint32* pDstData = trgImage.GetData();
-
-    // values in this filter are the log2 of the actual multiplicative values .. see DXCFILTER_BLUR3X3 for the used 3x3 filter
-    static int filter[3][3] =
-    {
-        {0, 1, 0},
-        {1, 2, 1},
-        {0, 1, 0}
-    };
-
-    for (int i = 0; i < nTrgHeight; i++)
-    {
-        for (int j = 0; j < nTrgWidth; j++)
-        {
-            // filter3x3
-            int x = j << 1;
-            int y = i << 1;
-
-            int r, g, b, a;
-            r = b = g = a = 0;
-            uint32 col;
-
-            if (eAddressingMode == IImageUtil::WRAP) // TODO: this condition could be compile-time static by making it a template arg
-            {
-                for (int ii = 0; ii < 3; ii++)
-                {
-                    for (int jj = 0; jj < 3; jj++)
-                    {
-                        col = pSrcData[((y + nSrcHeight + ii - 1) % nSrcHeight) * nSrcWidth + ((x + nSrcWidth + jj - 1) % nSrcWidth)];
-
-                        r += (col        & 0xff) << filter[ii][jj];
-                        g += ((col >> 8)  & 0xff) << filter[ii][jj];
-                        b += ((col >> 16) & 0xff) << filter[ii][jj];
-                        a += ((col >> 24) & 0xff) << filter[ii][jj];
-                    }
-                }
-            }
-            else
-            {
-                assert(eAddressingMode == IImageUtil::CLAMP);
-                for (int ii = 0; ii < 3; ii++)
-                {
-                    for (int jj = 0; jj < 3; jj++)
-                    {
-                        int x1 = clamp_tpl<int>((x + jj), 0, nSrcWidth - 1);
-                        int y1 = clamp_tpl<int>((y + ii), 0, nSrcHeight - 1);
-                        col = pSrcData[ y1 * nSrcWidth + x1];
-
-                        r += (col        & 0xff) << filter[ii][jj];
-                        g += ((col >> 8)  & 0xff) << filter[ii][jj];
-                        b += ((col >> 16) & 0xff) << filter[ii][jj];
-                        a += ((col >> 24) & 0xff) << filter[ii][jj];
-                    }
-                }
-            }
-
-            // the sum of the multiplicative values here is 16 so we shift by 4 bits
-            r >>= 4;
-            g >>= 4;
-            b >>= 4;
-            a >>= 4;
-
-            uint32 res = r + (g << 8) + (b << 16) + (a << 24);
-
-            *pDstData++ = res;
-        }
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CImageUtil::ScaleToFit(const CImageEx& srcImage, CImageEx& trgImage)
-{
-    trgImage.ScaleToFit(srcImage);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CImageUtil::ScaleToDoubleFit(const CImageEx& srcImage, CImageEx& trgImage)
-{
-    uint32 x, y, u, v;
-    unsigned int* destRow, * dest, * src, * sourceRow;
-
-    uint32 srcW = srcImage.GetWidth();
-    uint32 srcH = srcImage.GetHeight();
-
-    uint32 trgHalfW = trgImage.GetWidth() / 2;
-    uint32 trgH = trgImage.GetHeight();
-
-    uint32 xratio = trgHalfW > 0 ? (srcW << 16) / trgHalfW : 1;
-    uint32 yratio = trgH > 0 ? (srcH << 16) / trgH : 1;
-
-    src = srcImage.GetData();
-    destRow = trgImage.GetData();
-
-    v = 0;
-    for (y = 0; y < trgH; y++)
-    {
-        u = 0;
-        sourceRow = src + (v >> 16) * srcW;
-        dest = destRow;
-        for (x = 0; x < trgHalfW; x++)
-        {
-            *(dest + trgHalfW) = sourceRow[u >> 16];
-            *dest++ = sourceRow[u >> 16];
-            u += xratio;
-        }
-        v += yratio;
-        destRow += trgHalfW * 2;
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CImageUtil::SmoothImage(CByteImage& image, int numSteps)
-{
-    assert(numSteps > 0);
-    uint8* buf = image.GetData();
-    int w = image.GetWidth();
-    int h = image.GetHeight();
-
-    for (int steps = 0; steps < numSteps; steps++)
-    {
-        // Smooth the image.
-        for (int y = 1; y < h - 1; y++)
-        {
-            // Precalculate for better speed
-            uint8* ptr = &buf[y * w + 1];
-
-            for (int x = 1; x < w - 1; x++)
-            {
-                // Smooth it out
-                *ptr =
-                    (
-                        (uint32)ptr[1] +
-                        ptr[w] +
-                        ptr[-1] +
-                        ptr[-w] +
-                        ptr[w + 1] +
-                        ptr[w - 1] +
-                        ptr[-w + 1] +
-                        ptr[-w - 1]
-                    ) >> 3;
-
-                // Next pixel
-                ptr++;
-            }
-        }
-    }
-}
-
-unsigned char CImageUtil::GetBilinearFilteredAt(const int iniX256, const int iniY256, const CByteImage& image)
-{
-    //  assert(image.IsValid());        if(!image.IsValid())return(0);      // this shouldn't be
-
-    DWORD x = (DWORD)(iniX256) >> 8;
-    DWORD y = (DWORD)(iniY256) >> 8;
-
-    if (x >= static_cast<DWORD>(image.GetWidth() - 1) || y >= static_cast<DWORD>(image.GetHeight() - 1))
-    {
-        return image.ValueAt(x, y);                                                          // border is not filtered, 255 to get in range 0..1
-    }
-    DWORD rx = (DWORD)(iniX256) & 0xff;       // fractional aprt
-    DWORD ry = (DWORD)(iniY256) & 0xff;       // fractional aprt
-
-    DWORD top = (DWORD)image.ValueAt((int)x, (int)y) * (256 - rx)                      // left top
-        + (DWORD)image.ValueAt((int)x + 1, (int)y) * rx;                                            // right top
-
-    DWORD bottom = (DWORD)image.ValueAt((int)x, (int)y + 1) * (256 - rx)              // left bottom
-        + (DWORD)image.ValueAt((int)x + 1, (int)y + 1) * rx;                                        // right bottom
-
-    return (unsigned char)((top * (256 - ry) + bottom * ry) >> 16);
-}
-
-bool CImageUtil::QImageToImage(const QImage& bitmap, CImageEx& image)
-{
-
-    QImage convertedBitmap;
-    const QImage *srcBitmap = &bitmap;
-    
-    if (bitmap.format() != QImage::Format_RGBA8888)
-    {
-        convertedBitmap = bitmap.convertToFormat(QImage::Format_RGBA8888);
-        srcBitmap = &convertedBitmap;
-    }
-
-    if (image.Allocate(srcBitmap->width(), srcBitmap->height()) == false)
-    {
-        return false;
-    }
-
-    AZStd::copy(srcBitmap->bits(), srcBitmap->bits() + (srcBitmap->width() * srcBitmap->height() * sizeof(uint32)), reinterpret_cast<uint8*>(image.GetData()));
-
-    return true;
-}
-
-bool CImageUtil::ImageToQImage(const CImageEx& image, QImage& bitmapObj)
-{
-    bitmapObj = QImage(image.GetWidth(), image.GetHeight(), QImage::Format_RGBA8888);
-    AZStd::copy(image.GetData(), image.GetData() + image.GetWidth() * image.GetHeight(), reinterpret_cast<uint32*>(bitmapObj.bits()));
-
-    return true;
-}

+ 0 - 78
Code/Editor/Util/ImageUtil.h

@@ -1,78 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-// Description : Image utilities.
-
-
-#pragma once
-
-#include <Include/IImageUtil.h>
-
-/*!
- *  Utility Class to manipulate images.
- */
-class SANDBOX_API CImageUtil
-{
-public:
-    //////////////////////////////////////////////////////////////////////////
-    // Image loading.
-    //////////////////////////////////////////////////////////////////////////
-    //! Load image, detect image type by file extension.
-    // Arguments:
-    //   pQualityLoss - 0 if info is not needed, pointer to the result otherwise - not need to preinitialize
-    static bool LoadImage(const QString& fileName, CImageEx& image, bool* pQualityLoss = 0);
-    //! Save image, detect image type by file extension.
-    static bool SaveImage(const QString& fileName, CImageEx& image);
-
-    // General image fucntions
-    static bool LoadJPEG(const QString& strFileName, CImageEx& image);
-    static bool SaveJPEG(const QString& strFileName, CImageEx& image);
-
-    static bool SaveBitmap(const QString& szFileName, CImageEx& image);
-    static bool LoadBmp(const QString& file, CImageEx& image);
-
-    //! Save image in PGM format.
-    static bool SavePGM(const QString& fileName, const CImageEx& image);
-    //! Load image in PGM format.
-    static bool LoadPGM(const QString& fileName, CImageEx& image);
-
-    //////////////////////////////////////////////////////////////////////////
-    // Image scaling.
-    //////////////////////////////////////////////////////////////////////////
-    //! Scale source image to fit size of target image.
-    static void ScaleToFit(const CByteImage& srcImage, CByteImage& trgImage);
-    //! Scale source image to fit size of target image.
-    static void ScaleToFit(const CImageEx& srcImage, CImageEx& trgImage);
-    //! Scale source image to fit twice side by side in target image.
-    static void ScaleToDoubleFit(const CImageEx& srcImage, CImageEx& trgImage);
-    //! Scale source image twice down image with filering
-
-    static void DownScaleSquareTextureTwice(const CImageEx& srcImage, CImageEx& trgImage, IImageUtil::_EAddrMode eAddressingMode = IImageUtil::WRAP);
-
-    //! Smooth image.
-    static void SmoothImage(CByteImage& image, int numSteps);
-
-    //////////////////////////////////////////////////////////////////////////
-    // filtered lookup
-    //////////////////////////////////////////////////////////////////////////
-
-    //! behaviour outside of the texture is not defined
-    //! \param iniX in fix point 24.8
-    //! \param iniY in fix point 24.8
-    //! \return 0..255
-    static unsigned char GetBilinearFilteredAt(const int iniX256, const int iniY256, const CByteImage& image);
-
-    static bool QImageToImage(const QImage& bitmap, CImageEx& image);
-    static bool ImageToQImage(const CImageEx& image, QImage& bitmapObj);
-
-private:
-    static bool Load(const QString& fileName, CImageEx& image);
-    static bool Save(const QString& strFileName, CImageEx& inImage);
-};
-

+ 0 - 83
Code/Editor/Util/ImageUtil_impl.cpp

@@ -1,83 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#include "EditorDefs.h"
-
-#include "ImageUtil_impl.h"
-
-// Editor
-#include "Util/ImageUtil.h"
-
-bool CImageUtil_impl::LoadImage(const QString& fileName, CImageEx& image, bool* pQualityLoss)
-{
-    return CImageUtil::LoadImage(fileName, image, pQualityLoss);
-}
-
-bool CImageUtil_impl::SaveImage(const QString& fileName, CImageEx& image)
-{
-    return CImageUtil::SaveImage(fileName, image);
-}
-
-bool CImageUtil_impl::LoadJPEG(const QString& strFileName, CImageEx& image)
-{
-    return CImageUtil::LoadJPEG(strFileName, image);
-}
-
-bool CImageUtil_impl::SaveJPEG(const QString& strFileName, CImageEx& image)
-{
-    return CImageUtil::SaveJPEG(strFileName, image);
-}
-
-bool CImageUtil_impl::SaveBitmap(const QString& szFileName, CImageEx& image)
-{
-    return CImageUtil::SaveBitmap(szFileName, image);
-}
-
-bool CImageUtil_impl::LoadBmp(const QString& file, CImageEx& image)
-{
-    return CImageUtil::LoadBmp(file, image);
-}
-
-bool CImageUtil_impl::SavePGM(const QString& fileName, const CImageEx& image)
-{
-    return CImageUtil::SavePGM(fileName, image);
-}
-
-bool CImageUtil_impl::LoadPGM(const QString& fileName, CImageEx& image)
-{
-    return CImageUtil::LoadPGM(fileName, image);
-}
-
-void CImageUtil_impl::ScaleToFit(const CByteImage& srcImage, CByteImage& trgImage)
-{
-    CImageUtil::ScaleToFit(srcImage, trgImage);
-}
-
-void CImageUtil_impl::ScaleToFit(const CImageEx& srcImage, CImageEx& trgImage)
-{
-    CImageUtil::ScaleToFit(srcImage, trgImage);
-}
-
-void CImageUtil_impl::ScaleToDoubleFit(const CImageEx& srcImage, CImageEx& trgImage)
-{
-    CImageUtil::ScaleToDoubleFit(srcImage, trgImage);
-}
-
-void CImageUtil_impl::DownScaleSquareTextureTwice(const CImageEx& srcImage, CImageEx& trgImage, IImageUtil::_EAddrMode eAddressingMode)
-{
-    CImageUtil::DownScaleSquareTextureTwice(srcImage, trgImage, eAddressingMode);
-}
-
-void CImageUtil_impl::SmoothImage(CByteImage& image, int numSteps)
-{
-    CImageUtil::SmoothImage(image, numSteps);
-}
-
-unsigned char CImageUtil_impl::GetBilinearFilteredAt(const int iniX256, const int iniY256, const CByteImage& image)
-{
-    return CImageUtil::GetBilinearFilteredAt(iniX256, iniY256, image);
-}

+ 0 - 68
Code/Editor/Util/ImageUtil_impl.h

@@ -1,68 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#ifndef CRYINCLUDE_EDITOR_UTILIMAGEUTIL_IMPL_H
-#define CRYINCLUDE_EDITOR_UTILIMAGEUTIL_IMPL_H
-#pragma once
-
-#include "Include/IImageUtil.h"
-
-class CImageUtil_impl
-    : public IImageUtil
-{
-public:
-    CImageUtil_impl(){}
-    ~CImageUtil_impl(){}
-
-    //! Load image, detect image type by file extension.
-    // Arguments:
-    //   pQualityLoss - 0 if info is not needed, pointer to the result otherwise - not need to preinitialize
-    virtual bool LoadImage(const QString& fileName, CImageEx& image, bool* pQualityLoss = 0) override;
-
-    //! Save image, detect image type by file extension.
-    virtual bool SaveImage(const QString& fileName, CImageEx& image) override;
-
-    // General image fucntions
-    virtual bool LoadJPEG(const QString& strFileName, CImageEx& image) override;
-
-    virtual bool SaveJPEG(const QString& strFileName, CImageEx& image) override;
-
-    virtual bool SaveBitmap(const QString& szFileName, CImageEx& image) override;
-
-    virtual bool LoadBmp(const QString& file, CImageEx& image) override;
-
-    virtual bool SavePGM(const QString& fileName, const CImageEx& image) override;
-
-    virtual bool LoadPGM(const QString& fileName, CImageEx& image) override;
-
-    //! Scale source image to fit size of target image.
-    virtual void ScaleToFit(const CByteImage& srcImage, CByteImage& trgImage) override;
-
-    //! Scale source image to fit size of target image.
-    virtual void ScaleToFit(const CImageEx& srcImage, CImageEx& trgImage) override;
-
-    //! Scale source image to fit twice side by side in target image.
-    virtual void ScaleToDoubleFit(const CImageEx& srcImage, CImageEx& trgImage) override;
-
-    //! Scale source image twice down image with filtering
-    enum _EAddrMode
-    {
-        WRAP, CLAMP
-    };
-    virtual void DownScaleSquareTextureTwice(const CImageEx& srcImage, CImageEx& trgImage,
-        IImageUtil::_EAddrMode eAddressingMode = IImageUtil::WRAP) override;
-
-    //! Smooth image.
-    virtual void SmoothImage(CByteImage& image, int numSteps) override;
-
-    //! behavior outside of the texture is not defined
-    //! \param iniX in fix point 24.8
-    //! \param iniY in fix point 24.8
-    //! \return 0..255
-    virtual unsigned char GetBilinearFilteredAt(const int iniX256, const int iniY256, const CByteImage& image) override;
-};
-#endif // CRYINCLUDE_EDITOR_UTILIMAGEUTIL_IMPL_H

+ 2 - 3
Code/Editor/Util/MemoryBlock.cpp

@@ -10,7 +10,6 @@
 #include "EditorDefs.h"
 
 #include "MemoryBlock.h"
-#include "Include/ILogFile.h"
 #include <zlib.h>
 
 #include <QMessageBox>
@@ -92,11 +91,11 @@ bool CMemoryBlock::Allocate(int size, int uncompressedSize)
         }
         if (!m_buffer)
         {
-            GetIEditor()->GetLogFile()->Warning("Reducing working memory set failed, Sandbox must quit");
+            AZ_Warning("CMemoryBlock", false, "Reducing working memory set failed, Sandbox must quit");
         }
         else
         {
-            GetIEditor()->GetLogFile()->Warning("Reducing working memory set succeeded\r\nSandbox may become unstable, it is advised to save the level and restart editor.");
+            AZ_Warning("CMemoryBlock", false, "Reducing working memory set succeeded\r\nSandbox may become unstable, it is advised to save the level and restart editor.");
         }
     }
 

+ 1 - 270
Code/Editor/Viewport.cpp

@@ -177,19 +177,10 @@ QtViewport::QtViewport(QWidget* parent)
 
     m_activeAxis = AXIS_TERRAIN;
 
-    for (int i = 0; i < LAST_COORD_SYSTEM; i++)
-    {
-        m_constructionMatrix[i].SetIdentity();
-    }
     m_screenTM.SetIdentity();
 
-
     m_bAdvancedSelectMode = false;
 
-    m_constructionPlane.SetPlane(Vec3_OneZ, Vec3_Zero);
-    m_constructionPlaneAxisX = Vec3_Zero;
-    m_constructionPlaneAxisY = Vec3_Zero;
-
     GetIEditor()->GetViewManager()->RegisterViewport(this);
 
     m_nCurViewportID = MAX_NUM_VIEWPORTS - 1;
@@ -541,7 +532,6 @@ void QtViewport::OnSetCursor()
 void QtViewport::ResetSelectionRegion()
 {
     AABB box(Vec3(0, 0, 0), Vec3(0, 0, 0));
-    GetIEditor()->SetSelectedRegion(box);
     m_selectedRect = QRect();
 }
 
@@ -579,7 +569,6 @@ void QtViewport::OnDragSelectRectangle(const QRect& rect, bool bNormalizeRect)
 
     box.min.z = -10000;
     box.max.z = 10000;
-    GetIEditor()->SetSelectedRegion(box);
 
     // Show marker position in the status bar
     float w = box.max.x - box.min.x;
@@ -628,51 +617,6 @@ void QtViewport::ResetCursor()
     SetCurrentCursor(STD_CURSOR_DEFAULT, QString());
 }
 
-//////////////////////////////////////////////////////////////////////////
-void QtViewport::SetConstructionOrigin(const Vec3& worldPos)
-{
-    Matrix34 tm;
-    tm.SetIdentity();
-    tm.SetTranslation(worldPos);
-    SetConstructionMatrix(COORDS_LOCAL, tm);
-    SetConstructionMatrix(COORDS_PARENT, tm);
-    SetConstructionMatrix(COORDS_USERDEFINED, tm);
-}
-
-//////////////////////////////////////////////////////////////////////////
-void QtViewport::SetConstructionMatrix(RefCoordSys coordSys, const Matrix34& xform)
-{
-    m_constructionMatrix[coordSys] = xform;
-    m_constructionMatrix[coordSys].OrthonormalizeFast(); // Remove scale component from matrix.
-    if (coordSys == COORDS_LOCAL)
-    {
-        m_constructionMatrix[COORDS_VIEW].SetTranslation(xform.GetTranslation());
-        m_constructionMatrix[COORDS_WORLD].SetTranslation(xform.GetTranslation());
-        m_constructionMatrix[COORDS_USERDEFINED].SetIdentity();
-        m_constructionMatrix[COORDS_USERDEFINED].SetTranslation(xform.GetTranslation());
-        m_constructionMatrix[COORDS_PARENT] = xform;
-    }
-    MakeConstructionPlane(GetAxisConstrain());
-}
-
-//////////////////////////////////////////////////////////////////////////
-const Matrix34& QtViewport::GetConstructionMatrix(RefCoordSys coordSys)
-{
-    if (coordSys == COORDS_VIEW)
-    {
-        return m_constructionMatrix[COORDS_WORLD];
-    }
-    return m_constructionMatrix[coordSys];
-}
-
-//////////////////////////////////////////////////////////////////////////
-void QtViewport::AssignConstructionPlane(const Vec3& p1, const Vec3& p2, const Vec3& p3)
-{
-    m_constructionPlane.SetPlane(p1, p2, p3);
-    m_constructionPlaneAxisX = p3 - p1;
-    m_constructionPlaneAxisY = p2 - p1;
-}
-
 //////////////////////////////////////////////////////////////////////////
 HWND QtViewport::renderOverlayHWND() const
 {
@@ -690,219 +634,6 @@ bool QtViewport::isRenderOverlayVisible() const
     return m_renderOverlay.isVisible();
 }
 
-//////////////////////////////////////////////////////////////////////////
-void QtViewport::MakeConstructionPlane(int axis)
-{
-    QPoint cursorPos;
-    if (m_mouseCaptured)
-    {
-        cursorPos = m_cMouseDownPos;
-    }
-    else
-    {
-        cursorPos = QCursor::pos();
-        ScreenToClient(cursorPos);
-    }
-
-    Vec3 raySrc(Vec3_Zero), rayDir(Vec3_OneX);
-    ViewToWorldRay(cursorPos, raySrc, rayDir);
-
-    int coordSys = GetIEditor()->GetReferenceCoordSys();
-
-    Vec3 xAxis(Vec3_OneX);
-    Vec3 yAxis(Vec3_OneY);
-    Vec3 zAxis(Vec3_OneZ);
-
-    xAxis = m_constructionMatrix[coordSys].TransformVector(xAxis);
-    yAxis = m_constructionMatrix[coordSys].TransformVector(yAxis);
-    zAxis = m_constructionMatrix[coordSys].TransformVector(zAxis);
-
-    Vec3 pos = m_constructionMatrix[coordSys].GetTranslation();
-
-    if (axis == AXIS_X)
-    {
-        // X direction.
-        Vec3 n;
-        float d1 = fabs(rayDir.Dot(yAxis));
-        float d2 = fabs(rayDir.Dot(zAxis));
-        if (d1 > d2)
-        {
-            n = yAxis;
-        }
-        else
-        {
-            n = zAxis;
-        }
-        if (rayDir.Dot(n) < 0)
-        {
-            n = -n;                    // face construction plane to the ray.
-        }
-        //Vec3 n = Vec3(0,0,1);
-        Vec3 v1 = n.Cross(xAxis);
-        Vec3 v2 = n.Cross(v1);
-        AssignConstructionPlane(pos, pos + v2, pos + v1);
-    }
-    else if (axis == AXIS_Y)
-    {
-        // Y direction.
-        Vec3 n;
-        float d1 = fabs(rayDir.Dot(xAxis));
-        float d2 = fabs(rayDir.Dot(zAxis));
-        if (d1 > d2)
-        {
-            n = xAxis;
-        }
-        else
-        {
-            n = zAxis;
-        }
-        if (rayDir.Dot(n) < 0)
-        {
-            n = -n;                    // face construction plane to the ray.
-        }
-        Vec3 v1 = n.Cross(yAxis);
-        Vec3 v2 = n.Cross(v1);
-        AssignConstructionPlane(pos, pos + v2, pos + v1);
-    }
-    else if (axis == AXIS_Z)
-    {
-        // Z direction.
-        Vec3 n;
-        float d1 = fabs(rayDir.Dot(xAxis));
-        float d2 = fabs(rayDir.Dot(yAxis));
-        if (d1 > d2)
-        {
-            n = xAxis;
-        }
-        else
-        {
-            n = yAxis;
-        }
-        if (rayDir.Dot(n) < 0)
-        {
-            n = -n;                    // face construction plane to the ray.
-        }
-        Vec3 v1 = n.Cross(zAxis);
-        Vec3 v2 = n.Cross(v1);
-        AssignConstructionPlane(pos, pos + v2, pos + v1);
-    }
-    else if (axis == AXIS_XY)
-    {
-        AssignConstructionPlane(pos, pos + yAxis, pos + xAxis);
-    }
-    else if (axis == AXIS_XZ)
-    {
-        AssignConstructionPlane(pos, pos + zAxis, pos + xAxis);
-    }
-    else if (axis == AXIS_YZ)
-    {
-        AssignConstructionPlane(pos, pos + zAxis, pos + yAxis);
-    }
-    else
-    {
-        AssignConstructionPlane(pos, pos + yAxis, pos + xAxis);
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-Vec3 QtViewport::MapViewToCP(const QPoint& point, int axis)
-{
-    AZ_PROFILE_FUNCTION(Editor);
-
-    if (axis == AXIS_TERRAIN)
-    {
-        return SnapToGrid(ViewToWorld(point));
-    }
-
-    MakeConstructionPlane(axis);
-
-    Vec3 raySrc(Vec3_Zero), rayDir(Vec3_OneX);
-    ViewToWorldRay(point, raySrc, rayDir);
-    
-    Vec3 v;
-
-    Ray ray(raySrc, rayDir);
-    if (!Intersect::Ray_Plane(ray, m_constructionPlane, v))
-    {
-        Plane inversePlane = m_constructionPlane;
-        inversePlane.n = -inversePlane.n;
-        inversePlane.d = -inversePlane.d;
-        if (!Intersect::Ray_Plane(ray, inversePlane, v))
-        {
-            v = Vec3_Zero;
-        }
-    }
-
-    // Snap value to grid.
-    v = SnapToGrid(v);
-
-    return v;
-}
-
-//////////////////////////////////////////////////////////////////////////
-Vec3 QtViewport::GetCPVector(const Vec3& p1, const Vec3& p2, int axis)
-{
-    Vec3 v = p2 - p1;
-
-    int coordSys = GetIEditor()->GetReferenceCoordSys();
-
-    Vec3 xAxis(Vec3_OneX);
-    Vec3 yAxis(Vec3_OneY);
-    Vec3 zAxis(Vec3_OneZ);
-
-    // In local coordinate system transform axises by construction matrix.
-    xAxis = m_constructionMatrix[coordSys].TransformVector(xAxis);
-    yAxis = m_constructionMatrix[coordSys].TransformVector(yAxis);
-    zAxis = m_constructionMatrix[coordSys].TransformVector(zAxis);
-
-    if (axis == AXIS_X || axis == AXIS_Y || axis == AXIS_Z)
-    {
-        // Project vector v on transformed axis x,y or z.
-        Vec3 axisVector;
-        if (axis == AXIS_X)
-        {
-            axisVector = xAxis;
-        }
-        if (axis == AXIS_Y)
-        {
-            axisVector = yAxis;
-        }
-        if (axis == AXIS_Z)
-        {
-            axisVector = zAxis;
-        }
-
-        // Project vector on construction plane into the one of axises.
-        v = v.Dot(axisVector) * axisVector;
-    }
-    else if (axis == AXIS_XY)
-    {
-        // Project vector v on transformed plane x/y.
-        Vec3 planeNormal = xAxis.Cross(yAxis);
-        Vec3 projV = v.Dot(planeNormal) * planeNormal;
-        v = v - projV;
-    }
-    else if (axis == AXIS_XZ)
-    {
-        // Project vector v on transformed plane x/y.
-        Vec3 planeNormal = xAxis.Cross(zAxis);
-        Vec3 projV = v.Dot(planeNormal) * planeNormal;
-        v = v - projV;
-    }
-    else if (axis == AXIS_YZ)
-    {
-        // Project vector v on transformed plane x/y.
-        Vec3 planeNormal = yAxis.Cross(zAxis);
-        Vec3 projV = v.Dot(planeNormal) * planeNormal;
-        v = v - projV;
-    }
-    else if (axis == AXIS_TERRAIN)
-    {
-        v.z = 0;
-    }
-    return v;
-}
-
 //////////////////////////////////////////////////////////////////////////
 void QtViewport::SetAxisConstrain(int axis)
 {
@@ -1122,7 +853,7 @@ bool QtViewport::GetAdvancedSelectModeFlag()
 //////////////////////////////////////////////////////////////////////////
 #if defined(AZ_PLATFORM_WINDOWS)
 // Note: Both CreateAnglesYPR and CreateOrientationYPR were copied verbatim from Cry_Camera.h which has been removed.
-// 
+//
 // Description
 //   <PRE>
 //   x-YAW

+ 0 - 36
Code/Editor/Viewport.h

@@ -176,8 +176,6 @@ public:
         return m_screenTM;
     }
 
-    virtual Vec3 MapViewToCP(const QPoint& point) = 0;
-
     //! Map viewport position to world space position.
     Vec3        ViewToWorld(const QPoint& vp, bool* pCollideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override = 0;
     //! Convert point on screen to world ray.
@@ -185,14 +183,9 @@ public:
     //! Get normal for viewport position
     virtual Vec3        ViewToWorldNormal(const QPoint& vp, bool onlyTerrain, bool bTestRenderMesh = false) = 0;
 
-    virtual Vec3 GetCPVector(const Vec3& p1, const Vec3& p2, int axis) = 0;
-    virtual Vec3 GetCPVector(const Vec3& p1, const Vec3& p2) { return GetCPVector(p1, p2, GetAxisConstrain()); }
-
     //! Performs hit testing of 2d point in view to find which object hit.
     virtual bool HitTest(const QPoint& point, HitContext& hitInfo) = 0;
 
-    virtual void MakeConstructionPlane(int axis) = 0;
-
     // Access to the member m_bAdvancedSelectMode so interested modules can know its value.
     virtual bool GetAdvancedSelectModeFlag() = 0;
 
@@ -224,8 +217,6 @@ public:
         m_dropCallbackCustom = dropCallbackCustom;
     }
 
-    virtual void SetConstructionMatrix(RefCoordSys coordSys, const Matrix34& xform) = 0;
-
     virtual void BeginUndo() = 0;
     virtual void AcceptUndo(const QString& undoDescription) = 0;
     virtual void CancelUndo() = 0;
@@ -369,14 +360,6 @@ public:
     //! Get normal for viewport position
     virtual Vec3        ViewToWorldNormal(const QPoint& vp, bool onlyTerrain, bool bTestRenderMesh = false) override;
 
-    //! Map view point to world space using current construction plane.
-    Vec3 MapViewToCP(const QPoint& point) override { return MapViewToCP(point, GetAxisConstrain()); }
-    virtual Vec3 MapViewToCP(const QPoint& point, int axis);
-
-    //! This method return a vector (p2-p1) in world space alligned to construction plane and restriction axises.
-    //! p1 and p2 must be given in world space and lie on construction plane.
-    using CViewport::GetCPVector;
-    Vec3 GetCPVector(const Vec3& p1, const Vec3& p2, int axis) override;
 
     //! Snap any given 3D world position to grid lines if snap is enabled.
     Vec3 SnapToGrid(const Vec3& vec) override;
@@ -421,16 +404,6 @@ public:
 
     void GetPerpendicularAxis(EAxis* pAxis, bool* pIs2D) const override;
 
-    //////////////////////////////////////////////////////////////////////////
-    //! Set construction plane from given position construction matrix refrence coord system and axis settings.
-    //////////////////////////////////////////////////////////////////////////
-    void MakeConstructionPlane(int axis) override;
-    void SetConstructionMatrix(RefCoordSys coordSys, const Matrix34& xform) override;
-    virtual const Matrix34& GetConstructionMatrix(RefCoordSys coordSys);
-    // Set simple construction plane origin.
-    void SetConstructionOrigin(const Vec3& worldPos);
-    //////////////////////////////////////////////////////////////////////////
-
     void DegradateQuality(bool bEnable);
 
     //////////////////////////////////////////////////////////////////////////
@@ -543,13 +516,6 @@ protected:
 
     int m_activeAxis;
 
-    AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
-    //! Current construction plane.
-    ::Plane m_constructionPlane;
-    Vec3 m_constructionPlaneAxisX;
-    Vec3 m_constructionPlaneAxisY;
-    AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
-
     // When true selection helpers will be shown and hit tested against.
     bool m_bAdvancedSelectMode;
 
@@ -574,8 +540,6 @@ protected:
     QRect m_rcClient;
 
     AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
-    // Same construction matrix is shared by all viewports.
-    Matrix34 m_constructionMatrix[LAST_COORD_SYSTEM];
 
     typedef std::vector<_smart_ptr<IPostRenderer> > PostRenderers;
     PostRenderers   m_postRenderers;

+ 0 - 1
Code/Editor/editor_core_files.cmake

@@ -12,7 +12,6 @@ set(FILES
     Include/IErrorReport.h
     Include/IFileUtil.h
     Include/EditorCoreAPI.h
-    Include/IImageUtil.h
     Controls/ReflectedPropertyControl/ReflectedPropertyCtrl.qrc
     Controls/ReflectedPropertyControl/ReflectedPropertyCtrl.cpp
     Controls/ReflectedPropertyControl/ReflectedPropertyCtrl.h

+ 0 - 7
Code/Editor/editor_lib_files.cmake

@@ -260,7 +260,6 @@ set(FILES
     Include/HitContext.h
     Include/ICommandManager.h
     Include/IDisplayViewport.h
-    Include/ILogFile.h
     Include/IKeyTimeSet.h
     Include/IPlugin.h
     Include/IPreferencesPage.h
@@ -397,8 +396,6 @@ set(FILES
     Util/GeometryUtil.h
     LevelIndependentFileMan.cpp
     LevelIndependentFileMan.h
-    LogFileImpl.cpp
-    LogFileImpl.h
     PythonEditorFuncs.cpp
     PythonEditorFuncs.h
     QtUI/WaitCursor.h
@@ -561,8 +558,6 @@ set(FILES
     WaitProgress.h
     Util/FileUtil_impl.h
     Util/FileUtil_impl.cpp
-    Util/ImageUtil_impl.h
-    Util/ImageUtil_impl.cpp
     Util/ColumnSortProxyModel.h
     Util/ColumnSortProxyModel.cpp
     Util/AbstractGroupProxyModel.h
@@ -583,8 +578,6 @@ set(FILES
     Util/3DConnexionDriver.h
     Util/FileChangeMonitor.cpp
     Util/FileChangeMonitor.h
-    Util/ImageUtil.cpp
-    Util/ImageUtil.h
     Util/ImageGif.cpp
     Util/ImageGif.h
     Util/ImageTIF.cpp

+ 2 - 2
Code/Editor/splashscreen_background.png

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:079c6d28fab15dfe624307d2be81d7008cc582de496f486a604186404ca818ab
-size 903037
+oid sha256:5d543f9bfef1a186b2f68c6144320c369ca155a40c6ed81023b14ee1d3e0bfe0
+size 1800167

+ 12 - 0
Code/Framework/AzAndroid/CMakeLists.txt

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

+ 6 - 2
Code/Framework/AzCore/AzCore/Component/Entity.cpp

@@ -1048,8 +1048,12 @@ namespace AZ
             // different error message for multiple components of the same type
             if (componentProvidingService->m_underlyingTypeId == componentIncompatibleWithService->m_underlyingTypeId)
             {
-                return AZStd::string::format("Multiple '%s' found, but this component is incompatible with others of the same type.",
-                    componentProvidingService->m_component->RTTI_GetTypeName());
+                return AZStd::string::format(
+                    "Multiple '%s' found, but this component is incompatible with others of the same type. Components with UUID %s "
+                    "and %s are incompatible with each other.",
+                    componentProvidingService->m_component->RTTI_GetTypeName(),
+                    componentProvidingService->m_component->RTTI_GetType().ToString<AZStd::string>().c_str(),
+                    componentIncompatibleWithService->m_component->RTTI_GetType().ToString<AZStd::string>().c_str());
             }
 
             return AZStd::string::format("Components '%s' and '%s' are incompatible.",

+ 4 - 0
Code/Framework/AzCore/AzCore/Console/Console.cpp

@@ -10,6 +10,7 @@
 #include <AzCore/Console/ILogger.h>
 #include <AzCore/Interface/Interface.h>
 #include <AzCore/Serialization/Json/JsonSerializationSettings.h>
+#include <AzCore/Serialization/Locale.h>
 #include <AzCore/Settings/CommandLine.h>
 #include <AzCore/Settings/SettingsRegistryMergeUtils.h>
 #include <AzCore/StringFunc/StringFunc.h>
@@ -438,6 +439,9 @@ namespace AZ
         ConsoleFunctorFlags requiredClear
     )
     {
+        // incoming commands are assumed to be in the "C" locale as they might be from portable data files
+        AZ::Locale::ScopedSerializationLocale scopedLocale;
+
         bool result = false;
         ConsoleFunctorFlags flags = ConsoleFunctorFlags::Null;
 

+ 10 - 0
Code/Framework/AzCore/AzCore/Console/ConsoleTypeHelpers.inl

@@ -13,6 +13,7 @@
 #include <AzCore/std/functional.h>
 #include <AzCore/std/ranges/ranges_algorithm.h>
 #include <AzCore/std/string/fixed_string.h>
+#include <AzCore/Serialization/Locale.h>
 #include <AzCore/StringFunc/StringFunc.h>
 #include <AzCore/Math/Vector2.h>
 #include <AzCore/Math/Vector3.h>
@@ -55,26 +56,31 @@ namespace AZ
 
         inline CVarFixedString ValueToString(const AZ::Vector2& value)
         {
+            AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret %0.2f as using the "C" locale
             return CVarFixedString::format("%0.2f %0.2f", static_cast<float>(value.GetX()), static_cast<float>(value.GetY()));
         }
 
         inline CVarFixedString ValueToString(const AZ::Vector3& value)
         {
+            AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret %0.2f as using the "C" locale
             return CVarFixedString::format("%0.2f %0.2f %0.2f", static_cast<float>(value.GetX()), static_cast<float>(value.GetY()), static_cast<float>(value.GetZ()));
         }
 
         inline CVarFixedString ValueToString(const AZ::Vector4& value)
         {
+            AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret %0.2f as using the "C" locale
             return CVarFixedString::format("%0.2f %0.2f %0.2f %0.2f", static_cast<float>(value.GetX()), static_cast<float>(value.GetY()), static_cast<float>(value.GetZ()), static_cast<float>(value.GetW()));
         }
 
         inline CVarFixedString ValueToString(const AZ::Quaternion& value)
         {
+            AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret %0.2f as using the "C" locale
             return CVarFixedString::format("%0.2f %0.2f %0.2f %0.2f", static_cast<float>(value.GetX()), static_cast<float>(value.GetY()), static_cast<float>(value.GetZ()), static_cast<float>(value.GetW()));
         }
 
         inline CVarFixedString ValueToString(const AZ::Color& value)
         {
+            AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret %0.2f as using the "C" locale
             return CVarFixedString::format("%0.2f %0.2f %0.2f %0.2f", static_cast<float>(value.GetR()), static_cast<float>(value.GetG()), static_cast<float>(value.GetB()), static_cast<float>(value.GetA()));
         }
 
@@ -186,6 +192,8 @@ namespace AZ
         {
             if (!arguments.empty())
             {
+                AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret floats using the "C" locale for strod
+
                 AZ::CVarFixedString convertCandidate{ arguments.front() };
                 char* endPtr = nullptr;
                 const float converted = static_cast<float>(strtod(convertCandidate.c_str(), &endPtr));
@@ -205,6 +213,8 @@ namespace AZ
         {
             if (!arguments.empty())
             {
+                AZ::Locale::ScopedSerializationLocale scopedLocale; // interpret floats using the "C" locale for strod
+
                 AZ::CVarFixedString convertCandidate{ arguments.front() };
                 char* endPtr = nullptr;
                 const double converted = strtod(convertCandidate.c_str(), &endPtr);

+ 1 - 1
Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp

@@ -61,7 +61,7 @@ namespace AZ::IO
     {
         JobManagerDesc jobDesc;
             jobDesc.m_jobManagerName = "Full File Decompressor";
-        u32 numThreads = AZ::GetMin(maxNumJobs, AZStd::thread::hardware_concurrency());
+        u32 numThreads = AZ::GetMin(maxNumJobs, jobDesc.GetWorkerThreadCount(AZStd::thread::hardware_concurrency()));
         for (u32 i = 0; i < numThreads; ++i)
         {
             jobDesc.m_workerThreads.push_back(JobManagerThreadDesc());

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels