diff --git a/Assets/Editor/Icons/Components/Viewport/Non Uniform Scale.svg b/Assets/Editor/Icons/Components/Viewport/NonUniformScale.svg
similarity index 100%
rename from Assets/Editor/Icons/Components/Viewport/Non Uniform Scale.svg
rename to Assets/Editor/Icons/Components/Viewport/NonUniformScale.svg
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_utils/material_editor_utils.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_utils/material_editor_utils.py
index 77d1285188..1d72885504 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_utils/material_editor_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_utils/material_editor_utils.py
@@ -13,9 +13,9 @@ import os
import sys
import time
import azlmbr.atom
+import azlmbr.atomtools as atomtools
import azlmbr.materialeditor as materialeditor
import azlmbr.bus as bus
-import azlmbr.atomtools.general as general
def is_close(actual, expected, buffer=sys.float_info.min):
@@ -125,11 +125,11 @@ def is_pane_visible(pane_name):
"""
:return: bool
"""
- return materialeditor.MaterialEditorWindowRequestBus(bus.Broadcast, "IsDockWidgetVisible", pane_name)
+ return atomtools.AtomToolsWindowRequestBus(bus.Broadcast, "IsDockWidgetVisible", pane_name)
def set_pane_visibility(pane_name, value):
- materialeditor.MaterialEditorWindowRequestBus(bus.Broadcast, "SetDockWidgetVisible", pane_name, value)
+ atomtools.AtomToolsWindowRequestBus(bus.Broadcast, "SetDockWidgetVisible", pane_name, value)
def select_lighting_config(config_name):
@@ -175,7 +175,7 @@ def wait_for_condition(function, timeout_in_seconds=1.0):
with Timeout(timeout_in_seconds) as t:
while True:
try:
- general.idle_wait_frames(1)
+ atomtools.general.idle_wait_frames(1)
except Exception:
print("WARNING: Couldn't wait for frame")
@@ -269,6 +269,6 @@ class ScreenshotHelper:
def capture_screenshot(file_path):
- return ScreenshotHelper(azlmbr.atomtools.general.idle_wait_frames).capture_screenshot_blocking(
+ return ScreenshotHelper(atomtools.general.idle_wait_frames).capture_screenshot_blocking(
os.path.join(file_path)
)
diff --git a/AutomatedTesting/Objects/Characters/Jack/Jack.fbx b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx
index bccd5cce24..2e55fdd1e7 100644
--- a/AutomatedTesting/Objects/Characters/Jack/Jack.fbx
+++ b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ba9a2cd047a5ee696aaeed882869017a02fd4f5eeee91b6b2bfb830ad1e5ee15
-size 10927631
+oid sha256:c285cdf72ebe4c274f8d1fbab6ff558f9344d4fa62fb9d07cf11f7511ffaaac9
+size 2177072
diff --git a/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo
new file mode 100644
index 0000000000..2de6d987d7
--- /dev/null
+++ b/AutomatedTesting/Objects/Characters/Jack/Jack.fbx.assetinfo
@@ -0,0 +1,328 @@
+{
+ "values": [
+ {
+ "$type": "ActorGroup",
+ "name": "Jack",
+ "selectedRootBone": "RootNode.jack_root",
+ "id": "{B7194F91-D8A1-5D5D-AC6D-DDEBC087D80D}",
+ "rules": {
+ "rules": [
+ {
+ "$type": "MetaDataRule",
+ "metaData": "AdjustActor -actorID $(ACTORID) -name \"Jack\"\nActorSetCollisionMeshes -actorID $(ACTORID) -lod 0 -nodeList \"\"\nAdjustActor -actorID $(ACTORID) -nodesExcludedFromBounds \"\" -nodeAction \"select\"\nAdjustActor -actorID $(ACTORID) -nodeAction \"replace\" -attachmentNodes \"\"\nAdjustActor -actorID $(ACTORID) -motionExtractionNodeName \"jack_root\"\nAdjustActor -actorID $(ACTORID) -mirrorSetup \"\"\n"
+ }
+ ]
+ }
+ },
+ {
+ "$type": "{5B03C8E6-8CEE-4DA0-A7FA-CD88689DD45B} MeshGroup",
+ "id": "{BF2CCF49-9BE0-5103-987A-84649A974991}",
+ "name": "Jack",
+ "NodeSelectionList": {
+ "unselectedNodes": [
+ "RootNode",
+ "RootNode.jack_root",
+ "RootNode.jack_meshZUp",
+ "RootNode.jack_root.Bip01__pelvis",
+ "RootNode.jack_meshZUp.jack_meshZUp_1",
+ "RootNode.jack_meshZUp.jack_meshZUp_2",
+ "RootNode.jack_root.Bip01__pelvis.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg",
+ "RootNode.jack_root.Bip01__pelvis.spine1",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.Bitangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.SkinWeight_",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.transform",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.Tangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.map1",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.jack",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.Bitangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.SkinWeight_",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.transform",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.Tangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.map1",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.jack",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_upLegRoll",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_upLegRoll",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg",
+ "RootNode.jack_root.Bip01__pelvis.spine1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_upLegRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_upLegRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.l_ball",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.r_ball",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.l_ball.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.r_ball.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.head",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.head.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_upArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_loArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_upArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_loArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_handProp",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_handProp",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_handProp.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_handProp.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.l_thumb3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.l_index3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.l_mid3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.r_thumb3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.r_index3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.r_mid3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.l_thumb3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.l_index3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.l_mid3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.l_ring3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.l_pinky3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.r_thumb3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.r_index3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.r_mid3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.r_ring3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.r_pinky3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.l_ring3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.l_pinky3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.r_ring3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.r_pinky3.transform"
+ ]
+ }
+ },
+ {
+ "$type": "{07B356B7-3635-40B5-878A-FAC4EFD5AD86} MeshGroup",
+ "name": "Jack",
+ "nodeSelectionList": {
+ "selectedNodes": [
+ "RootNode",
+ "RootNode.jack_root",
+ "RootNode.jack_meshZUp",
+ "RootNode.jack_root.Bip01__pelvis",
+ "RootNode.jack_meshZUp.jack_meshZUp_1",
+ "RootNode.jack_meshZUp.jack_meshZUp_2",
+ "RootNode.jack_root.Bip01__pelvis.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg",
+ "RootNode.jack_root.Bip01__pelvis.spine1",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.Bitangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.SkinWeight_",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.transform",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.Tangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.map1",
+ "RootNode.jack_meshZUp.jack_meshZUp_1.jack",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.Bitangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.SkinWeight_",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.transform",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.Tangent",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.map1",
+ "RootNode.jack_meshZUp.jack_meshZUp_2.jack",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_upLegRoll",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_upLegRoll",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg",
+ "RootNode.jack_root.Bip01__pelvis.spine1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_upLegRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_upLegRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.transform",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.l_ball",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.r_ball",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr",
+ "RootNode.jack_root.Bip01__pelvis.l_upLeg.l_loLeg.l_ankle.l_ball.transform",
+ "RootNode.jack_root.Bip01__pelvis.r_upLeg.r_loLeg.r_ankle.r_ball.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.head",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.neck.head.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_upArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_loArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_upArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_loArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_handProp",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_handProp",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_handProp.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_handProp.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.l_thumb3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.l_index3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.l_mid3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.r_thumb3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.r_index3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.r_mid3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_thumb1.l_thumb2.l_thumb3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_index1.l_index2.l_index3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_mid1.l_mid2.l_mid3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.l_ring3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.l_pinky3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_thumb1.r_thumb2.r_thumb3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_index1.r_index2.r_index3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.r_mid2.r_mid3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.r_ring3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.r_pinky3",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_ring1.l_ring2.l_ring3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.l_pinky1.l_pinky2.l_pinky3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_ring1.r_ring2.r_ring3.transform",
+ "RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_metacarpal.r_pinky1.r_pinky2.r_pinky3.transform"
+ ]
+ },
+ "rules": {
+ "rules": [
+ {
+ "$type": "SkinRule"
+ },
+ {
+ "$type": "MaterialRule"
+ }
+ ]
+ },
+ "id": "{59B1DB76-5B27-5569-8DF6-55296FD0E5D8}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/Jack.mtl b/AutomatedTesting/Objects/Characters/Jack/Jack.mtl
deleted file mode 100644
index 2af23cc798..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/Jack.mtl
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_lower_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_lower_01.cgf
deleted file mode 100644
index a9530b6d1b..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_lower_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb1c97394454a0a0c3b4aaf8380878aac3f7bedc9091ec920963932ad6ad2290
-size 30484
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_upper_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_upper_01.cgf
deleted file mode 100644
index 781ff1fe50..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/arm_plates_upper_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d090219fc20e7c1d9f0c187f976a7cb55e5b27b39e087aa8281ac794f314cb32
-size 22364
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/back_pack_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/back_pack_01.cgf
deleted file mode 100644
index 0e59a1393d..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/back_pack_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fa78264ca46a2f201e24c3ba6a543e713bf9fd984df0a10f52b191d21077227
-size 106676
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/head_aerial_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/head_aerial_01.cgf
deleted file mode 100644
index cc54ba4b64..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/head_aerial_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ebf610eecec9a4da2d5c9260c48b81f6a04eaf7686d69850ad9f5d06fdbcf183
-size 12940
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/jack_matGroup.mtl b/AutomatedTesting/Objects/Characters/Jack/attachments/jack_matGroup.mtl
deleted file mode 100644
index ebade464ec..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/jack_matGroup.mtl
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_l_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_l_01.cgf
deleted file mode 100644
index 3ffabb1464..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_l_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:30afe8cf6e4aca846b07ef81747607afb47c0ff88283f363aca29ded9818c3db
-size 8148
diff --git a/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_r_01.cgf b/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_r_01.cgf
deleted file mode 100644
index e98083d030..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/attachments/leg_plate_r_01.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dba25dd8b3840d01aefb69007919b07befc5365fff714493c87cf1eff644d5dc
-size 8148
diff --git a/AutomatedTesting/Objects/Characters/Jack/dummyPlane_mat_group.mtl b/AutomatedTesting/Objects/Characters/Jack/dummyPlane_mat_group.mtl
deleted file mode 100644
index 4545010b7e..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/dummyPlane_mat_group.mtl
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/enemy_matGroup.mtl b/AutomatedTesting/Objects/Characters/Jack/enemy_matGroup.mtl
deleted file mode 100644
index 523dac897f..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/enemy_matGroup.mtl
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/enemy_runner_matGroup.mtl b/AutomatedTesting/Objects/Characters/Jack/enemy_runner_matGroup.mtl
deleted file mode 100644
index 95c40eeb65..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/enemy_runner_matGroup.mtl
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/enemy_tank_matGroup.mtl b/AutomatedTesting/Objects/Characters/Jack/enemy_tank_matGroup.mtl
deleted file mode 100644
index e0f18e9f69..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/enemy_tank_matGroup.mtl
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/jack_matGroup.mtl b/AutomatedTesting/Objects/Characters/Jack/jack_matGroup.mtl
deleted file mode 100644
index 3927661f97..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/jack_matGroup.mtl
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif
deleted file mode 100644
index 378e0ea6ed..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ca5c900fabf8b5c8c9313a0144886f4da3f812c82e8cffd652d9c61b9bb5b953
-size 4221960
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif.exportsettings
deleted file mode 100644
index 10f3182ac9..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_01_ddna.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif
deleted file mode 100644
index 5b4a3c3518..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:80f40a78e4b21dd27f5ddf34337e7d0e2119b7cfa08f0eea38d4b1d63808821f
-size 3178996
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_diff.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif
deleted file mode 100644
index a85ac62f6c..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e5f5e327624e0f1fd35fac141019941b12ad0642c25853be9f7fd5b9b6f91bc5
-size 3168212
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_White_emis.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_black_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_black_diff.tif
deleted file mode 100644
index c861056eea..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_black_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:089e74ca9a41967038e16a9107099a73f8e93d39c487ff5bacdde18f418bf761
-size 3176732
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif
deleted file mode 100644
index 6909252726..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d45cd564d2b52575d1ad37b907a7d378871f05f6c9e5569ec73d7973d56599c9
-size 3167984
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_emis.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif
deleted file mode 100644
index 3254f98355..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:83a872c07f7cbbcb868903429dd8d5a71e8c0b7b0e2cb16cb08b5cb26b02251c
-size 3177492
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_green_diff.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif
deleted file mode 100644
index b00a8cd13b..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:81c1bc9545a17232523fd97561013534221b3bf8927feefa52bdc757e294c2e2
-size 3179140
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_red_diff.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif
deleted file mode 100644
index 3e2fb9a003..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:99f476a56205c80878be7472857a6430ce6dc40f2eb1558de4933a5b79fa2420
-size 814244
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif.exportsettings
deleted file mode 100644
index aaaf14a9fe..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_spec.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Reflectance /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif
deleted file mode 100644
index 2c44044576..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:366959c8a31356669d47f58d07157171ed369b3e7549b3b65a8b8d153a1477a6
-size 3179956
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_diff.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif
deleted file mode 100644
index 4dea311abb..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e839924e03ba99459547df1cf5334de3bdad75b18e76176e430e343a979d9f05
-size 3168472
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif.exportsettings
deleted file mode 100644
index 2d1dccbf99..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/BrokenRobot_yellow_emis.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif b/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif
deleted file mode 100644
index 57d61f505a..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:36f537bb5be89fccba1502e9e8f8dfffbf05ea8aa82ac439305e8c2502b01691
-size 16804800
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif.exportsettings
deleted file mode 100644
index a90d724812..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_ddna.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif b/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif
deleted file mode 100644
index a8f5db9a96..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b0457cbbbe1fe7e52fdb9af7ee2bc32df96a453fe248738b35ffe0b8087a28c5
-size 12615988
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif.exportsettings
deleted file mode 100644
index f35416077f..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_diff.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /M=50,50,50,0,50,50 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif b/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif
deleted file mode 100644
index f5ee4b43b2..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4ba741103d039bddf72d4834c92a5e069285e31b8be2e7f4e8103f9c5c81694f
-size 3167864
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif.exportsettings
deleted file mode 100644
index 8177b5abe6..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_emis.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif b/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif
deleted file mode 100644
index 20fb2114c0..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4d7cb58f48e4df76214509fc01d5170fd38bc447d56af61f008c04a1653c2d20
-size 12614884
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif.exportsettings
deleted file mode 100644
index 7fbb585758..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /M=50,50,50,0,50,50 /preset=Reflectance /reduce=0
\ No newline at end of file
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif b/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif
deleted file mode 100644
index 3334a5c39b..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:80a2c56bfcb8c98bf5a72ec9fdb5fcc6eae28ba1c3c26efad5c8a36e6105f1d0
-size 3173936
diff --git a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif.exportsettings b/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif.exportsettings
deleted file mode 100644
index aaaf14a9fe..0000000000
--- a/AutomatedTesting/Objects/Characters/Jack/textures/jack_spec_02_spec.tif.exportsettings
+++ /dev/null
@@ -1 +0,0 @@
-/autooptimizefile=0 /preset=Reflectance /reduce=0
\ No newline at end of file
diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.cpp b/Code/Editor/EditorPreferencesPageViewportMovement.cpp
index 1efe64488d..988b4954d1 100644
--- a/Code/Editor/EditorPreferencesPageViewportMovement.cpp
+++ b/Code/Editor/EditorPreferencesPageViewportMovement.cpp
@@ -68,45 +68,21 @@ QIcon& CEditorPreferencesPage_ViewportMovement::GetIcon()
void CEditorPreferencesPage_ViewportMovement::OnApply()
{
- if (SandboxEditor::UsingNewCameraSystem())
- {
- SandboxEditor::SetCameraTranslateSpeed(m_cameraMovementSettings.m_moveSpeed);
- SandboxEditor::SetCameraRotateSpeed(m_cameraMovementSettings.m_rotateSpeed);
- SandboxEditor::SetCameraBoostMultiplier(m_cameraMovementSettings.m_fastMoveSpeed);
- SandboxEditor::SetCameraScrollSpeed(m_cameraMovementSettings.m_wheelZoomSpeed);
- SandboxEditor::SetCameraOrbitYawRotationInverted(m_cameraMovementSettings.m_invertYRotation);
- SandboxEditor::SetCameraPanInvertedX(m_cameraMovementSettings.m_invertPan);
- SandboxEditor::SetCameraPanInvertedY(m_cameraMovementSettings.m_invertPan);
- }
- else
- {
- gSettings.cameraMoveSpeed = m_cameraMovementSettings.m_moveSpeed;
- gSettings.cameraRotateSpeed = m_cameraMovementSettings.m_rotateSpeed;
- gSettings.cameraFastMoveSpeed = m_cameraMovementSettings.m_fastMoveSpeed;
- gSettings.wheelZoomSpeed = m_cameraMovementSettings.m_wheelZoomSpeed;
- gSettings.invertYRotation = m_cameraMovementSettings.m_invertYRotation;
- gSettings.invertPan = m_cameraMovementSettings.m_invertPan;
- }
+ SandboxEditor::SetCameraTranslateSpeed(m_cameraMovementSettings.m_moveSpeed);
+ SandboxEditor::SetCameraRotateSpeed(m_cameraMovementSettings.m_rotateSpeed);
+ SandboxEditor::SetCameraBoostMultiplier(m_cameraMovementSettings.m_fastMoveSpeed);
+ SandboxEditor::SetCameraScrollSpeed(m_cameraMovementSettings.m_wheelZoomSpeed);
+ SandboxEditor::SetCameraOrbitYawRotationInverted(m_cameraMovementSettings.m_invertYRotation);
+ SandboxEditor::SetCameraPanInvertedX(m_cameraMovementSettings.m_invertPan);
+ SandboxEditor::SetCameraPanInvertedY(m_cameraMovementSettings.m_invertPan);
}
void CEditorPreferencesPage_ViewportMovement::InitializeSettings()
{
- if (SandboxEditor::UsingNewCameraSystem())
- {
- m_cameraMovementSettings.m_moveSpeed = SandboxEditor::CameraTranslateSpeed();
- m_cameraMovementSettings.m_rotateSpeed = SandboxEditor::CameraRotateSpeed();
- m_cameraMovementSettings.m_fastMoveSpeed = SandboxEditor::CameraBoostMultiplier();
- m_cameraMovementSettings.m_wheelZoomSpeed = SandboxEditor::CameraScrollSpeed();
- m_cameraMovementSettings.m_invertYRotation = SandboxEditor::CameraOrbitYawRotationInverted();
- m_cameraMovementSettings.m_invertPan = SandboxEditor::CameraPanInvertedX() && SandboxEditor::CameraPanInvertedY();
- }
- else
- {
- m_cameraMovementSettings.m_moveSpeed = gSettings.cameraMoveSpeed;
- m_cameraMovementSettings.m_rotateSpeed = gSettings.cameraRotateSpeed;
- m_cameraMovementSettings.m_fastMoveSpeed = gSettings.cameraFastMoveSpeed;
- m_cameraMovementSettings.m_wheelZoomSpeed = gSettings.wheelZoomSpeed;
- m_cameraMovementSettings.m_invertYRotation = gSettings.invertYRotation;
- m_cameraMovementSettings.m_invertPan = gSettings.invertPan;
- }
+ m_cameraMovementSettings.m_moveSpeed = SandboxEditor::CameraTranslateSpeed();
+ m_cameraMovementSettings.m_rotateSpeed = SandboxEditor::CameraRotateSpeed();
+ m_cameraMovementSettings.m_fastMoveSpeed = SandboxEditor::CameraBoostMultiplier();
+ m_cameraMovementSettings.m_wheelZoomSpeed = SandboxEditor::CameraScrollSpeed();
+ m_cameraMovementSettings.m_invertYRotation = SandboxEditor::CameraOrbitYawRotationInverted();
+ m_cameraMovementSettings.m_invertPan = SandboxEditor::CameraPanInvertedX() && SandboxEditor::CameraPanInvertedY();
}
diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h
index 1898cf642a..b1488c5528 100644
--- a/Code/Editor/EditorViewportSettings.h
+++ b/Code/Editor/EditorViewportSettings.h
@@ -118,8 +118,4 @@ namespace SandboxEditor
SANDBOX_API AzFramework::InputChannelId CameraOrbitPanChannelId();
SANDBOX_API void SetCameraOrbitPanChannelId(AZStd::string_view cameraOrbitPanId);
-
- //! Return if the new editor camera system is enabled or not.
- //! @note This is implemented in EditorViewportWidget.cpp
- SANDBOX_API bool UsingNewCameraSystem();
} // namespace SandboxEditor
diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp
index dd89d96dc3..9ef20e02fb 100644
--- a/Code/Editor/EditorViewportWidget.cpp
+++ b/Code/Editor/EditorViewportWidget.cpp
@@ -72,7 +72,6 @@
#include "IPostEffectGroup.h"
#include "EditorPreferencesPageGeneral.h"
#include "ViewportManipulatorController.h"
-#include "LegacyViewportCameraController.h"
#include "EditorViewportSettings.h"
#include "ViewPane.h"
@@ -105,17 +104,8 @@
AZ_CVAR(
bool, ed_visibility_logTiming, false, nullptr, AZ::ConsoleFunctorFlags::Null, "Output the timing of the new IVisibilitySystem query");
-AZ_CVAR(bool, ed_useNewCameraSystem, true, nullptr, AZ::ConsoleFunctorFlags::Null, "Use the new Editor camera system");
AZ_CVAR(bool, ed_showCursorCameraLook, true, nullptr, AZ::ConsoleFunctorFlags::Null, "Show the cursor when using free look with the new camera system");
-namespace SandboxEditor
-{
- bool UsingNewCameraSystem()
- {
- return ed_useNewCameraSystem;
- }
-} // namespace SandboxEditor
-
EditorViewportWidget* EditorViewportWidget::m_pPrimaryViewport = nullptr;
#if AZ_TRAIT_OS_PLATFORM_APPLE
@@ -640,7 +630,7 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
if (m_renderViewport)
{
- m_renderViewport->GetControllerList()->SetEnabled(true);
+ m_renderViewport->SetInputProcessingEnabled(true);
}
break;
@@ -1274,15 +1264,8 @@ void EditorViewportWidget::SetViewportId(int id)
m_renderViewport->GetControllerList()->Add(AZStd::make_shared());
- if (ed_useNewCameraSystem)
- {
- m_renderViewport->GetControllerList()->Add(CreateModularViewportCameraController(AzFramework::ViewportId(id)));
- }
- else
- {
- m_renderViewport->GetControllerList()->Add(AZStd::make_shared());
- }
-
+ m_renderViewport->GetControllerList()->Add(CreateModularViewportCameraController(AzFramework::ViewportId(id)));
+
m_renderViewport->SetViewportSettings(&g_EditorViewportSettings);
UpdateScene();
@@ -2239,7 +2222,6 @@ void EditorViewportWidget::CenterOnAABB(const AABB& aabb)
orbitDistance = fabs(orbitDistance);
SetViewTM(newTM);
- SandboxEditor::OrbitCameraControlsBus::Event(GetViewportId(), &SandboxEditor::OrbitCameraControlsBus::Events::SetOrbitDistance, orbitDistance);
}
void EditorViewportWidget::CenterOnSliceInstance()
diff --git a/Code/Editor/GotoPositionDlg.cpp b/Code/Editor/GotoPositionDlg.cpp
index c1e64ed1a9..aec5f03fbd 100644
--- a/Code/Editor/GotoPositionDlg.cpp
+++ b/Code/Editor/GotoPositionDlg.cpp
@@ -108,24 +108,12 @@ void GotoPositionDialog::OnUpdateNumbers()
void GotoPositionDialog::accept()
{
- if (SandboxEditor::UsingNewCameraSystem())
- {
- SandboxEditor::InterpolateDefaultViewportCameraToTransform(
- AZ::Vector3(
- aznumeric_cast(m_ui->m_dymX->value()), aznumeric_cast(m_ui->m_dymY->value()),
- aznumeric_cast(m_ui->m_dymZ->value())),
- AZ::DegToRad(aznumeric_cast(m_ui->m_dymAnglePitch->value())),
- AZ::DegToRad(aznumeric_cast(m_ui->m_dymAngleYaw->value())));
- }
- else
- {
- SandboxEditor::SetDefaultViewportCameraPosition(AZ::Vector3(
+ SandboxEditor::InterpolateDefaultViewportCameraToTransform(
+ AZ::Vector3(
aznumeric_cast(m_ui->m_dymX->value()), aznumeric_cast(m_ui->m_dymY->value()),
- aznumeric_cast(m_ui->m_dymZ->value())));
- SandboxEditor::SetDefaultViewportCameraRotation(
- AZ::DegToRad(aznumeric_cast(m_ui->m_dymAnglePitch->value())),
- AZ::DegToRad(aznumeric_cast(m_ui->m_dymAngleYaw->value())));
- }
+ aznumeric_cast(m_ui->m_dymZ->value())),
+ AZ::DegToRad(aznumeric_cast(m_ui->m_dymAnglePitch->value())),
+ AZ::DegToRad(aznumeric_cast(m_ui->m_dymAngleYaw->value())));
QDialog::accept();
}
diff --git a/Code/Editor/LegacyViewportCameraController.cpp b/Code/Editor/LegacyViewportCameraController.cpp
deleted file mode 100644
index eb7323b423..0000000000
--- a/Code/Editor/LegacyViewportCameraController.cpp
+++ /dev/null
@@ -1,537 +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 "LegacyViewportCameraController.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include "CryCommon/MathConversion.h"
-#include "SandboxAPI.h"
-#include "Settings.h"
-
-namespace SandboxEditor
-{
-
-LegacyViewportCameraControllerInstance::LegacyViewportCameraControllerInstance(AzFramework::ViewportId viewportId, LegacyViewportCameraController* controller)
- : AzFramework::MultiViewportControllerInstanceInterface(viewportId, controller)
-{
- OrbitCameraControlsBus::Handler::BusConnect(viewportId);
-}
-
-LegacyViewportCameraControllerInstance::~LegacyViewportCameraControllerInstance()
-{
- OrbitCameraControlsBus::Handler::BusDisconnect();
-}
-
-bool LegacyViewportCameraControllerInstance::JustAltHeld() const
-{
- return (m_modifiers ^ Qt::AltModifier) == 0;
-}
-
-bool LegacyViewportCameraControllerInstance::NoModifierHeld() const
-{
- return !m_modifiers;
-}
-
-bool LegacyViewportCameraControllerInstance::AllowDolly() const
-{
- return JustAltHeld();
-}
-
-bool LegacyViewportCameraControllerInstance::AllowOrbit() const
-{
- return JustAltHeld();
-}
-
-bool LegacyViewportCameraControllerInstance::AllowPan() const
-{
- // begin pan with alt (inverted movement) or no modifiers
- return JustAltHeld() || NoModifierHeld();
-}
-
-bool LegacyViewportCameraControllerInstance::InvertPan() const
-{
- return JustAltHeld();
-}
-
-void LegacyViewportCameraControllerInstance::SetOrbitDistance(float orbitDistance)
-{
- m_orbitDistance = orbitDistance;
-}
-
-
-AZ::RPI::ViewportContextPtr LegacyViewportCameraControllerInstance::GetViewportContext()
-{
- // This could be cached, if needed
- auto viewportContextManager = AZ::Interface::Get();
- if (!viewportContextManager)
- {
- return {};
- }
- return viewportContextManager->GetViewportContextById(GetViewportId());
-}
-
-bool LegacyViewportCameraControllerInstance::HandleMouseMove(
- int dx, int dy)
-{
- if (dx == 0 && dy == 0)
- {
- return false;
- }
-
- auto viewportContext = GetViewportContext();
- if (!viewportContext)
- {
- return false;
- }
-
- float speedScale = gSettings.cameraMoveSpeed;
-
- if (m_modifiers & Qt::Key_Control)
- {
- speedScale *= gSettings.cameraFastMoveSpeed;
- }
-
- if (m_inMoveMode || m_inOrbitMode || m_inRotateMode || m_inZoomMode)
- {
- m_totalMouseMoveDelta += AZStd::abs(dx) + AZStd::abs(dy);
- }
-
- if ((m_inRotateMode && m_inMoveMode) || m_inZoomMode)
- {
- Matrix34 m = AZTransformToLYTransform(viewportContext->GetCameraTransform());
-
- Vec3 ydir = m.GetColumn1().GetNormalized();
- Vec3 pos = m.GetTranslation();
-
- const float posDelta = 0.2f * dy * speedScale;
- pos = pos - ydir * posDelta;
- m_orbitDistance = m_orbitDistance + posDelta;
- m_orbitDistance = fabs(m_orbitDistance);
-
- m.SetTranslation(pos);
- viewportContext->SetCameraTransform(LYTransformToAZTransform(m));
- return true;
- }
- else if (m_inRotateMode)
- {
- Ang3 angles(dy, 0, dx);
- angles = angles * 0.002f * gSettings.cameraRotateSpeed;
- if (gSettings.invertYRotation)
- {
- angles.x = -angles.x;
- }
- Matrix34 camtm = AZTransformToLYTransform(viewportContext->GetCameraTransform());
- Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(camtm));
- ypr.x += angles.z;
- ypr.y += angles.x;
-
- ypr.y = AZStd::clamp(ypr.y, -1.5f, 1.5f); // to keep rotation in reasonable range
- ypr.z = 0; // to have camera always upward
-
- camtm = Matrix34(CCamera::CreateOrientationYPR(ypr), camtm.GetTranslation());
- viewportContext->SetCameraTransform(LYTransformToAZTransform(camtm));
- return true;
- }
- else if (m_inMoveMode)
- {
- // Slide.
- Matrix34 m = AZTransformToLYTransform(viewportContext->GetCameraTransform());
- Vec3 xdir = m.GetColumn0().GetNormalized();
- Vec3 zdir = m.GetColumn2().GetNormalized();
-
- if (InvertPan())
- {
- xdir = -xdir;
- zdir = -zdir;
- }
-
- Vec3 pos = m.GetTranslation();
- pos += 0.1f * xdir * dx * speedScale + 0.1f * zdir * dy * speedScale;
- m.SetTranslation(pos);
-
- AZ::Transform transform = viewportContext->GetCameraTransform();
- transform.SetTranslation(LYVec3ToAZVec3(pos));
- viewportContext->SetCameraTransform(transform);
- return true;
- }
- else if (m_inOrbitMode)
- {
- Ang3 angles(dy, 0, dx);
- angles = angles * 0.002f * gSettings.cameraRotateSpeed;
-
- if (gSettings.invertPan)
- {
- angles.z = -angles.z;
- }
-
- Matrix34 m = AZTransformToLYTransform(viewportContext->GetCameraTransform());
- Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(m));
- ypr.x += angles.z;
- ypr.y = AZStd::clamp(ypr.y, -1.5f, 1.5f); // to keep rotation in reasonable range
- ypr.y += angles.x;
-
- Matrix33 rotateTM = CCamera::CreateOrientationYPR(ypr);
-
- Vec3 src = m.GetTranslation();
- Vec3 trg(m_orbitTarget.GetX(), m_orbitTarget.GetY(), m_orbitTarget.GetZ());
- float fCameraRadius = (trg - src).GetLength();
-
- // Calc new source.
- src = trg - rotateTM * Vec3(0, 1, 0) * fCameraRadius;
- Matrix34 camTM = rotateTM;
- camTM.SetTranslation(src);
-
- viewportContext->SetCameraTransform(LYTransformToAZTransform(camTM));
- return true;
- }
- return false;
-}
-
-bool LegacyViewportCameraControllerInstance::HandleMouseWheel(float zDelta)
-{
- auto viewportContext = GetViewportContext();
- if (!viewportContext)
- {
- return false;
- }
-
- Matrix34 m = AZTransformToLYTransform(viewportContext->GetCameraTransform());
- const Vec3 ydir = m.GetColumn1().GetNormalized();
-
- Vec3 pos = m.GetTranslation();
-
- const float posDelta = 0.01f * zDelta * gSettings.wheelZoomSpeed;
- pos += ydir * posDelta;
- m_orbitDistance = m_orbitDistance - posDelta;
- m_orbitDistance = fabs(m_orbitDistance);
-
- m.SetTranslation(pos);
- viewportContext->SetCameraTransform(LYTransformToAZTransform(m));
- return true;
-}
-
-bool LegacyViewportCameraControllerInstance::IsKeyDown(Qt::Key key) const
-{
- return m_pressedKeys.contains(key);
-}
-
-Qt::Key LegacyViewportCameraControllerInstance::GetKeyboardKey(const AzFramework::InputChannel& inputChannel)
-{
- using Key = AzFramework::InputDeviceKeyboard::Key;
- const auto& id = inputChannel.GetInputChannelId();
- if (id == Key::AlphanumericW)
- {
- return Qt::Key_W;
- }
- else if (id == Key::AlphanumericA)
- {
- return Qt::Key_A;
- }
- else if (id == Key::AlphanumericS)
- {
- return Qt::Key_S;
- }
- else if (id == Key::AlphanumericD)
- {
- return Qt::Key_D;
- }
- else if (id == Key::AlphanumericQ)
- {
- return Qt::Key_Q;
- }
- else if (id == Key::AlphanumericE)
- {
- return Qt::Key_E;
- }
- else if (id == Key::NavigationArrowUp)
- {
- return Qt::Key_Up;
- }
- else if (id == Key::NavigationArrowUp)
- {
- return Qt::Key_Down;
- }
- else if (id == Key::NavigationArrowUp)
- {
- return Qt::Key_Left;
- }
- else if (id == Key::NavigationArrowUp)
- {
- return Qt::Key_Right;
- }
- return Qt::Key_unknown;
-}
-
-Qt::KeyboardModifier LegacyViewportCameraControllerInstance::GetKeyboardModifier(const AzFramework::InputChannel& inputChannel)
-{
- using Key = AzFramework::InputDeviceKeyboard::Key;
- const auto& id = inputChannel.GetInputChannelId();
- if (id == Key::ModifierAltL || id == Key::ModifierAltR)
- {
- return Qt::KeyboardModifier::AltModifier;
- }
- if (id == Key::ModifierCtrlL || id == Key::ModifierCtrlR)
- {
- return Qt::KeyboardModifier::ControlModifier;
- }
- if (id == Key::ModifierShiftL || id == Key::ModifierShiftR)
- {
- return Qt::KeyboardModifier::ShiftModifier;
- }
- return Qt::KeyboardModifier::NoModifier;
-}
-
-bool LegacyViewportCameraControllerInstance::HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event)
-{
- using AzFramework::InputChannel;
- using MouseButton = AzFramework::InputDeviceMouse::Button;
- const auto& id = event.m_inputChannel.GetInputChannelId();
- const auto& state = event.m_inputChannel.GetState();
- bool shouldCaptureCursor = m_capturingCursor;
- bool shouldConsumeEvent = false;
-
- if (id == AzFramework::InputDeviceMouse::Movement::X || id == AzFramework::InputDeviceMouse::Movement::Y)
- {
- int dx = 0;
- int dy = 0;
- if (id == AzFramework::InputDeviceMouse::Movement::X)
- {
- dx = -aznumeric_cast(event.m_inputChannel.GetValue());
- }
- else
- {
- dy = -aznumeric_cast(event.m_inputChannel.GetValue());
- }
- return HandleMouseMove(dx, dy);
- }
- else if (id == MouseButton::Left)
- {
- if (state == InputChannel::State::Began)
- {
- if (AllowOrbit())
- {
- AzFramework::CameraState cameraState;
- AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult(
- cameraState, event.m_viewportId,
- &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::GetCameraState);
-
- m_inOrbitMode = true;
- m_orbitTarget = cameraState.m_position + cameraState.m_forward * m_orbitDistance;
-
- shouldConsumeEvent = true;
- shouldCaptureCursor = true;
- }
- }
- else if (state == InputChannel::State::Ended)
- {
- m_inOrbitMode = false;
- shouldCaptureCursor = false;
- }
- }
- else if (id == MouseButton::Right)
- {
- if (state == InputChannel::State::Began)
- {
- if (AllowDolly())
- {
- m_inZoomMode = true;
- }
- else
- {
- m_inRotateMode = true;
- }
-
- shouldCaptureCursor = true;
- // Record how much the cursor has been moved to see if we should own the mouse up event.
- m_totalMouseMoveDelta = 0;
- }
- else if (state == InputChannel::State::Ended)
- {
- m_inZoomMode = false;
- m_inRotateMode = false;
- // If we've moved the cursor more than a couple pixels, we should eat this mouse up event to prevent the context menu controller from seeing it.
- shouldConsumeEvent = m_totalMouseMoveDelta > 2;
- shouldCaptureCursor = false;
- }
- }
- else if (id == MouseButton::Middle)
- {
- if (state == InputChannel::State::Began)
- {
- if (AllowPan())
- {
- m_inMoveMode = true;
- shouldConsumeEvent = true;
- shouldCaptureCursor = true;
- }
- }
- else if (state == InputChannel::State::Ended)
- {
- m_inMoveMode = false;
- shouldCaptureCursor = false;
- }
- }
- else if (auto modifier = GetKeyboardModifier(event.m_inputChannel); modifier != Qt::KeyboardModifier::NoModifier)
- {
- if (state == InputChannel::State::Ended)
- {
- m_modifiers &= ~modifier;
- }
- else
- {
- m_modifiers |= modifier;
- }
- }
- else if (id == AzFramework::InputDeviceMouse::Movement::Z)
- {
- if (state == InputChannel::State::Began || state == InputChannel::State::Updated)
- {
- shouldConsumeEvent = HandleMouseWheel(event.m_inputChannel.GetValue());
- }
- }
- else if (auto key = GetKeyboardKey(event.m_inputChannel); key != Qt::Key_unknown)
- {
- if (!event.m_inputChannel.IsActive())
- {
- m_pressedKeys.erase(key);
- }
- else
- {
- m_pressedKeys.insert(key);
- shouldConsumeEvent = true;
- }
- }
-
- UpdateCursorCapture(shouldCaptureCursor);
-
- return shouldConsumeEvent;
-}
-
-void LegacyViewportCameraControllerInstance::UpdateCursorCapture(bool shouldCaptureCursor)
-{
- if (m_capturingCursor != shouldCaptureCursor)
- {
- if (shouldCaptureCursor)
- {
- AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Event(
- GetViewportId(),
- &AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::BeginCursorCapture
- );
- }
- else
- {
- AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Event(
- GetViewportId(),
- &AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Events::EndCursorCapture
- );
- }
-
- m_capturingCursor = shouldCaptureCursor;
- }
-}
-
-void LegacyViewportCameraControllerInstance::ResetInputChannels()
-{
- m_modifiers = 0;
- m_pressedKeys.clear();
- UpdateCursorCapture(false);
- m_inRotateMode = m_inMoveMode = m_inOrbitMode = m_inZoomMode = false;
-}
-
-void LegacyViewportCameraControllerInstance::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event)
-{
- auto viewportContext = GetViewportContext();
- if (!viewportContext)
- {
- return;
- }
-
- AZ::Transform transform = viewportContext->GetCameraTransform();
- AZ::Vector3 xdir = transform.GetBasisX();
- AZ::Vector3 ydir = transform.GetBasisY();
- AZ::Vector3 zdir = transform.GetBasisZ();
-
- AZ::Vector3 pos = transform.GetTranslation();
-
- float speedScale = AZStd::GetMin(30.0f * event.m_deltaTime.count(), 20.0f);
-
- // Use the global modifier keys instead of our keymap. It's more reliable.
- const bool shiftPressed = m_modifiers & Qt::ShiftModifier;
- const bool controlPressed = m_modifiers & Qt::ControlModifier;
-
- speedScale *= gSettings.cameraMoveSpeed;
- if (controlPressed)
- {
- return;
- }
-
- if (shiftPressed)
- {
- speedScale *= gSettings.cameraFastMoveSpeed;
- }
-
- bool cameraMoved = false;
-
- if (IsKeyDown(Qt::Key_Up) || IsKeyDown(Qt::Key_W))
- {
- // move forward
- cameraMoved = true;
- pos = pos + (speedScale * m_moveSpeed * ydir);
- }
-
- if (IsKeyDown(Qt::Key_Down) || IsKeyDown(Qt::Key_S))
- {
- // move backward
- cameraMoved = true;
- pos = pos - (speedScale * m_moveSpeed * ydir);
- }
-
- if (IsKeyDown(Qt::Key_Left) || IsKeyDown(Qt::Key_A))
- {
- // move left
- cameraMoved = true;
- pos = pos - (speedScale * m_moveSpeed * xdir);
- }
-
- if (IsKeyDown(Qt::Key_Right) || IsKeyDown(Qt::Key_D))
- {
- // move right
- cameraMoved = true;
- pos = pos + (speedScale * m_moveSpeed * xdir);
- }
-
- if (IsKeyDown(Qt::Key_E))
- {
- // move Up
- cameraMoved = true;
- pos = pos + (speedScale * m_moveSpeed * zdir);
- }
-
- if (IsKeyDown(Qt::Key_Q))
- {
- // move down
- cameraMoved = true;
- pos = pos - (speedScale * m_moveSpeed * zdir);
- }
-
- if (cameraMoved)
- {
- transform.SetTranslation(pos);
- viewportContext->SetCameraTransform(transform);
- }
-}
-
-} //namespace SandboxEditor
diff --git a/Code/Editor/LegacyViewportCameraController.h b/Code/Editor/LegacyViewportCameraController.h
deleted file mode 100644
index 6edd344f23..0000000000
--- a/Code/Editor/LegacyViewportCameraController.h
+++ /dev/null
@@ -1,91 +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
- *
- */
-
-#pragma once
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-
-namespace AzFramework
-{
- struct ScreenPoint;
-}
-
-namespace SandboxEditor
-{
- class OrbitCameraControls
- : public AZ::EBusTraits
- {
- public:
- //////////////////////////////////////////////////////////////////////////
- // EBusTraits overrides
- static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
- static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
- using BusIdType = AzFramework::ViewportId;
- //////////////////////////////////////////////////////////////////////////
-
- virtual void SetOrbitDistance(float orbitDistance [[maybe_unused]]) {;}
- };
- using OrbitCameraControlsBus = AZ::EBus;
-
- class LegacyViewportCameraControllerInstance;
- using LegacyViewportCameraController = AzFramework::MultiViewportController;
-
- class LegacyViewportCameraControllerInstance final
- : public AzFramework::MultiViewportControllerInstanceInterface
- , public OrbitCameraControlsBus::Handler
- {
- public:
- LegacyViewportCameraControllerInstance(AzFramework::ViewportId viewport, LegacyViewportCameraController* controller);
- ~LegacyViewportCameraControllerInstance();
-
- bool HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event) override;
- void ResetInputChannels() override;
- void UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event) override;
-
- void SetOrbitDistance(float orbitDistance) override;
-
- private:
- bool JustAltHeld() const;
- bool NoModifierHeld() const;
- bool AllowDolly() const;
- bool AllowOrbit() const;
- bool AllowPan() const;
- bool InvertPan() const;
-
- static Qt::KeyboardModifier GetKeyboardModifier(const AzFramework::InputChannel& inputChannel);
- static Qt::Key GetKeyboardKey(const AzFramework::InputChannel& inputChannel);
-
- AZ::RPI::ViewportContextPtr GetViewportContext();
-
- bool HandleMouseMove(int dx, int dy);
- bool HandleMouseWheel(float zDelta);
- bool IsKeyDown(Qt::Key key) const;
- void UpdateCursorCapture(bool shouldCaptureCursor);
-
- bool m_inRotateMode = false;
- bool m_inMoveMode = false;
- bool m_inOrbitMode = false;
- bool m_inZoomMode = false;
- int m_totalMouseMoveDelta = 0;
- float m_orbitDistance = 10.f;
- float m_moveSpeed = 1.f;
- AZ::Vector3 m_orbitTarget = {};
- unsigned int m_modifiers = {};
- AZStd::unordered_set m_pressedKeys;
- bool m_capturingCursor = false;
- };
-
-} //namespace SandboxEditor
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
index 072625936b..2ed2a30f08 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.cpp
@@ -1704,74 +1704,44 @@ void SandboxIntegrationManager::GoToEntitiesInViewports(const AzToolsFramework::
return;
}
- if (SandboxEditor::UsingNewCameraSystem())
+ const AZ::Aabb aabb = AZStd::accumulate(
+ AZStd::begin(entityIds), AZStd::end(entityIds), AZ::Aabb::CreateNull(), [](AZ::Aabb acc, const AZ::EntityId entityId) {
+ const AZ::Aabb aabb = AzFramework::CalculateEntityWorldBoundsUnion(AzToolsFramework::GetEntityById(entityId));
+ acc.AddAabb(aabb);
+ return acc;
+ });
+
+ float radius;
+ AZ::Vector3 center;
+ aabb.GetAsSphere(center, radius);
+
+ // minimum center size is 40cm
+ const float minSelectionRadius = 0.4f;
+ const float selectionSize = AZ::GetMax(minSelectionRadius, radius);
+
+ auto viewportContextManager = AZ::Interface::Get();
+
+ const int viewCount = GetIEditor()->GetViewManager()->GetViewCount(); // legacy call
+ for (int viewIndex = 0; viewIndex < viewCount; ++viewIndex)
{
- const AZ::Aabb aabb = AZStd::accumulate(
- AZStd::begin(entityIds), AZStd::end(entityIds), AZ::Aabb::CreateNull(), [](AZ::Aabb acc, const AZ::EntityId entityId) {
- const AZ::Aabb aabb = AzFramework::CalculateEntityWorldBoundsUnion(AzToolsFramework::GetEntityById(entityId));
- acc.AddAabb(aabb);
- return acc;
- });
-
- float radius;
- AZ::Vector3 center;
- aabb.GetAsSphere(center, radius);
-
- // minimum center size is 40cm
- const float minSelectionRadius = 0.4f;
- const float selectionSize = AZ::GetMax(minSelectionRadius, radius);
-
- auto viewportContextManager = AZ::Interface::Get();
-
- const int viewCount = GetIEditor()->GetViewManager()->GetViewCount(); // legacy call
- for (int viewIndex = 0; viewIndex < viewCount; ++viewIndex)
+ if (auto viewportContext = viewportContextManager->GetViewportContextById(viewIndex))
{
- if (auto viewportContext = viewportContextManager->GetViewportContextById(viewIndex))
- {
- const AZ::Transform cameraTransform = viewportContext->GetCameraTransform();
- const AZ::Vector3 forward = (center - cameraTransform.GetTranslation()).GetNormalized();
+ const AZ::Transform cameraTransform = viewportContext->GetCameraTransform();
+ const AZ::Vector3 forward = (center - cameraTransform.GetTranslation()).GetNormalized();
- // move camera 25% further back than required
- const float centerScale = 1.25f;
- // compute new camera transform
- const float fov = AzFramework::RetrieveFov(viewportContext->GetCameraProjectionMatrix());
- const float fovScale = (1.0f / AZStd::tan(fov * 0.5f));
- const float distanceToLookAt = selectionSize * fovScale * centerScale;
- const AZ::Transform nextCameraTransform =
- AZ::Transform::CreateLookAt(aabb.GetCenter() - (forward * distanceToLookAt), aabb.GetCenter());
+ // move camera 25% further back than required
+ const float centerScale = 1.25f;
+ // compute new camera transform
+ const float fov = AzFramework::RetrieveFov(viewportContext->GetCameraProjectionMatrix());
+ const float fovScale = (1.0f / AZStd::tan(fov * 0.5f));
+ const float distanceToLookAt = selectionSize * fovScale * centerScale;
+ const AZ::Transform nextCameraTransform =
+ AZ::Transform::CreateLookAt(aabb.GetCenter() - (forward * distanceToLookAt), aabb.GetCenter());
- AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
- viewportContext->GetId(),
- &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::InterpolateToTransform, nextCameraTransform,
- distanceToLookAt);
- }
- }
- }
- else
- {
- AABB selectionBounds;
- selectionBounds.Reset();
- bool entitiesAvailableForGoTo = false;
-
- for (const AZ::EntityId& entityId : entityIds)
- {
- if (CollectEntityBoundingBoxesForZoom(entityId, selectionBounds))
- {
- entitiesAvailableForGoTo = true;
- }
- }
-
- if (entitiesAvailableForGoTo)
- {
- int numViews = GetIEditor()->GetViewManager()->GetViewCount();
- for (int viewIndex = 0; viewIndex < numViews; ++viewIndex)
- {
- CViewport* viewport = GetIEditor()->GetViewManager()->GetView(viewIndex);
- if (viewport)
- {
- viewport->CenterOnAABB(selectionBounds);
- }
- }
+ AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
+ viewportContext->GetId(),
+ &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::InterpolateToTransform, nextCameraTransform,
+ distanceToLookAt);
}
}
}
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.cpp
index 017f59cdc3..158e45d6e2 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.cpp
@@ -20,7 +20,7 @@
#include
OutlinerTreeView::OutlinerTreeView(QWidget* pParent)
- : QTreeView(pParent)
+ : AzQtComponents::StyledTreeView(pParent)
, m_queuedMouseEvent(nullptr)
, m_draggingUnselectedItem(false)
{
@@ -135,16 +135,12 @@ void OutlinerTreeView::startDrag(Qt::DropActions supportedActions)
if (!selectionModel()->isSelected(index))
{
- startCustomDrag({ index }, supportedActions);
+ StartCustomDrag({ index }, supportedActions);
return;
}
}
- if (!selectionModel()->selectedIndexes().empty())
- {
- startCustomDrag(selectionModel()->selectedIndexes(), supportedActions);
- return;
- }
+ StyledTreeView::startDrag(supportedActions);
}
void OutlinerTreeView::dragMoveEvent(QDragMoveEvent* event)
@@ -336,14 +332,14 @@ void OutlinerTreeView::processQueuedMousePressedEvent(QMouseEvent* event)
QTreeView::mousePressEvent(&mousePressedEvent);
}
-void OutlinerTreeView::startCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions)
+void OutlinerTreeView::StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions)
{
m_draggingUnselectedItem = true;
//sort by container entity depth and order in hierarchy for proper drag image and drop order
QModelIndexList indexListSorted = indexList;
AZStd::unordered_map> locations;
- for (auto index : indexListSorted)
+ for (const auto& index : indexListSorted)
{
AZ::EntityId entityId(index.data(OutlinerListModel::EntityIdRole).value());
AzToolsFramework::GetEntityLocationInHierarchy(entityId, locations[entityId]);
@@ -356,74 +352,7 @@ void OutlinerTreeView::startCustomDrag(const QModelIndexList& indexList, Qt::Dro
return AZStd::lexicographical_compare(locationsE1.begin(), locationsE1.end(), locationsE2.begin(), locationsE2.end());
});
- //get the data for the unselected item(s)
- QMimeData* mimeData = model()->mimeData(indexListSorted);
- if (mimeData)
- {
- //initiate drag/drop for the item
- QDrag* drag = new QDrag(this);
- drag->setPixmap(QPixmap::fromImage(createDragImage(indexListSorted)));
- drag->setMimeData(mimeData);
- Qt::DropAction defDropAction = Qt::IgnoreAction;
- if (defaultDropAction() != Qt::IgnoreAction && (supportedActions & defaultDropAction()))
- {
- defDropAction = defaultDropAction();
- }
- else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove)
- {
- defDropAction = Qt::CopyAction;
- }
- drag->exec(supportedActions, defDropAction);
- }
-}
-
-QImage OutlinerTreeView::createDragImage(const QModelIndexList& indexList)
-{
- //generate a drag image of the item icon and text, normally done internally, and inaccessible
- QRect rect(0, 0, 0, 0);
- for (auto index : indexList)
- {
- if (index.column() != 0)
- {
- continue;
- }
- QRect itemRect = visualRect(index);
- rect.setHeight(rect.height() + itemRect.height());
- rect.setWidth(AZStd::GetMax(rect.width(), itemRect.width()));
- }
-
- QImage dragImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
-
- QPainter dragPainter(&dragImage);
- dragPainter.setCompositionMode(QPainter::CompositionMode_Source);
- dragPainter.fillRect(dragImage.rect(), Qt::transparent);
- dragPainter.setCompositionMode(QPainter::CompositionMode_SourceOver);
- dragPainter.setOpacity(0.35f);
- dragPainter.fillRect(rect, QColor("#222222"));
- dragPainter.setOpacity(1.0f);
-
- int imageY = 0;
- for (auto index : indexList)
- {
- if (index.column() != 0)
- {
- continue;
- }
-
- QRect itemRect = visualRect(index);
- dragPainter.drawPixmap(QPoint(0, imageY),
- model()->data(index, Qt::DecorationRole).value().pixmap(QSize(16, 16)));
- dragPainter.setPen(
- model()->data(index, Qt::ForegroundRole).value().color());
- dragPainter.setFont(
- font());
- dragPainter.drawText(QRect(20, imageY, rect.width() - 20, rect.height()),
- model()->data(index, Qt::DisplayRole).value());
- imageY += itemRect.height();
- }
-
- dragPainter.end();
- return dragImage;
+ StyledTreeView::StartCustomDrag(indexListSorted, supportedActions);
}
#include
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.hxx b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.hxx
index fe7a494be4..b597b70092 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.hxx
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerTreeView.hxx
@@ -15,7 +15,8 @@
#include
#include
-#include
+
+#include
#endif
#pragma once
@@ -31,7 +32,7 @@ class OutlinerTreeViewModel;
//! allow for dragging and dropping of entities from the outliner into the property editor
//! of other entities. If the selection updates instantly, this would never be possible.
class OutlinerTreeView
- : public QTreeView
+ : public AzQtComponents::StyledTreeView
{
Q_OBJECT;
public:
@@ -66,9 +67,7 @@ private:
void processQueuedMousePressedEvent(QMouseEvent* event);
- void startCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions);
-
- QImage createDragImage(const QModelIndexList& indexList);
+ void StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions) override;
void DrawLayerUI(QPainter* painter, const QRect& rect, const QModelIndex& index) const;
diff --git a/Code/Editor/ViewportTitleDlg.cpp b/Code/Editor/ViewportTitleDlg.cpp
index 530e11b01b..f5515b9c18 100644
--- a/Code/Editor/ViewportTitleDlg.cpp
+++ b/Code/Editor/ViewportTitleDlg.cpp
@@ -172,8 +172,7 @@ void CViewportTitleDlg::SetupCameraDropdownMenu()
cameraSpeedActionWidget->setDefaultWidget(cameraSpeedContainer);
// Save off the move speed here since setting up the combo box can cause it to update values in the background.
- const float cameraMoveSpeed = SandboxEditor::UsingNewCameraSystem() ? SandboxEditor::CameraTranslateSpeed() : gSettings.cameraMoveSpeed;
-
+ const float cameraMoveSpeed = SandboxEditor::CameraTranslateSpeed();
// Populate the presets in the ComboBox
for (float presetValue : m_speedPresetValues)
{
@@ -947,21 +946,13 @@ void CViewportTitleDlg::OnSpeedComboBoxEnter()
void CViewportTitleDlg::OnUpdateMoveSpeedText(const QString& text)
{
- if (SandboxEditor::UsingNewCameraSystem())
- {
- SandboxEditor::SetCameraTranslateSpeed(aznumeric_cast(Round(text.toDouble(), m_speedStep)));
- }
- else
- {
- gSettings.cameraMoveSpeed = aznumeric_cast(Round(text.toDouble(), m_speedStep));
- }
+ SandboxEditor::SetCameraTranslateSpeed(aznumeric_cast(Round(text.toDouble(), m_speedStep)));
}
void CViewportTitleDlg::CheckForCameraSpeedUpdate()
{
- if (const float currentCameraMoveSpeed =
- SandboxEditor::UsingNewCameraSystem() ? SandboxEditor::CameraTranslateSpeed() : gSettings.cameraMoveSpeed;
- currentCameraMoveSpeed != m_prevMoveSpeed && !m_cameraSpeed->lineEdit()->hasFocus())
+ const float currentCameraMoveSpeed = SandboxEditor::CameraTranslateSpeed();
+ if (currentCameraMoveSpeed != m_prevMoveSpeed && !m_cameraSpeed->lineEdit()->hasFocus())
{
m_prevMoveSpeed = currentCameraMoveSpeed;
SetSpeedComboBox(currentCameraMoveSpeed);
diff --git a/Code/Editor/editor_lib_files.cmake b/Code/Editor/editor_lib_files.cmake
index 4ad2ef23b9..4b80a5d461 100644
--- a/Code/Editor/editor_lib_files.cmake
+++ b/Code/Editor/editor_lib_files.cmake
@@ -799,8 +799,6 @@ set(FILES
EditorViewportCamera.h
ViewportManipulatorController.cpp
ViewportManipulatorController.h
- LegacyViewportCameraController.cpp
- LegacyViewportCameraController.h
TopRendererWnd.cpp
TopRendererWnd.h
ViewManager.cpp
diff --git a/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp b/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp
index df1549cc31..c89d12a8ae 100644
--- a/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.cpp
@@ -10,6 +10,17 @@
#include
+void OnVsyncIntervalChanged(uint32_t const& interval)
+{
+ AzFramework::WindowNotificationBus::Broadcast(
+ &AzFramework::WindowNotificationBus::Events::OnVsyncIntervalChanged, AZ::GetClamp(interval, 0u, 4u));
+}
+
+// NOTE: On change, broadcasts the new requested vsync interval to all windows.
+// The value of the vsync interval is constrained between 0 and 4
+// Vsync intervals greater than 1 are not currently supported on the Vulkan RHI (see #2061 for discussion)
+AZ_CVAR(uint32_t, vsync_interval, 1, OnVsyncIntervalChanged, AZ::ConsoleFunctorFlags::Null, "Set swapchain vsync interval");
+
namespace AzFramework
{
//////////////////////////////////////////////////////////////////////////
@@ -122,6 +133,16 @@ namespace AzFramework
return m_pimpl->GetDpiScaleFactor();
}
+ uint32_t NativeWindow::GetDisplayRefreshRate() const
+ {
+ return m_pimpl->GetDisplayRefreshRate();
+ }
+
+ uint32_t NativeWindow::GetSyncInterval() const
+ {
+ return vsync_interval;
+ }
+
/*static*/ bool NativeWindow::GetFullScreenStateOfDefaultWindow()
{
NativeWindowHandle defaultWindowHandle = nullptr;
@@ -240,4 +261,10 @@ namespace AzFramework
return 1.0f;
}
+ uint32_t NativeWindow::Implementation::GetDisplayRefreshRate() const
+ {
+ // Default to 60
+ return 60;
+ }
+
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h b/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h
index 52157d920f..7479b0d1e1 100644
--- a/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h
+++ b/Code/Framework/AzFramework/AzFramework/Windowing/NativeWindow.h
@@ -130,6 +130,8 @@ namespace AzFramework
bool CanToggleFullScreenState() const override;
void ToggleFullScreenState() override;
float GetDpiScaleFactor() const override;
+ uint32_t GetSyncInterval() const override;
+ uint32_t GetDisplayRefreshRate() const override;
//! Get the full screen state of the default window.
//! \return True if the default window is currently in full screen, false otherwise.
@@ -172,6 +174,7 @@ namespace AzFramework
virtual void SetFullScreenState(bool fullScreenState);
virtual bool CanToggleFullScreenState() const;
virtual float GetDpiScaleFactor() const;
+ virtual uint32_t GetDisplayRefreshRate() const;
protected:
uint32_t m_width = 0;
diff --git a/Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h b/Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h
index 776cd43787..d3bd0ce82c 100644
--- a/Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h
+++ b/Code/Framework/AzFramework/AzFramework/Windowing/WindowBus.h
@@ -74,6 +74,12 @@ namespace AzFramework
//! to a "standard" value of 96, the default for Windows in a DPI unaware setting. This can
//! be used to scale user interface elements to ensure legibility on high density displays.
virtual float GetDpiScaleFactor() const = 0;
+
+ //! Returns the sync interval which tells the drivers the number of v-blanks to synchronize with
+ virtual uint32_t GetSyncInterval() const = 0;
+
+ //! Returns the refresh rate of the main display
+ virtual uint32_t GetDisplayRefreshRate() const = 0;
};
using WindowRequestBus = AZ::EBus;
@@ -101,6 +107,9 @@ namespace AzFramework
//! This is called when vsync interval is changed.
virtual void OnVsyncIntervalChanged(uint32_t interval) { AZ_UNUSED(interval); };
+
+ //! This is called if the main display's refresh rate changes
+ virtual void OnRefreshRateChanged([[maybe_unused]] uint32_t refreshRate) {}
};
using WindowNotificationBus = AZ::EBus;
diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp b/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp
index 8da63e9a5e..e655435011 100644
--- a/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp
+++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp
@@ -25,7 +25,7 @@ namespace AzFramework
const WindowGeometry& geometry,
const WindowStyleMasks& styleMasks) override;
NativeWindowHandle GetWindowHandle() const override;
-
+ uint32_t GetDisplayRefreshRate() const override;
private:
ANativeWindow* m_nativeWindow = nullptr;
};
@@ -55,4 +55,9 @@ namespace AzFramework
return reinterpret_cast(m_nativeWindow);
}
+ uint32_t NativeWindowImpl_Android::GetDisplayRefreshRate() const
+ {
+ // Using 60 for now until proper support is added
+ return 60;
+ }
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp
index 5d738f8bdd..0ab1281eda 100644
--- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp
+++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp
@@ -23,6 +23,7 @@ namespace AzFramework
const WindowGeometry& geometry,
const WindowStyleMasks& styleMasks) override;
NativeWindowHandle GetWindowHandle() const override;
+ uint32_t GetDisplayRefreshRate() const override;
};
NativeWindow::Implementation* NativeWindow::Implementation::Create()
@@ -44,4 +45,9 @@ namespace AzFramework
return nullptr;
}
+ uint32_t NativeWindowImpl_Linux::GetDisplayRefreshRate() const
+ {
+ //Using 60 for now until proper support is added
+ return 60;
+ }
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Windowing/NativeWindow_Mac.mm b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Windowing/NativeWindow_Mac.mm
index 6e6b801e79..2f9e3ab934 100644
--- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Windowing/NativeWindow_Mac.mm
+++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Windowing/NativeWindow_Mac.mm
@@ -34,12 +34,14 @@ namespace AzFramework
bool GetFullScreenState() const override;
void SetFullScreenState(bool fullScreenState) override;
bool CanToggleFullScreenState() const override { return true; }
+ uint32_t GetMainDisplayRefreshRate() const override;
private:
static NSWindowStyleMask ConvertToNSWindowStyleMask(const WindowStyleMasks& styleMasks);
NSWindow* m_nativeWindow;
NSString* m_windowTitle;
+ uint32_t m_mainDisplayRefreshRate = 0;
};
NativeWindow::Implementation* NativeWindow::Implementation::Create()
@@ -76,6 +78,17 @@ namespace AzFramework
// Make the window active
[m_nativeWindow makeKeyAndOrderFront:nil];
m_nativeWindow.title = m_windowTitle;
+
+ CGDirectDisplayID display = CGMainDisplayID();
+ CGDisplayModeRef currentMode = CGDisplayCopyDisplayMode(display);
+ m_mainDisplayRefreshRate = CGDisplayModeGetRefreshRate(currentMode);
+
+ // Assume 60hz if 0 is returned.
+ // This can happen on OSX. In future we can hopefully use maximumFramesPerSecond which wont have this issue
+ if (m_mainDisplayRefreshRate == 0)
+ {
+ m_mainDisplayRefreshRate = 60;
+ }
}
NativeWindowHandle NativeWindowImpl_Darwin::GetWindowHandle() const
@@ -128,4 +141,9 @@ namespace AzFramework
const NSWindowStyleMask defaultMask = NSWindowStyleMaskResizable | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable;
return nativeMask ? nativeMask : defaultMask;
}
+
+ uint32_t NativeWindowImpl_Darwin::GetMainDisplayRefreshRate() const
+ {
+ return m_mainDisplayRefreshRate;
+ }
} // namespace AzFramework
diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Windows.cpp b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Windows.cpp
index f3112ab89c..650dd14a1c 100644
--- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Windows.cpp
+++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Windows.cpp
@@ -117,9 +117,11 @@ namespace AzFramework
, m_hasFocus(false)
, m_hasTextEntryStarted(false)
{
+ static const char* s_keyboardCountEnvironmentVarName = "InputDeviceKeyboardInstanceCount";
+ s_instanceCount = AZ::Environment::FindVariable(s_keyboardCountEnvironmentVarName);
if (!s_instanceCount)
{
- s_instanceCount = AZ::Environment::CreateVariable("InputDeviceKeyboardInstanceCount", 1);
+ s_instanceCount = AZ::Environment::CreateVariable(s_keyboardCountEnvironmentVarName, 1);
// Register for raw keyboard input
RAWINPUTDEVICE rawInputDevice;
diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Mouse/InputDeviceMouse_Windows.cpp b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Mouse/InputDeviceMouse_Windows.cpp
index 464f49d620..d5d313eaab 100644
--- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Mouse/InputDeviceMouse_Windows.cpp
+++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Input/Devices/Mouse/InputDeviceMouse_Windows.cpp
@@ -138,9 +138,11 @@ namespace AzFramework
{
memset(&m_lastClientRect, 0, sizeof(m_lastClientRect));
+ static const char* s_mouseCountEnvironmentVarName = "InputDeviceMouseInstanceCount";
+ s_instanceCount = AZ::Environment::FindVariable(s_mouseCountEnvironmentVarName);
if (!s_instanceCount)
{
- s_instanceCount = AZ::Environment::CreateVariable("InputDeviceMouseInstanceCount", 1);
+ s_instanceCount = AZ::Environment::CreateVariable(s_mouseCountEnvironmentVarName, 1);
// Register for raw mouse input
RAWINPUTDEVICE rawInputDevice;
diff --git a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp
index 22a293891c..2c1d97dcf6 100644
--- a/Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp
+++ b/Code/Framework/AzFramework/Platform/Windows/AzFramework/Windowing/NativeWindow_Windows.cpp
@@ -37,6 +37,7 @@ namespace AzFramework
void SetFullScreenState(bool fullScreenState) override;
bool CanToggleFullScreenState() const override { return true; }
float GetDpiScaleFactor() const override;
+ uint32_t GetDisplayRefreshRate() const override;
private:
static DWORD ConvertToWin32WindowStyleMask(const WindowStyleMasks& styleMasks);
@@ -56,6 +57,7 @@ namespace AzFramework
using GetDpiForWindowType = UINT(HWND hwnd);
GetDpiForWindowType* m_getDpiFunction = nullptr;
+ uint32_t m_mainDisplayRefreshRate = 0;
};
const wchar_t* NativeWindowImpl_Win32::s_defaultClassName = L"O3DEWin32Class";
@@ -144,6 +146,10 @@ namespace AzFramework
{
SetWindowLongPtr(m_win32Handle, GWLP_USERDATA, reinterpret_cast(this));
}
+
+ DEVMODE DisplayConfig;
+ EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DisplayConfig);
+ m_mainDisplayRefreshRate = DisplayConfig.dmDisplayFrequency;
}
void NativeWindowImpl_Win32::Activate()
@@ -263,6 +269,15 @@ namespace AzFramework
WindowNotificationBus::Event(nativeWindowImpl->GetWindowHandle(), &WindowNotificationBus::Events::OnDpiScaleFactorChanged, newScaleFactor);
break;
}
+ case WM_WINDOWPOSCHANGED:
+ {
+ DEVMODE DisplayConfig;
+ EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DisplayConfig);
+ uint32_t refreshRate = DisplayConfig.dmDisplayFrequency;
+ WindowNotificationBus::Event(
+ nativeWindowImpl->GetWindowHandle(), &WindowNotificationBus::Events::OnRefreshRateChanged, refreshRate);
+ break;
+ }
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
@@ -367,6 +382,11 @@ namespace AzFramework
return aznumeric_cast(dotsPerInch) / aznumeric_cast(defaultDotsPerInch);
}
+ uint32_t NativeWindowImpl_Win32::GetDisplayRefreshRate() const
+ {
+ return m_mainDisplayRefreshRate;
+ }
+
void NativeWindowImpl_Win32::EnterBorderlessWindowFullScreen()
{
if (m_isInBorderlessWindowFullScreenState)
diff --git a/Code/Framework/AzFramework/Platform/iOS/AzFramework/Windowing/NativeWindow_ios.mm b/Code/Framework/AzFramework/Platform/iOS/AzFramework/Windowing/NativeWindow_ios.mm
index b14db37d23..3c829ec055 100644
--- a/Code/Framework/AzFramework/Platform/iOS/AzFramework/Windowing/NativeWindow_ios.mm
+++ b/Code/Framework/AzFramework/Platform/iOS/AzFramework/Windowing/NativeWindow_ios.mm
@@ -27,9 +27,11 @@ namespace AzFramework
const WindowGeometry& geometry,
const WindowStyleMasks& styleMasks) override;
NativeWindowHandle GetWindowHandle() const override;
-
+ uint32_t GetMainDisplayRefreshRate() const override;
+
private:
UIWindow* m_nativeWindow;
+ uint32_t m_mainDisplayRefreshRate = 0;
};
NativeWindow::Implementation* NativeWindow::Implementation::Create()
@@ -56,6 +58,7 @@ namespace AzFramework
m_width = geometry.m_width;
m_height = geometry.m_height;
+ m_mainDisplayRefreshRate = [[UIScreen mainScreen] maximumFramesPerSecond];
}
NativeWindowHandle NativeWindowImpl_Ios::GetWindowHandle() const
@@ -63,5 +66,9 @@ namespace AzFramework
return m_nativeWindow;
}
+ uint32_t NativeWindowImpl_Ios::GetMainDisplayRefreshRate() const
+ {
+ return m_mainDisplayRefreshRate;
+ }
} // namespace AzFramework
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.cpp
index 3d0b78ece7..e4d10a321d 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.cpp
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.cpp
@@ -8,10 +8,13 @@
#include
+#include
#include
#include
#include
+#include
+
#include
#include
#include
@@ -252,5 +255,109 @@ namespace AzQtComponents
return qobject_cast(widget) && !qobject_cast(widget);
}
+ StyledTreeView::StyledTreeView(QWidget* parent)
+ : QTreeView(parent)
+ {
+ }
+
+ void StyledTreeView::startDrag(Qt::DropActions supportedActions)
+ {
+ if (!selectionModel()->selectedIndexes().empty())
+ {
+ StartCustomDrag(selectionModel()->selectedIndexes(), supportedActions);
+ }
+ }
+
+ void StyledTreeView::StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions)
+ {
+ StartCustomDragInternal(this, indexList, supportedActions);
+ }
+
+ void StyledTreeView::StartCustomDragInternal(QAbstractItemView* itemView, const QModelIndexList& indexList, Qt::DropActions supportedActions)
+ {
+ QMimeData* mimeData = itemView->model()->mimeData(indexList);
+ if (mimeData)
+ {
+ QDrag* drag = new QDrag(itemView);
+ drag->setPixmap(QPixmap::fromImage(CreateDragImage(itemView, indexList)));
+ drag->setMimeData(mimeData);
+
+ Qt::DropAction defDropAction = Qt::IgnoreAction;
+ if (itemView->defaultDropAction() != Qt::IgnoreAction && (supportedActions & itemView->defaultDropAction()))
+ {
+ defDropAction = itemView->defaultDropAction();
+ }
+ else if (supportedActions & Qt::CopyAction && itemView->dragDropMode() != QAbstractItemView::InternalMove)
+ {
+ defDropAction = Qt::CopyAction;
+ }
+
+ drag->exec(supportedActions, defDropAction);
+ }
+ }
+
+ QImage StyledTreeView::CreateDragImage(QAbstractItemView* itemView, const QModelIndexList& indexList)
+ {
+ // Generate a drag image of the item icon and text, normally done internally, and inaccessible
+ QRect rect(0, 0, 0, 0);
+ for (const auto& index : indexList)
+ {
+ if (index.column() != 0)
+ {
+ continue;
+ }
+
+ QRect itemRect = itemView->visualRect(index);
+ rect.setHeight(rect.height() + itemRect.height());
+ rect.setWidth(AZStd::GetMax(rect.width(), itemRect.width()));
+ }
+
+ QImage dragImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
+
+ QPainter dragPainter(&dragImage);
+ dragPainter.setCompositionMode(QPainter::CompositionMode_Source);
+ dragPainter.fillRect(dragImage.rect(), Qt::transparent);
+ dragPainter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+ dragPainter.setOpacity(0.35f);
+ dragPainter.fillRect(rect, QColor("#222222"));
+ dragPainter.setOpacity(1.0f);
+
+ int imageY = 0;
+ for (const auto& index : indexList)
+ {
+ if (index.column() != 0)
+ {
+ continue;
+ }
+
+ QRect itemRect = itemView->visualRect(index);
+ dragPainter.drawPixmap(QPoint(0, imageY),
+ itemView->model()->data(index, Qt::DecorationRole).value().pixmap(QSize(16, 16)));
+ dragPainter.setPen(
+ itemView->model()->data(index, Qt::ForegroundRole).value().color());
+ dragPainter.setFont(
+ itemView->font());
+ dragPainter.drawText(QRect(20, imageY, rect.width() - 20, rect.height()),
+ itemView->model()->data(index, Qt::DisplayRole).value());
+ imageY += itemRect.height();
+ }
+
+ dragPainter.end();
+ return dragImage;
+ }
+
+ StyledTreeWidget::StyledTreeWidget(QWidget* parent)
+ : QTreeWidget(parent)
+ {
+ }
+
+ void StyledTreeWidget::startDrag(Qt::DropActions supportedActions)
+ {
+ if (!selectionModel()->selectedIndexes().empty())
+ {
+ StyledTreeView::StartCustomDragInternal(this, selectionModel()->selectedIndexes(), supportedActions);
+ }
+ }
+
} // namespace AzQtComponents
#include
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.h
index 8fdcc24a8b..7510819e23 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.h
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TreeView.h
@@ -9,8 +9,11 @@
#pragma once
#if !defined(Q_MOC_RUN)
+#include
#include
#include
+
+#include
#endif
namespace AzQtComponents
@@ -68,4 +71,46 @@ namespace AzQtComponents
void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};
+ //! For most of the custom QTreeView styling, we override in AzQtComponents::Style class,
+ //! but there are some cases (e.g. drag/drop) that can only be overriden by an actual
+ //! subclass of the QTreeView
+ class AZ_QT_COMPONENTS_API StyledTreeView
+ : public QTreeView
+ {
+ Q_OBJECT
+
+ public:
+ AZ_CLASS_ALLOCATOR(StyledTreeView, AZ::SystemAllocator, 0);
+
+ explicit StyledTreeView(QWidget* parent = nullptr);
+
+ //! NOTE: QTreeWidget derives from QTreeView, but because we need a custom dervied class
+ //! of QTreeView, then we can't inherit our custom drag methods in our custom derived
+ //! class of QTreeWidget, so these functions are made static so they can be shared
+ static void StartCustomDragInternal(QAbstractItemView* itemView, const QModelIndexList& indexList, Qt::DropActions supportedActions);
+ static QImage CreateDragImage(QAbstractItemView* itemView, const QModelIndexList& indexList);
+
+ protected:
+ void startDrag(Qt::DropActions supportedActions) override;
+
+ virtual void StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions);
+ };
+
+ //! For most of the custom QTreeWidget styling, we override in AzQtComponents::Style class,
+ //! but there are some cases (e.g. drag/drop) that can only be overriden by an actual
+ //! subclass of the QTreeWidget.
+ class AZ_QT_COMPONENTS_API StyledTreeWidget
+ : public QTreeWidget
+ {
+ Q_OBJECT
+
+ public:
+ AZ_CLASS_ALLOCATOR(StyledTreeWidget, AZ::SystemAllocator, 0);
+
+ explicit StyledTreeWidget(QWidget* parent = nullptr);
+
+ protected:
+ void startDrag(Qt::DropActions supportedActions) override;
+ };
+
} // namespace AzQtComponents
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp
index eaee196c09..0549c600d3 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.cpp
@@ -27,7 +27,7 @@
namespace AzToolsFramework
{
EntityOutlinerTreeView::EntityOutlinerTreeView(QWidget* pParent)
- : QTreeView(pParent)
+ : AzQtComponents::StyledTreeView(pParent)
, m_queuedMouseEvent(nullptr)
, m_draggingUnselectedItem(false)
{
@@ -144,16 +144,12 @@ namespace AzToolsFramework
if (!selectionModel()->isSelected(index))
{
- startCustomDrag({ index }, supportedActions);
+ StartCustomDrag({ index }, supportedActions);
return;
}
}
- if (!selectionModel()->selectedIndexes().empty())
- {
- startCustomDrag(selectionModel()->selectedIndexes(), supportedActions);
- return;
- }
+ StyledTreeView::startDrag(supportedActions);
}
void EntityOutlinerTreeView::dragMoveEvent(QDragMoveEvent* event)
@@ -243,14 +239,14 @@ namespace AzToolsFramework
QTreeView::mousePressEvent(&mousePressedEvent);
}
- void EntityOutlinerTreeView::startCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions)
+ void EntityOutlinerTreeView::StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions)
{
m_draggingUnselectedItem = true;
//sort by container entity depth and order in hierarchy for proper drag image and drop order
QModelIndexList indexListSorted = indexList;
AZStd::unordered_map> locations;
- for (auto index : indexListSorted)
+ for (const auto& index : indexListSorted)
{
AZ::EntityId entityId(index.data(EntityOutlinerListModel::EntityIdRole).value());
AzToolsFramework::GetEntityLocationInHierarchy(entityId, locations[entityId]);
@@ -263,76 +259,8 @@ namespace AzToolsFramework
return AZStd::lexicographical_compare(locationsE1.begin(), locationsE1.end(), locationsE2.begin(), locationsE2.end());
});
- //get the data for the unselected item(s)
- QMimeData* mimeData = model()->mimeData(indexListSorted);
- if (mimeData)
- {
- //initiate drag/drop for the item
- QDrag* drag = new QDrag(this);
- drag->setPixmap(QPixmap::fromImage(createDragImage(indexListSorted)));
- drag->setMimeData(mimeData);
- Qt::DropAction defDropAction = Qt::IgnoreAction;
- if (defaultDropAction() != Qt::IgnoreAction && (supportedActions & defaultDropAction()))
- {
- defDropAction = defaultDropAction();
- }
- else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove)
- {
- defDropAction = Qt::CopyAction;
- }
- drag->exec(supportedActions, defDropAction);
- }
+ StyledTreeView::StartCustomDrag(indexListSorted, supportedActions);
}
-
- QImage EntityOutlinerTreeView::createDragImage(const QModelIndexList& indexList)
- {
- //generate a drag image of the item icon and text, normally done internally, and inaccessible
- QRect rect(0, 0, 0, 0);
- for (auto index : indexList)
- {
- if (index.column() != 0)
- {
- continue;
- }
- QRect itemRect = visualRect(index);
- rect.setHeight(rect.height() + itemRect.height());
- rect.setWidth(AZStd::GetMax(rect.width(), itemRect.width()));
- }
-
- QImage dragImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
-
- QPainter dragPainter(&dragImage);
- dragPainter.setCompositionMode(QPainter::CompositionMode_Source);
- dragPainter.fillRect(dragImage.rect(), Qt::transparent);
- dragPainter.setCompositionMode(QPainter::CompositionMode_SourceOver);
- dragPainter.setOpacity(0.35f);
- dragPainter.fillRect(rect, QColor("#222222"));
- dragPainter.setOpacity(1.0f);
-
- int imageY = 0;
- for (auto index : indexList)
- {
- if (index.column() != 0)
- {
- continue;
- }
-
- QRect itemRect = visualRect(index);
- dragPainter.drawPixmap(QPoint(0, imageY),
- model()->data(index, Qt::DecorationRole).value().pixmap(QSize(16, 16)));
- dragPainter.setPen(
- model()->data(index, Qt::ForegroundRole).value().color());
- dragPainter.setFont(
- font());
- dragPainter.drawText(QRect(20, imageY, rect.width() - 20, rect.height()),
- model()->data(index, Qt::DisplayRole).value());
- imageY += itemRect.height();
- }
-
- dragPainter.end();
- return dragImage;
- }
-
}
#include
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.hxx
index 89471de228..66cd082407 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.hxx
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerTreeView.hxx
@@ -14,7 +14,8 @@
#include
#include
-#include
+
+#include
#endif
#pragma once
@@ -33,7 +34,7 @@ namespace AzToolsFramework
//! allow for dragging and dropping of entities from the outliner into the property editor
//! of other entities. If the selection updates instantly, this would never be possible.
class EntityOutlinerTreeView
- : public QTreeView
+ : public AzQtComponents::StyledTreeView
{
Q_OBJECT;
public:
@@ -68,9 +69,7 @@ namespace AzToolsFramework
void processQueuedMousePressedEvent(QMouseEvent* event);
- void startCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions);
-
- QImage createDragImage(const QModelIndexList& indexList);
+ void StartCustomDrag(const QModelIndexList& indexList, Qt::DropActions supportedActions) override;
void PaintBranchBackground(QPainter* painter, const QRect& rect, const QModelIndex& index) const;
diff --git a/Code/Tools/AzTestRunner/src/main.cpp b/Code/Tools/AzTestRunner/src/main.cpp
index 48ba527a45..0874efeff2 100644
--- a/Code/Tools/AzTestRunner/src/main.cpp
+++ b/Code/Tools/AzTestRunner/src/main.cpp
@@ -121,12 +121,6 @@ namespace AzTestRunner
{
const char* cwd = AzTestRunner::get_current_working_directory();
std::cout << "cwd = " << cwd << std::endl;
-
- for (int i = 0; i < argc; i++)
- {
- std::cout << "arg[" << i << "] " << argv[i] << std::endl;
- }
-
std::cout << "LIB: " << lib << std::endl;
}
@@ -227,6 +221,12 @@ namespace AzTestRunner
testMainFunction.reset();
}
+ // Construct a retry command if the test fails
+ if (result != 0)
+ {
+ std::cout << "Retry command: " << std::endl << argv[0] << " " << lib << " " << symbol << std::endl;
+ }
+
// unload and reset the module here, because it needs to release resources that were used / activated in
// system allocator / etc.
module.reset();
diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp
index a9086a0c2b..4febb65782 100644
--- a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp
@@ -39,7 +39,7 @@ namespace O3DE::ProjectManager
NewProjectSettingsScreen::NewProjectSettingsScreen(QWidget* parent)
: ProjectSettingsScreen(parent)
{
- const QString defaultName{ "NewProject" };
+ const QString defaultName = GetDefaultProjectName();
const QString defaultPath = QDir::toNativeSeparators(GetDefaultProjectPath() + "/" + defaultName);
m_projectName->lineEdit()->setText(defaultName);
@@ -162,6 +162,17 @@ namespace O3DE::ProjectManager
return defaultPath;
}
+ QString NewProjectSettingsScreen::GetDefaultProjectName()
+ {
+ return "NewProject";
+ }
+
+ QString NewProjectSettingsScreen::GetProjectAutoPath()
+ {
+ const QString projectName = m_projectName->lineEdit()->text();
+ return QDir::toNativeSeparators(GetDefaultProjectPath() + "/" + projectName);
+ }
+
ProjectManagerScreen NewProjectSettingsScreen::GetScreenEnum()
{
return ProjectManagerScreen::NewProjectSettings;
@@ -260,4 +271,22 @@ namespace O3DE::ProjectManager
m_projectTemplateButtonGroup->blockSignals(false);
}
}
+ void NewProjectSettingsScreen::OnProjectNameUpdated()
+ {
+ if (ValidateProjectName() && !m_userChangedProjectPath)
+ {
+ m_projectPath->setText(GetProjectAutoPath());
+ }
+ }
+
+ void NewProjectSettingsScreen::OnProjectPathUpdated()
+ {
+ const QString defaultPath = QDir::toNativeSeparators(GetDefaultProjectPath() + "/" + GetDefaultProjectName());
+ const QString autoPath = GetProjectAutoPath();
+ const QString path = m_projectPath->lineEdit()->text();
+ m_userChangedProjectPath = path != defaultPath && path != autoPath;
+
+ ValidateProjectPath();
+ }
+
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h
index ebe40de05c..42c47cb1ff 100644
--- a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h
+++ b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.h
@@ -40,8 +40,14 @@ namespace O3DE::ProjectManager
signals:
void OnTemplateSelectionChanged(int oldIndex, int newIndex);
+ protected:
+ void OnProjectNameUpdated() override;
+ void OnProjectPathUpdated() override;
+
private:
+ QString GetDefaultProjectName();
QString GetDefaultProjectPath();
+ QString GetProjectAutoPath();
QFrame* CreateTemplateDetails(int margin);
void UpdateTemplateDetails(const ProjectTemplateInfo& templateInfo);
@@ -51,6 +57,7 @@ namespace O3DE::ProjectManager
TagContainerWidget* m_templateIncludedGems;
QVector m_templates;
int m_selectedTemplateIndex = -1;
+ bool m_userChangedProjectPath = false;
inline constexpr static int s_spacerSize = 20;
inline constexpr static int s_templateDetailsContentMargin = 20;
diff --git a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp
index 4c79117d96..88ae3d6319 100644
--- a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp
@@ -40,12 +40,11 @@ namespace O3DE::ProjectManager
m_verticalLayout->setAlignment(Qt::AlignTop);
m_projectName = new FormLineEditWidget(tr("Project name"), "", this);
- connect(m_projectName->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::ValidateProjectName);
+ connect(m_projectName->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::OnProjectNameUpdated);
m_verticalLayout->addWidget(m_projectName);
m_projectPath = new FormFolderBrowseEditWidget(tr("Project Location"), "", this);
- m_projectPath->lineEdit()->setReadOnly(true);
- connect(m_projectPath->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::Validate);
+ connect(m_projectPath->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::OnProjectPathUpdated);
m_verticalLayout->addWidget(m_projectPath);
projectSettingsFrame->setLayout(m_verticalLayout);
@@ -110,28 +109,36 @@ namespace O3DE::ProjectManager
m_projectName->setErrorLabelVisible(!projectNameIsValid);
return projectNameIsValid;
}
+
bool ProjectSettingsScreen::ValidateProjectPath()
{
bool projectPathIsValid = true;
- if (m_projectPath->lineEdit()->text().isEmpty())
+ QDir path(m_projectPath->lineEdit()->text());
+ if (!path.isAbsolute())
{
projectPathIsValid = false;
- m_projectPath->setErrorLabelText(tr("Please provide a valid location."));
+ m_projectPath->setErrorLabelText(tr("Please provide an absolute path for the project location."));
}
- else
+ else if (path.exists() && !path.isEmpty())
{
- QDir path(m_projectPath->lineEdit()->text());
- if (path.exists() && !path.isEmpty())
- {
- projectPathIsValid = false;
- m_projectPath->setErrorLabelText(tr("This folder exists and isn't empty. Please choose a different location."));
- }
+ projectPathIsValid = false;
+ m_projectPath->setErrorLabelText(tr("This folder exists and isn't empty. Please choose a different location."));
}
m_projectPath->setErrorLabelVisible(!projectPathIsValid);
return projectPathIsValid;
}
+ void ProjectSettingsScreen::OnProjectNameUpdated()
+ {
+ ValidateProjectName();
+ }
+
+ void ProjectSettingsScreen::OnProjectPathUpdated()
+ {
+ Validate();
+ }
+
bool ProjectSettingsScreen::Validate()
{
return ValidateProjectName() && ValidateProjectPath();
diff --git a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h
index b2544660e8..752e286ce1 100644
--- a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h
+++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h
@@ -33,10 +33,13 @@ namespace O3DE::ProjectManager
virtual bool Validate();
protected slots:
- virtual bool ValidateProjectName();
- virtual bool ValidateProjectPath();
+ virtual void OnProjectNameUpdated();
+ virtual void OnProjectPathUpdated();
protected:
+ bool ValidateProjectName();
+ virtual bool ValidateProjectPath();
+
QString GetDefaultProjectPath();
QHBoxLayout* m_horizontalLayout;
diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp
index 8e9337bcae..6f7f7e1bed 100644
--- a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp
@@ -108,10 +108,11 @@ namespace O3DE::ProjectManager
bool UpdateProjectSettingsScreen::ValidateProjectPath()
{
bool projectPathIsValid = true;
- if (m_projectPath->lineEdit()->text().isEmpty())
+ QDir path(m_projectPath->lineEdit()->text());
+ if (!path.isAbsolute())
{
projectPathIsValid = false;
- m_projectPath->setErrorLabelText(tr("Please provide a valid location."));
+ m_projectPath->setErrorLabelText(tr("Please provide an absolute path for the project location."));
}
m_projectPath->setErrorLabelVisible(!projectPathIsValid);
diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py
index 7e058e6a4e..54d0a29fea 100755
--- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py
+++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py
@@ -105,6 +105,8 @@ class ViewEditController(QObject):
def _create_new_config_file(self) -> None:
configuration: Configuration = self._configuration_manager.configuration
+ self._set_default_region(configuration)
+
try:
new_config_file_path: str = file_utils.join_path(
configuration.config_directory, constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_NAME)
@@ -117,6 +119,15 @@ class ViewEditController(QObject):
self._rescan_config_directory()
+ def _set_default_region(self, configuration: Configuration):
+ default_region = configuration.region
+ if not default_region or default_region == 'aws-global':
+ self.set_notification_frame_text_sender.emit(
+ notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE)
+ logger.warning(notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE)
+
+ configuration.region = constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_REGION
+
def _delete_table_row(self) -> None:
indices: List[QModelIndex] = self._table_view.selectedIndexes()
self._proxy_model.remove_resources(indices)
diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/constants.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/constants.py
index 857925499b..94846fc6b5 100755
--- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/constants.py
+++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/constants.py
@@ -24,6 +24,7 @@ AWS_RESOURCE_REGIONS: List[str] = ["us-east-2", "us-east-1", "us-west-1", "us-we
# Default client&server config file name
RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX: str = "_aws_resource_mappings.json"
RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_NAME: str = "default" + RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX
+RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_REGION: str = "us-east-1"
# View related constants
SEARCH_TYPED_RESOURCES_VERSION: str = "Import AWS Resources"
diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py
index 4fbff42aba..ecd6d8282c 100755
--- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py
+++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py
@@ -5,6 +5,8 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
+from model import constants
+
NOTIFICATION_LOADING_MESSAGE: str = "Loading..."
ERROR_PAGE_OK_TEXT: str = "OK"
@@ -21,6 +23,12 @@ VIEW_EDIT_PAGE_RESCAN_TEXT: str = "Rescan"
VIEW_EDIT_PAGE_CONFIG_FILES_PLACEHOLDER_TEXT: str = "Found {} config files"
VIEW_EDIT_PAGE_SEARCH_PLACEHOLDER_TEXT: str = "Search by Key Name, Type, Name/ID, Account ID or Region"
VIEW_EDIT_PAGE_IMPORT_RESOURCES_PLACEHOLDER_TEXT: str = "Import Additional Resources"
+VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE: str = \
+ f"Resource mapping file {constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_NAME} is created"\
+ f" with {constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_REGION} as the default region. "\
+ f"See "\
+ f"documentation "\
+ f"for configuring the AWS credentials and default region."
VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE: str = "Please select the Config file you would like to view and modify..."
VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE: str = \
diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py
index d76ae12940..f854d2cd68 100755
--- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py
+++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py
@@ -482,6 +482,7 @@ class TestViewEditController(TestCase):
mock_json_utils.create_empty_resource_mapping_file.assert_called_once()
mock_file_utils.find_files_with_suffix_under_directory.assert_called_once()
self._mocked_view_edit_page.set_config_files.assert_called_with(expected_config_files)
+ self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once()
@patch("controller.view_edit_controller.file_utils")
@patch("controller.view_edit_controller.json_utils")
@@ -496,7 +497,7 @@ class TestViewEditController(TestCase):
mock_file_utils.join_path.assert_called_once()
mock_json_utils.create_empty_resource_mapping_file.assert_called_once()
mock_file_utils.find_files_with_suffix_under_directory.assert_not_called()
- self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once()
+ assert len(self._test_view_edit_controller.set_notification_frame_text_sender.emit.mock_calls) == 2
@patch("controller.view_edit_controller.file_utils")
def test_page_rescan_button_post_notification_when_find_files_throw_exception(
diff --git a/Gems/AWSGameLift/Code/AWSGameLiftClient/Source/AWSGameLiftClientModule.cpp b/Gems/AWSGameLift/Code/AWSGameLiftClient/Source/AWSGameLiftClientModule.cpp
index 4155aaca80..8a9ea5003a 100644
--- a/Gems/AWSGameLift/Code/AWSGameLiftClient/Source/AWSGameLiftClientModule.cpp
+++ b/Gems/AWSGameLift/Code/AWSGameLiftClient/Source/AWSGameLiftClientModule.cpp
@@ -42,4 +42,4 @@ namespace AWSGameLift
};
}// namespace AWSGameLift
-AZ_DECLARE_MODULE_CLASS(Gem_AWSGameLift_Client, AWSGameLift::AWSGameLiftClientModule)
+AZ_DECLARE_MODULE_CLASS(Gem_AWSGameLift_Clients, AWSGameLift::AWSGameLiftClientModule)
diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerModule.cpp b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerModule.cpp
index dfdf541049..9feacafec5 100644
--- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerModule.cpp
+++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerModule.cpp
@@ -42,4 +42,4 @@ namespace AWSGameLift
};
}// namespace AWSGameLift
-AZ_DECLARE_MODULE_CLASS(Gem_AWSGameLift_Server, AWSGameLift::AWSGameLiftServerModule)
+AZ_DECLARE_MODULE_CLASS(Gem_AWSGameLift_Servers, AWSGameLift::AWSGameLiftServerModule)
diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/Device.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/Device.h
index 4232658980..e7ad98c074 100644
--- a/Gems/Atom/RHI/Code/Include/Atom/RHI/Device.h
+++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/Device.h
@@ -125,7 +125,6 @@ namespace AZ
Format GetNearestSupportedFormat(Format requestedFormat, FormatCapabilities requestedCapabilities) const;
//! Small API to support getting supported/working swapchain formats for a window.
- //! [GFX TODO]ATOM-1125] [RHI] Device::GetValidSwapChainImageFormats()
//! Returns the set of supported formats for swapchain images.
virtual AZStd::vector GetValidSwapChainImageFormats(const WindowHandle& windowHandle) const;
diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermath_Windows.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermath_Windows.cpp
index 4ee35b7675..199efbb139 100644
--- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermath_Windows.cpp
+++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/NsightAftermath_Windows.cpp
@@ -85,7 +85,7 @@ namespace Aftermath
#if defined(USE_NSIGHT_AFTERMATH)
AZStd::vector cntxtHandles = static_cast(crashTracker)->GetContextHandles();
GFSDK_Aftermath_ContextData* outContextData = new GFSDK_Aftermath_ContextData[cntxtHandles.size()];
- GFSDK_Aftermath_Result result = GFSDK_Aftermath_GetData(cntxtHandles.size(), cntxtHandles.data(), outContextData);
+ GFSDK_Aftermath_Result result = GFSDK_Aftermath_GetData(static_cast(cntxtHandles.size()), cntxtHandles.data(), outContextData);
AssertOnError(result);
for (int i = 0; i < cntxtHandles.size(); i++)
{
diff --git a/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/RHI/Conversions_Mac.h b/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/RHI/Conversions_Mac.h
index cb1f48cfea..a4dc13a6f1 100644
--- a/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/RHI/Conversions_Mac.h
+++ b/Gems/Atom/RHI/Metal/Code/Source/Platform/Mac/RHI/Conversions_Mac.h
@@ -5,6 +5,8 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
+#pragma once
+
namespace AZ
{
namespace Metal
diff --git a/Gems/Atom/RHI/Metal/Code/Source/Platform/iOS/RHI/Conversions_iOS.h b/Gems/Atom/RHI/Metal/Code/Source/Platform/iOS/RHI/Conversions_iOS.h
index cb1f48cfea..a4dc13a6f1 100644
--- a/Gems/Atom/RHI/Metal/Code/Source/Platform/iOS/RHI/Conversions_iOS.h
+++ b/Gems/Atom/RHI/Metal/Code/Source/Platform/iOS/RHI/Conversions_iOS.h
@@ -5,6 +5,8 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
+#pragma once
+
namespace AZ
{
namespace Metal
diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/Device.cpp
index dbd2204e93..5591bcc843 100644
--- a/Gems/Atom/RHI/Metal/Code/Source/RHI/Device.cpp
+++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/Device.cpp
@@ -77,7 +77,6 @@ namespace AZ
m_samplerCache = [[NSCache alloc]init];
[m_samplerCache setName:@"SamplerCache"];
-
return RHI::ResultCode::Success;
}
diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.cpp
index 638f9bd184..df0961564d 100644
--- a/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.cpp
+++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.cpp
@@ -74,21 +74,16 @@ namespace AZ
AddSubView();
}
- m_refreshRate = Platform::GetRefreshRate();
-
- //Assume 60hz if 0 is returned.
- //Internal OSX displays have 'flexible' refresh rates, with a max of 60Hz - but report 0hz
- if (m_refreshRate < 0.1f)
- {
- m_refreshRate = 60.0f;
- }
-
m_drawables.resize(descriptor.m_dimensions.m_imageCount);
if (nativeDimensions)
{
*nativeDimensions = descriptor.m_dimensions;
}
+
+ AzFramework::WindowRequestBus::EventResult(
+ m_refreshRate, m_nativeWindow, &AzFramework::WindowRequestBus::Events::GetDisplayRefreshRate);
+
return RHI::ResultCode::Success;
}
@@ -160,7 +155,10 @@ namespace AZ
const uint32_t currentImageIndex = GetCurrentImageIndex();
//Preset the drawable
- Platform::PresentInternal(m_mtlCommandBuffer, m_drawables[currentImageIndex], GetDescriptor().m_verticalSyncInterval, m_refreshRate);
+ Platform::PresentInternal(
+ m_mtlCommandBuffer,
+ m_drawables[currentImageIndex], GetDescriptor().m_verticalSyncInterval,
+ m_refreshRate);
[m_drawables[currentImageIndex] release];
m_drawables[currentImageIndex] = nil;
diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.h b/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.h
index 571f12faf8..51dfe9258b 100644
--- a/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.h
+++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/SwapChain.h
@@ -53,7 +53,7 @@ namespace AZ
id m_mtlDevice = nil;
NativeWindowType* m_nativeWindow = nullptr;
AZStd::vector> m_drawables;
- float m_refreshRate = 0.0f;
+ uint32_t m_refreshRate = 0;
};
}
}
diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.cpp
index 1b3a533f34..316144f323 100644
--- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.cpp
+++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.cpp
@@ -117,6 +117,35 @@ namespace AZ
m_imageNullDescriptor.m_images[static_cast(ImageTypes::MultiSampleReadOnly2D)].m_sampleCountFlag = VK_SAMPLE_COUNT_4_BIT;
m_imageNullDescriptor.m_images[static_cast(ImageTypes::MultiSampleReadOnly2D)].m_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)] = {};
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_name = "NULL_DESCRIPTOR_GENERAL_ARRAY_2D";
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_sampleCountFlag = VK_SAMPLE_COUNT_1_BIT;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_format = VK_FORMAT_R8G8B8A8_SRGB;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_usageFlagBits =VkImageUsageFlagBits(VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_arrayLayers = 1;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_imageCreateFlagBits = VkImageCreateFlagBits(0);
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_layout = VK_IMAGE_LAYOUT_GENERAL;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralArray2D)].m_dimension = imageDimension;
+
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)] = m_imageNullDescriptor.m_images[static_cast(NullDescriptorManager::ImageTypes::GeneralArray2D)];
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_name = "NULL_DESCRIPTOR_READONLY_ARRAY_2D";
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_sampleCountFlag = VK_SAMPLE_COUNT_1_BIT;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_format = VK_FORMAT_R8G8B8A8_SRGB;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_usageFlagBits = VkImageUsageFlagBits(VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_arrayLayers = 1;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_imageCreateFlagBits = VkImageCreateFlagBits(0);
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::ReadOnlyArray2D)].m_dimension = imageDimension;
+
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)] = m_imageNullDescriptor.m_images[static_cast(NullDescriptorManager::ImageTypes::General2D)];
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_name = "NULL_DESCRIPTOR_STORAGE_ARRAY_2D";
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_sampleCountFlag = VK_SAMPLE_COUNT_1_BIT;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_format = VK_FORMAT_R32G32B32A32_UINT;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_usageFlagBits = VkImageUsageFlagBits(VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT);
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_arrayLayers = 1;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_layout = VK_IMAGE_LAYOUT_GENERAL;
+ m_imageNullDescriptor.m_images[static_cast(ImageTypes::StorageArray2D)].m_dimension = 256;
+
m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralCube)] = m_imageNullDescriptor.m_images[static_cast(NullDescriptorManager::ImageTypes::General2D)];
m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralCube)].m_name = "NULL_DESCRIPTOR_GENERAL_CUBE";
m_imageNullDescriptor.m_images[static_cast(ImageTypes::GeneralCube)].m_arrayLayers = 6;
@@ -243,6 +272,10 @@ namespace AZ
{
imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_3D;
}
+ else if (imageIndex >= static_cast(ImageTypes::GeneralArray2D) && imageIndex <= static_cast(ImageTypes::StorageArray2D))
+ {
+ imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ }
result = vkCreateImageView(device.GetNativeDevice(), &imageViewCreateInfo, nullptr, &m_imageNullDescriptor.m_images[imageIndex].m_view);
RETURN_RESULT_IF_UNSUCCESSFUL(ConvertResult(result));
@@ -366,7 +399,7 @@ namespace AZ
VkDescriptorImageInfo NullDescriptorManager::GetDescriptorImageInfo(RHI::ShaderInputImageType imageType, bool storageImage)
{
- if (imageType == RHI::ShaderInputImageType::Image2D || imageType == RHI::ShaderInputImageType::Image2DArray)
+ if (imageType == RHI::ShaderInputImageType::Image2D)
{
if (storageImage)
{
@@ -377,6 +410,17 @@ namespace AZ
return GetImage(ImageTypes::ReadOnly2D);
}
}
+ else if (imageType == RHI::ShaderInputImageType::Image2DArray)
+ {
+ if (storageImage)
+ {
+ return GetImage(ImageTypes::StorageArray2D);
+ }
+ else
+ {
+ return GetImage(ImageTypes::ReadOnlyArray2D);
+ }
+ }
else if (imageType == RHI::ShaderInputImageType::Image2DMultisample)
{
if (storageImage)
diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.h
index 52d12b97c4..e5c4dab22e 100644
--- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.h
+++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/NullDescriptorManager.h
@@ -30,6 +30,11 @@ namespace AZ
MultiSampleGeneral2D,
MultiSampleReadOnly2D,
+ // 2d image arrays
+ GeneralArray2D,
+ ReadOnlyArray2D,
+ StorageArray2D,
+
// cube images
GeneralCube,
ReadOnlyCube,
diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/WindowContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/WindowContext.cpp
index 7c269b86d4..9720a88176 100644
--- a/Gems/Atom/RPI/Code/Source/RPI.Public/WindowContext.cpp
+++ b/Gems/Atom/RPI/Code/Source/RPI.Public/WindowContext.cpp
@@ -17,19 +17,6 @@
#include
#include
-
-void OnVsyncIntervalChanged(uint32_t const& interval)
-{
- AzFramework::WindowNotificationBus::Broadcast(
- &AzFramework::WindowNotificationBus::Events::OnVsyncIntervalChanged,
- AZ::GetClamp(interval, 0u, 4u));
-}
-
-// NOTE: On change, broadcasts the new requested vsync interval to all windows.
-// The value of the vsync interval is constrained between 0 and 4
-// Vsync intervals greater than 1 are not currently supported on the Vulkan RHI (see #2061 for discussion)
-AZ_CVAR(uint32_t, rpi_vsync_interval, 1, OnVsyncIntervalChanged, AZ::ConsoleFunctorFlags::Null, "Set swapchain vsync interval");
-
namespace AZ
{
namespace RPI
@@ -158,9 +145,13 @@ namespace AZ
const RHI::WindowHandle windowHandle = RHI::WindowHandle(reinterpret_cast(m_windowHandle));
+ uint32_t syncInterval = 1;
+ AzFramework::WindowRequestBus::EventResult(
+ syncInterval, m_windowHandle, &AzFramework::WindowRequestBus::Events::GetSyncInterval);
+
RHI::SwapChainDescriptor descriptor;
descriptor.m_window = windowHandle;
- descriptor.m_verticalSyncInterval = rpi_vsync_interval;
+ descriptor.m_verticalSyncInterval = syncInterval;
descriptor.m_dimensions.m_imageWidth = width;
descriptor.m_dimensions.m_imageHeight = height;
descriptor.m_dimensions.m_imageCount = 3;
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h
index cd670f3048..bb26e116af 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h
@@ -121,6 +121,8 @@ namespace AtomToolsFramework
bool CanToggleFullScreenState() const override;
void ToggleFullScreenState() override;
float GetDpiScaleFactor() const override;
+ uint32_t GetSyncInterval() const override;
+ uint32_t GetDisplayRefreshRate() const;
protected:
// AzFramework::InputChannelEventListener ...
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h
index 82444246fd..751b30a907 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h
@@ -16,8 +16,8 @@
#include
#include
+#include
#include
-#include
#include
namespace AtomToolsFramework
@@ -53,10 +53,9 @@ namespace AtomToolsFramework
virtual void SelectNextTab();
AzQtComponents::FancyDocking* m_advancedDockManager = nullptr;
- QWidget* m_centralWidget = nullptr;
QMenuBar* m_menuBar = nullptr;
AzQtComponents::TabWidget* m_tabWidget = nullptr;
- QStatusBar* m_statusBar = nullptr;
+ QLabel* m_statusMessage = nullptr;
AZStd::unordered_map m_dockWidgets;
};
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AtomToolsFrameworkModule.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AtomToolsFrameworkModule.cpp
index bee27dfdca..b601596032 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AtomToolsFrameworkModule.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AtomToolsFrameworkModule.cpp
@@ -8,20 +8,23 @@
#include
#include
+#include
namespace AtomToolsFramework
{
AtomToolsFrameworkModule::AtomToolsFrameworkModule()
{
m_descriptors.insert(m_descriptors.end(), {
- AtomToolsFrameworkSystemComponent::CreateDescriptor(),
- });
+ AtomToolsFrameworkSystemComponent::CreateDescriptor(),
+ AtomToolsMainWindowSystemComponent::CreateDescriptor(),
+ });
}
AZ::ComponentTypeList AtomToolsFrameworkModule::GetRequiredSystemComponents() const
{
return AZ::ComponentTypeList{
azrtti_typeid(),
+ azrtti_typeid(),
};
}
}
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp
index 5167e3d3f6..bf356d2b99 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp
@@ -465,4 +465,14 @@ namespace AtomToolsFramework
{
return aznumeric_cast(devicePixelRatioF());
}
+
+ uint32_t RenderViewportWidget::GetDisplayRefreshRate() const
+ {
+ return 60;
+ }
+
+ uint32_t RenderViewportWidget::GetSyncInterval() const
+ {
+ return 1;
+ }
} //namespace AtomToolsFramework
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp
index f6e56b1ff6..55bec32dc7 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp
@@ -7,6 +7,8 @@
*/
#include
+#include
+#include
namespace AtomToolsFramework
{
@@ -21,11 +23,15 @@ namespace AtomToolsFramework
setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
- m_statusBar = new QStatusBar(this);
- m_statusBar->setObjectName("StatusBar");
- statusBar()->addPermanentWidget(m_statusBar, 1);
+ m_statusMessage = new QLabel(statusBar());
+ statusBar()->addPermanentWidget(m_statusMessage, 1);
- m_centralWidget = new QWidget(this);
+ auto centralWidget = new QWidget(this);
+ auto centralWidgetLayout = new QVBoxLayout(centralWidget);
+ centralWidgetLayout->setMargin(0);
+ centralWidgetLayout->setContentsMargins(0, 0, 0, 0);
+ centralWidget->setLayout(centralWidgetLayout);
+ setCentralWidget(centralWidget);
AtomToolsMainWindowRequestBus::Handler::BusConnect();
}
@@ -111,7 +117,7 @@ namespace AtomToolsFramework
void AtomToolsMainWindow::CreateTabBar()
{
- m_tabWidget = new AzQtComponents::TabWidget(m_centralWidget);
+ m_tabWidget = new AzQtComponents::TabWidget(centralWidget());
m_tabWidget->setObjectName("TabWidget");
m_tabWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
m_tabWidget->setContentsMargins(0, 0, 0, 0);
@@ -131,6 +137,8 @@ namespace AtomToolsFramework
{
OpenTabContextMenu();
});
+
+ centralWidget()->layout()->addWidget(m_tabWidget);
}
void AtomToolsMainWindow::AddTabForDocumentId(
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.cpp
new file mode 100644
index 0000000000..3114a5d9f7
--- /dev/null
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace AtomToolsFramework
+{
+ void AtomToolsMainWindowSystemComponent::Reflect(AZ::ReflectContext* context)
+ {
+ if (AZ::SerializeContext* serialize = azrtti_cast(context))
+ {
+ serialize->Class()
+ ->Version(0);
+ }
+
+ if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context))
+ {
+ behaviorContext->EBus("AtomToolsMainWindowFactoryRequestBus")
+ ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+ ->Attribute(AZ::Script::Attributes::Category, "Editor")
+ ->Attribute(AZ::Script::Attributes::Module, "atomtools")
+ ->Event("CreateMainWindow", &AtomToolsMainWindowFactoryRequestBus::Events::CreateMainWindow)
+ ->Event("DestroyMainWindow", &AtomToolsMainWindowFactoryRequestBus::Events::DestroyMainWindow)
+ ;
+
+ behaviorContext->EBus("AtomToolsMainWindowRequestBus")
+ ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+ ->Attribute(AZ::Script::Attributes::Category, "Editor")
+ ->Attribute(AZ::Script::Attributes::Module, "atomtools")
+ ->Event("ActivateWindow", &AtomToolsMainWindowRequestBus::Events::ActivateWindow)
+ ->Event("SetDockWidgetVisible", &AtomToolsMainWindowRequestBus::Events::SetDockWidgetVisible)
+ ->Event("IsDockWidgetVisible", &AtomToolsMainWindowRequestBus::Events::IsDockWidgetVisible)
+ ->Event("GetDockWidgetNames", &AtomToolsMainWindowRequestBus::Events::GetDockWidgetNames)
+ ->Event("ResizeViewportRenderTarget", &AtomToolsMainWindowRequestBus::Events::ResizeViewportRenderTarget)
+ ->Event("LockViewportRenderTargetSize", &AtomToolsMainWindowRequestBus::Events::LockViewportRenderTargetSize)
+ ->Event("UnlockViewportRenderTargetSize", &AtomToolsMainWindowRequestBus::Events::UnlockViewportRenderTargetSize)
+ ;
+ }
+ }
+
+ void AtomToolsMainWindowSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+ {
+ provided.push_back(AZ_CRC_CE("AtomToolsMainWindowSystemService"));
+ }
+
+ void AtomToolsMainWindowSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+ {
+ incompatible.push_back(AZ_CRC_CE("AtomToolsMainWindowSystemService"));
+ }
+
+ void AtomToolsMainWindowSystemComponent::Init()
+ {
+ }
+
+ void AtomToolsMainWindowSystemComponent::Activate()
+ {
+ }
+
+ void AtomToolsMainWindowSystemComponent::Deactivate()
+ {
+ }
+
+} // namespace AtomToolsFramework
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.h
new file mode 100644
index 0000000000..b982327326
--- /dev/null
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindowSystemComponent.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include
+
+namespace AtomToolsFramework
+{
+ //! AtomToolsMainWindowSystemComponent is used for initialization and registration of other classes.
+ class AtomToolsMainWindowSystemComponent
+ : public AZ::Component
+ {
+ public:
+ AZ_COMPONENT(AtomToolsMainWindowSystemComponent, "{6E42380B-4ECD-47CF-B904-E16AB4E87D0D}");
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
+ static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
+
+ private:
+
+ ////////////////////////////////////////////////////////////////////////
+ // AZ::Component interface implementation
+ void Init() override;
+ void Activate() override;
+ void Deactivate() override;
+ ////////////////////////////////////////////////////////////////////////
+ };
+}
diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake
index 49e641eb9c..8eb82778e3 100644
--- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake
+++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake
@@ -45,4 +45,6 @@ set(FILES
Source/Viewport/RenderViewportWidget.cpp
Source/Viewport/ModularViewportCameraController.cpp
Source/Window/AtomToolsMainWindow.cpp
+ Source/Window/AtomToolsMainWindowSystemComponent.cpp
+ Source/Window/AtomToolsMainWindowSystemComponent.h
)
\ No newline at end of file
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp
index f4dfa3df1b..ffe5ec408a 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp
@@ -36,8 +36,6 @@ AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnin
#include
#include
#include
-#include
-#include
#include
AZ_POP_DISABLE_WARNING
@@ -77,20 +75,13 @@ namespace MaterialEditor
m_toolBar->setObjectName("ToolBar");
addToolBar(m_toolBar);
- m_materialViewport = new MaterialViewportWidget(m_centralWidget);
- m_materialViewport->setObjectName("Viewport");
- m_materialViewport->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-
CreateMenu();
CreateTabBar();
- QVBoxLayout* vl = new QVBoxLayout(m_centralWidget);
- vl->setMargin(0);
- vl->setContentsMargins(0, 0, 0, 0);
- vl->addWidget(m_tabWidget);
- vl->addWidget(m_materialViewport);
- m_centralWidget->setLayout(vl);
- setCentralWidget(m_centralWidget);
+ m_materialViewport = new MaterialViewportWidget(centralWidget());
+ m_materialViewport->setObjectName("Viewport");
+ m_materialViewport->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ centralWidget()->layout()->addWidget(m_materialViewport);
AddDockWidget("Asset Browser", new MaterialBrowserWidget, Qt::BottomDockWidgetArea, Qt::Vertical);
AddDockWidget("Inspector", new MaterialInspector, Qt::RightDockWidgetArea, Qt::Horizontal);
@@ -200,7 +191,7 @@ namespace MaterialEditor
// Create a new tab for the document ID and assign it's label to the file name of the document.
AddTabForDocumentId(documentId, filename, absolutePath, [this]{
// The tab widget requires a dummy page per tab
- auto contentWidget = new QWidget(m_centralWidget);
+ auto contentWidget = new QWidget(centralWidget());
contentWidget->setContentsMargins(0, 0, 0, 0);
contentWidget->setFixedSize(0, 0);
return contentWidget;
@@ -247,8 +238,8 @@ namespace MaterialEditor
const QString documentPath = GetDocumentPath(documentId);
if (!documentPath.isEmpty())
{
- const QString status = QString("Material closed: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
}
@@ -257,8 +248,8 @@ namespace MaterialEditor
RemoveTabForDocumentId(documentId);
const QString documentPath = GetDocumentPath(documentId);
- const QString status = QString("Material closed: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
void MaterialEditorWindow::OnDocumentModified(const AZ::Uuid& documentId)
@@ -296,8 +287,8 @@ namespace MaterialEditor
UpdateTabForDocumentId(documentId, filename, absolutePath, isModified);
const QString documentPath = GetDocumentPath(documentId);
- const QString status = QString("Material closed: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
void MaterialEditorWindow::CreateMenu()
@@ -341,8 +332,8 @@ namespace MaterialEditor
if (!result)
{
const QString documentPath = GetDocumentPath(documentId);
- const QString status = QString("Failed to save material: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to save document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
}, QKeySequence::Save);
@@ -355,8 +346,8 @@ namespace MaterialEditor
documentId, AtomToolsFramework::GetSaveFileInfo(documentPath).absoluteFilePath().toUtf8().constData());
if (!result)
{
- const QString status = QString("Failed to save material: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to save document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
}, QKeySequence::SaveAs);
@@ -369,8 +360,8 @@ namespace MaterialEditor
documentId, AtomToolsFramework::GetSaveFileInfo(documentPath).absoluteFilePath().toUtf8().constData());
if (!result)
{
- const QString status = QString("Failed to save material: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to save document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
});
@@ -379,8 +370,8 @@ namespace MaterialEditor
MaterialDocumentSystemRequestBus::BroadcastResult(result, &MaterialDocumentSystemRequestBus::Events::SaveAllDocuments);
if (!result)
{
- const QString status = QString("Failed to save materials.");
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to save documents.");
+ m_statusMessage->setText(QString("%1").arg(status));
}
});
@@ -425,8 +416,8 @@ namespace MaterialEditor
if (!result)
{
const QString documentPath = GetDocumentPath(documentId);
- const QString status = QString("Failed to perform Undo in material: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to perform undo on document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
}, QKeySequence::Undo);
@@ -437,8 +428,8 @@ namespace MaterialEditor
if (!result)
{
const QString documentPath = GetDocumentPath(documentId);
- const QString status = QString("Failed to perform Undo in material: %1").arg(documentPath);
- m_statusBar->setWindowIconText(QString("%1").arg(status));
+ const QString status = QString("Failed to perform redo on document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
}, QKeySequence::Redo);
diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp
index 8406ae891f..5359ba8e53 100644
--- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp
+++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindowComponent.cpp
@@ -30,47 +30,24 @@ namespace MaterialEditor
serialize->Class()
->Version(0);
}
-
- if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context))
- {
- behaviorContext->EBus("MaterialEditorWindowAtomRequestBus")
- ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
- ->Attribute(AZ::Script::Attributes::Category, "Editor")
- ->Attribute(AZ::Script::Attributes::Module, "materialeditor")
- ->Event("CreateMaterialEditorWindow", &AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Events::CreateMainWindow)
- ->Event("DestroyMaterialEditorWindow", &AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Events::DestroyMainWindow)
- ;
-
- behaviorContext->EBus("MaterialEditorWindowRequestBus")
- ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
- ->Attribute(AZ::Script::Attributes::Category, "Editor")
- ->Attribute(AZ::Script::Attributes::Module, "materialeditor")
- ->Event("ActivateWindow", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::ActivateWindow)
- ->Event("SetDockWidgetVisible", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::SetDockWidgetVisible)
- ->Event("IsDockWidgetVisible", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::IsDockWidgetVisible)
- ->Event("GetDockWidgetNames", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::GetDockWidgetNames)
- ->Event("ResizeViewportRenderTarget", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::ResizeViewportRenderTarget)
- ->Event("LockViewportRenderTargetSize", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::LockViewportRenderTargetSize)
- ->Event("UnlockViewportRenderTargetSize", &AtomToolsFramework::AtomToolsMainWindowRequestBus::Events::UnlockViewportRenderTargetSize)
- ;
- }
}
void MaterialEditorWindowComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
{
- required.push_back(AZ_CRC("AssetBrowserService", 0x1e54fffb));
- required.push_back(AZ_CRC("PropertyManagerService", 0x63a3d7ad));
- required.push_back(AZ_CRC("SourceControlService", 0x67f338fd));
+ required.push_back(AZ_CRC_CE("AssetBrowserService"));
+ required.push_back(AZ_CRC_CE("PropertyManagerService"));
+ required.push_back(AZ_CRC_CE("SourceControlService"));
+ required.push_back(AZ_CRC_CE("AtomToolsMainWindowSystemService"));
}
void MaterialEditorWindowComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
- provided.push_back(AZ_CRC("MaterialEditorWindowService", 0xb6e7d922));
+ provided.push_back(AZ_CRC_CE("MaterialEditorWindowService"));
}
void MaterialEditorWindowComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
{
- incompatible.push_back(AZ_CRC("MaterialEditorWindowService", 0xb6e7d922));
+ incompatible.push_back(AZ_CRC_CE("MaterialEditorWindowService"));
}
void MaterialEditorWindowComponent::Init()
diff --git a/Gems/Atom/Tools/MaterialEditor/Scripts/GenerateAllMaterialScreenshots.py b/Gems/Atom/Tools/MaterialEditor/Scripts/GenerateAllMaterialScreenshots.py
index d7f52d7a24..2116a3de6c 100755
--- a/Gems/Atom/Tools/MaterialEditor/Scripts/GenerateAllMaterialScreenshots.py
+++ b/Gems/Atom/Tools/MaterialEditor/Scripts/GenerateAllMaterialScreenshots.py
@@ -6,6 +6,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
"""
import azlmbr.bus
+import azlmbr.atomtools
import azlmbr.materialeditor
import azlmbr.name
import azlmbr.render
@@ -122,12 +123,12 @@ def CaptureScreenshot(screenshotOutputPath):
def ResizeViewport(width, height):
# This locks the size of the render target to the desired resolution
- azlmbr.materialeditor.MaterialEditorWindowRequestBus(azlmbr.bus.Broadcast, 'LockViewportRenderTargetSize', width, height)
+ azlmbr.atomtools.AtomToolsMainWindowRequestBus(azlmbr.bus.Broadcast, 'LockViewportRenderTargetSize', width, height)
# This resizes the window to closely match the render target resolution so it doesn't appear stretched while the script is running
- azlmbr.materialeditor.MaterialEditorWindowRequestBus(azlmbr.bus.Broadcast, 'ResizeViewportRenderTarget', width, height)
+ azlmbr.atomtools.AtomToolsMainWindowRequestBus(azlmbr.bus.Broadcast, 'ResizeViewportRenderTarget', width, height)
def ReleaseViewportResolutionLock():
- azlmbr.materialeditor.MaterialEditorWindowRequestBus(azlmbr.bus.Broadcast, 'UnlockViewportRenderTargetSize')
+ azlmbr.atomtools.AtomToolsMainWindowRequestBus(azlmbr.bus.Broadcast, 'UnlockViewportRenderTargetSize')
def GenerateMaterialScreenshot(materialName,
uniqueSuffix="",
diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp
index 0a082f3c33..a7c8d79130 100644
--- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp
+++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp
@@ -8,6 +8,8 @@
#include
#include
+#include
+#include
#include
#include
#include
@@ -23,11 +25,8 @@ AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnin
#include
#include
#include
-#include
#include
#include
-#include
-#include
#include
AZ_POP_DISABLE_WARNING
@@ -36,6 +35,14 @@ namespace ShaderManagementConsole
ShaderManagementConsoleWindow::ShaderManagementConsoleWindow(QWidget* parent /* = 0 */)
: AtomToolsFramework::AtomToolsMainWindow(parent)
{
+ resize(1280, 1024);
+
+ // Among other things, we need the window wrapper to save the main window size, position, and state
+ auto mainWindowWrapper =
+ new AzQtComponents::WindowDecorationWrapper(AzQtComponents::WindowDecorationWrapper::OptionAutoTitleBarButtons);
+ mainWindowWrapper->setGuest(this);
+ mainWindowWrapper->enableSaveRestoreGeometry("O3DE", "ShaderManagementConsole", "mainWindowGeometry");
+
setWindowTitle("Shader Management Console");
setObjectName("ShaderManagementConsoleWindow");
@@ -47,16 +54,14 @@ namespace ShaderManagementConsole
CreateMenu();
CreateTabBar();
- QVBoxLayout* vl = new QVBoxLayout(m_centralWidget);
- vl->setMargin(0);
- vl->setContentsMargins(0, 0, 0, 0);
- vl->addWidget(m_tabWidget);
- m_centralWidget->setLayout(vl);
- setCentralWidget(m_centralWidget);
-
AddDockWidget("Asset Browser", new ShaderManagementConsoleBrowserWidget, Qt::BottomDockWidgetArea, Qt::Vertical);
AddDockWidget("Python Terminal", new AzToolsFramework::CScriptTermDialog, Qt::BottomDockWidgetArea, Qt::Horizontal);
+ SetDockWidgetVisible("Python Terminal", false);
+
+ // Restore geometry and show the window
+ mainWindowWrapper->showFromSettings();
+
ShaderManagementConsoleDocumentNotificationBus::Handler::BusConnect();
OnDocumentOpened(AZ::Uuid::CreateNull());
}
@@ -103,8 +108,7 @@ namespace ShaderManagementConsole
// Create a new tab for the document ID and assign it's label to the file name of the document.
AddTabForDocumentId(documentId, filename, absolutePath, [this, documentId]{
// The document tab contains a table view.
- auto contentWidget = new QTableView(m_centralWidget);
- contentWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ auto contentWidget = new QTableView(centralWidget());
contentWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
contentWidget->setModel(CreateDocumentContent(documentId));
return contentWidget;
@@ -142,11 +146,22 @@ namespace ShaderManagementConsole
activateWindow();
raise();
+
+ const QString documentPath = GetDocumentPath(documentId);
+ if (!documentPath.isEmpty())
+ {
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
+ }
}
void ShaderManagementConsoleWindow::OnDocumentClosed(const AZ::Uuid& documentId)
{
RemoveTabForDocumentId(documentId);
+
+ const QString documentPath = GetDocumentPath(documentId);
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
void ShaderManagementConsoleWindow::OnDocumentModified(const AZ::Uuid& documentId)
@@ -182,6 +197,10 @@ namespace ShaderManagementConsole
AZStd::string filename;
AzFramework::StringFunc::Path::GetFullFileName(absolutePath.c_str(), filename);
UpdateTabForDocumentId(documentId, filename, absolutePath, isModified);
+
+ const QString documentPath = GetDocumentPath(documentId);
+ const QString status = QString("Document closed: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
}
void ShaderManagementConsoleWindow::CreateMenu()
@@ -254,12 +273,26 @@ namespace ShaderManagementConsole
m_actionUndo = m_menuEdit->addAction("&Undo", [this]() {
const AZ::Uuid documentId = GetDocumentIdFromTab(m_tabWidget->currentIndex());
- ShaderManagementConsoleDocumentRequestBus::Event(documentId, &ShaderManagementConsoleDocumentRequestBus::Events::Undo);
+ bool result = false;
+ ShaderManagementConsoleDocumentRequestBus::EventResult(result, documentId, &ShaderManagementConsoleDocumentRequestBus::Events::Undo);
+ if (!result)
+ {
+ const QString documentPath = GetDocumentPath(documentId);
+ const QString status = QString("Failed to perform undo on document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
+ }
}, QKeySequence::Undo);
m_actionRedo = m_menuEdit->addAction("&Redo", [this]() {
const AZ::Uuid documentId = GetDocumentIdFromTab(m_tabWidget->currentIndex());
- ShaderManagementConsoleDocumentRequestBus::Event(documentId, &ShaderManagementConsoleDocumentRequestBus::Events::Redo);
+ bool result = false;
+ ShaderManagementConsoleDocumentRequestBus::EventResult(result, documentId, &ShaderManagementConsoleDocumentRequestBus::Events::Redo);
+ if (!result)
+ {
+ const QString documentPath = GetDocumentPath(documentId);
+ const QString status = QString("Failed to perform redo on document: %1").arg(documentPath);
+ m_statusMessage->setText(QString("%1").arg(status));
+ }
}, QKeySequence::Redo);
m_menuEdit->addSeparator();
@@ -278,13 +311,11 @@ namespace ShaderManagementConsole
SetDockWidgetVisible(label, !IsDockWidgetVisible(label));
});
- m_actionPythonTerminal = m_menuView->addAction(
- "Python &Terminal",
- [this]()
- {
- const AZStd::string label = "Python Terminal";
- SetDockWidgetVisible(label, !IsDockWidgetVisible(label));
- });
+ m_actionPythonTerminal = m_menuView->addAction("Python &Terminal", [this]() {
+ const AZStd::string label = "Python Terminal";
+ SetDockWidgetVisible(label, !IsDockWidgetVisible(label));
+ });
+
m_menuView->addSeparator();
@@ -321,6 +352,13 @@ namespace ShaderManagementConsole
});
}
+ QString ShaderManagementConsoleWindow::GetDocumentPath(const AZ::Uuid& documentId) const
+ {
+ AZStd::string absolutePath;
+ ShaderManagementConsoleDocumentRequestBus::EventResult(absolutePath, documentId, &ShaderManagementConsoleDocumentRequestBus::Handler::GetAbsolutePath);
+ return absolutePath.c_str();
+ }
+
void ShaderManagementConsoleWindow::OpenTabContextMenu()
{
const QTabBar* tabBar = m_tabWidget->tabBar();
diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h
index aae31d1000..37efcb1b45 100644
--- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h
+++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h
@@ -52,6 +52,9 @@ namespace ShaderManagementConsole
void CreateMenu() override;
void CreateTabBar() override;
+
+ QString GetDocumentPath(const AZ::Uuid& documentId) const;
+
void OpenTabContextMenu() override;
void SelectDocumentForTab(const int tabIndex);
diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindowComponent.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindowComponent.cpp
index 44715ef64f..a89cdfddb8 100644
--- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindowComponent.cpp
+++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindowComponent.cpp
@@ -44,14 +44,6 @@ namespace ShaderManagementConsole
if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context))
{
- behaviorContext->EBus("ShaderManagementConsoleWindowRequestBus")
- ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
- ->Attribute(AZ::Script::Attributes::Category, "Editor")
- ->Attribute(AZ::Script::Attributes::Module, "shadermanagementconsole")
- ->Event("CreateShaderManagementConsoleWindow", &AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Events::CreateMainWindow)
- ->Event("DestroyShaderManagementConsoleWindow", &AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Events::DestroyMainWindow)
- ;
-
behaviorContext->EBus("ShaderManagementConsoleRequestBus")
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
->Attribute(AZ::Script::Attributes::Category, "Editor")
@@ -65,19 +57,20 @@ namespace ShaderManagementConsole
void ShaderManagementConsoleWindowComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
{
- required.push_back(AZ_CRC("AssetBrowserService", 0x1e54fffb));
- required.push_back(AZ_CRC("PropertyManagerService", 0x63a3d7ad));
- required.push_back(AZ_CRC("SourceControlService", 0x67f338fd));
+ required.push_back(AZ_CRC_CE("AssetBrowserService"));
+ required.push_back(AZ_CRC_CE("PropertyManagerService"));
+ required.push_back(AZ_CRC_CE("SourceControlService"));
+ required.push_back(AZ_CRC_CE("AtomToolsMainWindowSystemService"));
}
void ShaderManagementConsoleWindowComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
- provided.push_back(AZ_CRC("ShaderManagementConsoleWindowService", 0xb6e7d922));
+ provided.push_back(AZ_CRC_CE("ShaderManagementConsoleWindowService"));
}
void ShaderManagementConsoleWindowComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
{
- incompatible.push_back(AZ_CRC("ShaderManagementConsoleWindowService", 0xb6e7d922));
+ incompatible.push_back(AZ_CRC_CE("ShaderManagementConsoleWindowService"));
}
void ShaderManagementConsoleWindowComponent::Init()
diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Actor/ActorGroupExporter.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Actor/ActorGroupExporter.cpp
index a498ed2cb7..efd3d84aa0 100644
--- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Actor/ActorGroupExporter.cpp
+++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Actor/ActorGroupExporter.cpp
@@ -49,7 +49,7 @@ namespace EMotionFX
if (serializeContext)
{
// Increasing the version number of the actor group exporter will make sure all actor products will be force re-generated.
- serializeContext->Class()->Version(3);
+ serializeContext->Class()->Version(4);
}
}
diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/ActorInstance.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/ActorInstance.cpp
index 13927f3fd3..5a8fcda907 100644
--- a/Gems/EMotionFX/Code/EMotionFX/Source/ActorInstance.cpp
+++ b/Gems/EMotionFX/Code/EMotionFX/Source/ActorInstance.cpp
@@ -621,7 +621,7 @@ namespace EMotionFX
}
// Expand the bounding volume by a tolerance area in case set.
- if (!AZ::IsClose(m_boundsExpandBy, 0.0f))
+ if (!AZ::IsClose(m_boundsExpandBy, 0.0f) && m_aabb.IsValid())
{
const AZ::Vector3 center = m_aabb.GetCenter();
const AZ::Vector3 halfExtents = m_aabb.GetExtents() * 0.5f;
@@ -1416,8 +1416,12 @@ namespace EMotionFX
*outResult = m_staticAabb;
EMFX_SCALECODE(
- outResult->SetMin(m_staticAabb.GetMin() * m_worldTransform.m_scale);
- outResult->SetMax(m_staticAabb.GetMax() * m_worldTransform.m_scale);)
+ if (m_staticAabb.IsValid())
+ {
+ outResult->SetMin(m_staticAabb.GetMin() * m_worldTransform.m_scale);
+ outResult->SetMax(m_staticAabb.GetMax() * m_worldTransform.m_scale);
+ }
+ )
outResult->Translate(m_worldTransform.m_position);
}
diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp
index 0b277c6195..a186d94c49 100644
--- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp
+++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NotificationWindow.cpp
@@ -28,7 +28,7 @@ namespace EMStudio
setWindowTitle("Notification");
// window, no border, no focus, stays on top
- setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus);
+ setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus | Qt::WindowStaysOnTopHint);
// enable the translucent background
setAttribute(Qt::WA_TranslucentBackground);
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.cpp
index 221e1fdcea..d39ca83000 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.cpp
+++ b/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.cpp
@@ -90,6 +90,11 @@ namespace EditorPythonBindings
PythonSymbolEventBus::Handler::BusConnect();
EditorPythonBindingsNotificationBus::Handler::BusConnect();
AZ::Interface::Register(this);
+
+ if (PythonSymbolEventBus::GetTotalNumOfEventHandlers() > 1)
+ {
+ OnPostInitialize();
+ }
}
void PythonLogSymbolsComponent::Deactivate()
@@ -111,6 +116,7 @@ namespace EditorPythonBindings
m_basePath = pythonSymbolsPath;
}
EditorPythonBindingsNotificationBus::Handler::BusDisconnect();
+ PythonSymbolEventBus::ExecuteQueuedEvents();
}
void PythonLogSymbolsComponent::WriteMethod(AZ::IO::HandleType handle, AZStd::string_view methodName, const AZ::BehaviorMethod& behaviorMethod, const AZ::BehaviorClass* behaviorClass)
@@ -206,12 +212,12 @@ namespace EditorPythonBindings
AZ::IO::FileIOBase::GetInstance()->Write(handle, buffer.c_str(), buffer.size());
}
- void PythonLogSymbolsComponent::LogClass(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass)
+ void PythonLogSymbolsComponent::LogClass(const AZStd::string moduleName, const AZ::BehaviorClass* behaviorClass)
{
LogClassWithName(moduleName, behaviorClass, behaviorClass->m_name.c_str());
}
- void PythonLogSymbolsComponent::LogClassWithName(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass, AZStd::string_view className)
+ void PythonLogSymbolsComponent::LogClassWithName(const AZStd::string moduleName, const AZ::BehaviorClass* behaviorClass, const AZStd::string className)
{
Internal::FileHandle fileHandle(OpenModuleAt(moduleName));
if (fileHandle.IsValid())
@@ -255,7 +261,11 @@ namespace EditorPythonBindings
}
}
- void PythonLogSymbolsComponent::LogClassMethod(AZStd::string_view moduleName, AZStd::string_view globalMethodName, AZ::BehaviorClass* behaviorClass, AZ::BehaviorMethod* behaviorMethod)
+ void PythonLogSymbolsComponent::LogClassMethod(
+ const AZStd::string moduleName,
+ const AZStd::string globalMethodName,
+ const AZ::BehaviorClass* behaviorClass,
+ const AZ::BehaviorMethod* behaviorMethod)
{
AZ_UNUSED(behaviorClass);
Internal::FileHandle fileHandle(OpenModuleAt(moduleName));
@@ -265,7 +275,7 @@ namespace EditorPythonBindings
}
}
- void PythonLogSymbolsComponent::LogBus(AZStd::string_view moduleName, AZStd::string_view busName, AZ::BehaviorEBus* behaviorEBus)
+ void PythonLogSymbolsComponent::LogBus(const AZStd::string moduleName, const AZStd::string busName, const AZ::BehaviorEBus* behaviorEBus)
{
if (behaviorEBus->m_events.empty())
{
@@ -404,7 +414,7 @@ namespace EditorPythonBindings
}
}
- void PythonLogSymbolsComponent::LogGlobalMethod(AZStd::string_view moduleName, AZStd::string_view methodName, AZ::BehaviorMethod* behaviorMethod)
+ void PythonLogSymbolsComponent::LogGlobalMethod(const AZStd::string moduleName, const AZStd::string methodName, const AZ::BehaviorMethod* behaviorMethod)
{
Internal::FileHandle fileHandle(OpenModuleAt(moduleName));
if (fileHandle.IsValid())
@@ -428,7 +438,10 @@ namespace EditorPythonBindings
}
}
- void PythonLogSymbolsComponent::LogGlobalProperty(AZStd::string_view moduleName, AZStd::string_view propertyName, AZ::BehaviorProperty* behaviorProperty)
+ void PythonLogSymbolsComponent::LogGlobalProperty(
+ const AZStd::string moduleName,
+ const AZStd::string propertyName,
+ const AZ::BehaviorProperty* behaviorProperty)
{
if (!behaviorProperty->m_getter || !behaviorProperty->m_getter->GetResult())
{
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.h b/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.h
index 54285198cf..5fbd1c3f37 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.h
+++ b/Gems/EditorPythonBindings/Code/Source/PythonLogSymbolsComponent.h
@@ -51,12 +51,19 @@ namespace EditorPythonBindings
////////////////////////////////////////////////////////////////////////
// PythonSymbolEventBus::Handler
- void LogClass(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass) override;
- void LogClassWithName(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass, AZStd::string_view className) override;
- void LogClassMethod(AZStd::string_view moduleName, AZStd::string_view globalMethodName, AZ::BehaviorClass* behaviorClass, AZ::BehaviorMethod* behaviorMethod) override;
- void LogBus(AZStd::string_view moduleName, AZStd::string_view busName, AZ::BehaviorEBus* behaviorEBus) override;
- void LogGlobalMethod(AZStd::string_view moduleName, AZStd::string_view methodName, AZ::BehaviorMethod* behaviorMethod) override;
- void LogGlobalProperty(AZStd::string_view moduleName, AZStd::string_view propertyName, AZ::BehaviorProperty* behaviorProperty) override;
+ void LogClass(const AZStd::string moduleName, const AZ::BehaviorClass* behaviorClass) override;
+ void LogClassWithName(const AZStd::string moduleName, const AZ::BehaviorClass* behaviorClass, const AZStd::string className) override;
+ void LogClassMethod(
+ const AZStd::string moduleName,
+ const AZStd::string globalMethodName,
+ const AZ::BehaviorClass* behaviorClass,
+ const AZ::BehaviorMethod* behaviorMethod) override;
+ void LogBus(const AZStd::string moduleName, const AZStd::string busName, const AZ::BehaviorEBus* behaviorEBus) override;
+ void LogGlobalMethod(const AZStd::string moduleName, const AZStd::string methodName, const AZ::BehaviorMethod* behaviorMethod) override;
+ void LogGlobalProperty(
+ const AZStd::string moduleName,
+ const AZStd::string propertyName,
+ const AZ::BehaviorProperty* behaviorProperty) override;
void Finalize() override;
AZStd::string FetchPythonTypeName(const AZ::BehaviorParameter& param) override;
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp
index 89f8248202..e640778bbe 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp
+++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp
@@ -394,7 +394,7 @@ namespace EditorPythonBindings
// log the bus symbol
AZStd::string subModuleName = pybind11::cast(thisBusModule.attr("__name__"));
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogBus, subModuleName, ebusName, behaviorEBus);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogBus, subModuleName, ebusName, behaviorEBus);
}
}
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyObject.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyObject.cpp
index de8009830b..706ca48156 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonProxyObject.cpp
+++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyObject.cpp
@@ -756,7 +756,7 @@ namespace EditorPythonBindings
}
AZStd::string subModuleName = pybind11::cast(subModule.attr("__name__"));
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogClassMethod, subModuleName, globalMethodName, behaviorClass, behaviorMethod);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogClassMethod, subModuleName, globalMethodName, behaviorClass, behaviorMethod);
}
else
{
@@ -782,7 +782,7 @@ namespace EditorPythonBindings
pybind11::setattr(subModule, constantPropertyName.c_str(), constantValue);
AZStd::string subModuleName = pybind11::cast(subModule.attr("__name__"));
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, subModuleName, constantPropertyName, behaviorProperty);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, subModuleName, constantPropertyName, behaviorProperty);
}
}
@@ -809,11 +809,11 @@ namespace EditorPythonBindings
{
return ConstructPythonProxyObjectByTypename(behaviorClassName, pythonArgs);
});
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogClassWithName, subModuleName, behaviorClass, properSyntax);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogClassWithName, subModuleName, behaviorClass, properSyntax);
}
else
{
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogClass, subModuleName, behaviorClass);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogClass, subModuleName, behaviorClass);
}
}
}
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp
index 0404e81380..38e00e73ed 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp
+++ b/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp
@@ -153,7 +153,7 @@ namespace EditorPythonBindings
StaticPropertyHolderMapEntry& entry = iter->second;
entry.second->AddProperty(propertyName, behaviorProperty);
}
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, scopeName, propertyName, behaviorProperty);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, scopeName, propertyName, behaviorProperty);
}
pybind11::module DetermineScope(pybind11::module scope, const AZStd::string& fullName)
@@ -302,7 +302,7 @@ namespace EditorPythonBindings
// log global method symbol
AZStd::string subModuleName = pybind11::cast(targetModule.attr("__name__"));
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogGlobalMethod, subModuleName, methodName, behaviorMethod);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogGlobalMethod, subModuleName, methodName, behaviorMethod);
}
}
@@ -325,7 +325,7 @@ namespace EditorPythonBindings
// log global property symbol
AZStd::string subModuleName = pybind11::cast(globalsModule.attr("__name__"));
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, subModuleName, propertyName, behaviorProperty);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::LogGlobalProperty, subModuleName, propertyName, behaviorProperty);
if (behaviorProperty->m_getter && behaviorProperty->m_setter)
{
@@ -377,7 +377,7 @@ namespace EditorPythonBindings
PythonProxyBusManagement::CreateSubmodule(parentModule);
Internal::RegisterPaths(parentModule);
- PythonSymbolEventBus::Broadcast(&PythonSymbolEventBus::Events::Finalize);
+ PythonSymbolEventBus::QueueBroadcast(&PythonSymbolEventBus::Events::Finalize);
}
}
}
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSymbolsBus.h b/Gems/EditorPythonBindings/Code/Source/PythonSymbolsBus.h
index 242225e87a..9c6d3bab37 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonSymbolsBus.h
+++ b/Gems/EditorPythonBindings/Code/Source/PythonSymbolsBus.h
@@ -9,6 +9,14 @@
#include
+namespace AZ
+{
+ class BehaviorClass;
+ class BehaviorMethod;
+ class BehaviorEBus;
+ class BehaviorProperty;
+}
+
namespace EditorPythonBindings
{
//! An interface to track exported Python symbols
@@ -16,23 +24,39 @@ namespace EditorPythonBindings
: public AZ::EBusTraits
{
public:
+ // the symbols will be written out in the future
+ static const bool EnableEventQueue = true;
+
//! logs a behavior class type
- virtual void LogClass(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass) = 0;
+ virtual void LogClass(const AZStd::string moduleName, const AZ::BehaviorClass* behaviorClass) = 0;
//! logs a behavior class type with an override to its name
- virtual void LogClassWithName(AZStd::string_view moduleName, AZ::BehaviorClass* behaviorClass, AZStd::string_view className) = 0;
+ virtual void LogClassWithName(
+ const AZStd::string moduleName,
+ const AZ::BehaviorClass* behaviorClass,
+ const AZStd::string className) = 0;
//! logs a static class method with a specified global method name
- virtual void LogClassMethod(AZStd::string_view moduleName, AZStd::string_view globalMethodName, AZ::BehaviorClass* behaviorClass, AZ::BehaviorMethod* behaviorMethod) = 0;
+ virtual void LogClassMethod(
+ const AZStd::string moduleName,
+ const AZStd::string globalMethodName,
+ const AZ::BehaviorClass* behaviorClass,
+ const AZ::BehaviorMethod* behaviorMethod) = 0;
//! logs a behavior bus with a specified bus name
- virtual void LogBus(AZStd::string_view moduleName, AZStd::string_view busName, AZ::BehaviorEBus* behaviorEBus) = 0;
+ virtual void LogBus(const AZStd::string moduleName, const AZStd::string busName, const AZ::BehaviorEBus* behaviorEBus) = 0;
//! logs a global method from the behavior context registry with a specified method name
- virtual void LogGlobalMethod(AZStd::string_view moduleName, AZStd::string_view methodName, AZ::BehaviorMethod* behaviorMethod) = 0;
+ virtual void LogGlobalMethod(
+ const AZStd::string moduleName,
+ const AZStd::string methodName,
+ const AZ::BehaviorMethod* behaviorMethod) = 0;
//! logs a global property, enum, or constant from the behavior context registry with a specified property name
- virtual void LogGlobalProperty(AZStd::string_view moduleName, AZStd::string_view propertyName, AZ::BehaviorProperty* behaviorProperty) = 0;
+ virtual void LogGlobalProperty(
+ const AZStd::string moduleName,
+ const AZStd::string propertyName,
+ const AZ::BehaviorProperty* behaviorProperty) = 0;
//! signals the end of the logging of symbols
virtual void Finalize() = 0;
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp
index 32411e9417..8df196e7cb 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp
+++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp
@@ -10,6 +10,7 @@
#include
#include
+#include
#include
#include
#include
@@ -25,6 +26,7 @@
#include
#include
#include
+#include
#include
#include
@@ -39,7 +41,7 @@
namespace Platform
{
- // Implemented in each different platform's implentation files, as it differs per platform.
+ // Implemented in each different platform's implementation files, as it differs per platform.
bool InsertPythonBinaryLibraryPaths(AZStd::unordered_set& paths, const char* pythonPackage, const char* engineRoot);
AZStd::string GetPythonHomePath(const char* pythonPackage, const char* engineRoot);
}
@@ -225,6 +227,37 @@ namespace RedirectOutput
namespace EditorPythonBindings
{
+ // A stand in bus to capture the log symbol queue events
+ // so that when/if the PythonLogSymbolsComponent becomes
+ // active it can write out the python symbols to disk
+ class PythonSystemComponent::SymbolLogHelper final
+ : public PythonSymbolEventBus::Handler
+ {
+ public:
+ SymbolLogHelper()
+ {
+ PythonSymbolEventBus::Handler::BusConnect();
+ }
+
+ ~SymbolLogHelper()
+ {
+ PythonSymbolEventBus::ExecuteQueuedEvents();
+ PythonSymbolEventBus::Handler::BusDisconnect();
+ }
+
+ void LogClass(const AZStd::string, const AZ::BehaviorClass*) override {}
+ void LogClassWithName(const AZStd::string, const AZ::BehaviorClass*, const AZStd::string) override {}
+ void LogClassMethod(
+ const AZStd::string,
+ const AZStd::string,
+ const AZ::BehaviorClass*,
+ const AZ::BehaviorMethod*) override {}
+ void LogBus(const AZStd::string, const AZStd::string, const AZ::BehaviorEBus*) override {}
+ void LogGlobalMethod(const AZStd::string, const AZStd::string, const AZ::BehaviorMethod*) override {}
+ void LogGlobalProperty(const AZStd::string, const AZStd::string, const AZ::BehaviorProperty*) override {}
+ void Finalize() override {}
+ };
+
void PythonSystemComponent::Reflect(AZ::ReflectContext* context)
{
if (AZ::SerializeContext* serialize = azrtti_cast(context))
@@ -471,8 +504,6 @@ namespace EditorPythonBindings
}
}
-
-
bool PythonSystemComponent::StartPythonInterpreter(const PythonPathStack& pythonPathStack)
{
AZStd::unordered_set pyPackageSites(pythonPathStack.begin(), pythonPathStack.end());
@@ -520,6 +551,11 @@ namespace EditorPythonBindings
AZStd::lock_guard lock(m_lock);
pybind11::gil_scoped_acquire acquire;
+ if (EditorPythonBindings::PythonSymbolEventBus::GetTotalNumOfEventHandlers() == 0)
+ {
+ m_symbolLogHelper = AZStd::make_shared();
+ }
+
// print Python version using AZ logging
const int verRet = PyRun_SimpleStringFlags("import sys \nprint (sys.version) \n", nullptr);
AZ_Error("python", verRet == 0, "Error trying to fetch the version number in Python!");
diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h
index 679da3ccab..48ac27a036 100644
--- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h
+++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h
@@ -59,10 +59,13 @@ namespace EditorPythonBindings
////////////////////////////////////////////////////////////////////////
private:
+ class SymbolLogHelper;
+
// handle multiple Python initializers and threads
AZStd::atomic_int m_initalizeWaiterCount {0};
AZStd::semaphore m_initalizeWaiter;
AZStd::recursive_mutex m_lock;
+ AZStd::shared_ptr m_symbolLogHelper;
enum class Result
{
diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp
index 697820d75c..3646e5a413 100644
--- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp
+++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp
@@ -1482,7 +1482,7 @@ bool CUiAnimViewAnimNode::PasteNodesFromClipboard(QWidget* context)
const bool bLightAnimationSetActive = GetSequence()->GetFlags() & IUiAnimSequence::eSeqFlags_LightAnimationSet;
const unsigned int numNodes = animNodesRoot->getChildCount();
- for (int i = 0; i < numNodes; ++i)
+ for (unsigned int i = 0; i < numNodes; ++i)
{
XmlNodeRef xmlNode = animNodesRoot->getChild(i);
diff --git a/Gems/LyShine/Code/Editor/HierarchyWidget.cpp b/Gems/LyShine/Code/Editor/HierarchyWidget.cpp
index 0b56382237..30cb7e51dc 100644
--- a/Gems/LyShine/Code/Editor/HierarchyWidget.cpp
+++ b/Gems/LyShine/Code/Editor/HierarchyWidget.cpp
@@ -21,7 +21,7 @@
#include
HierarchyWidget::HierarchyWidget(EditorWindow* editorWindow)
- : QTreeWidget()
+ : AzQtComponents::StyledTreeWidget()
, m_isDeleting(false)
, m_editorWindow(editorWindow)
, m_entityItemMap()
@@ -391,7 +391,7 @@ void HierarchyWidget::startDrag(Qt::DropActions supportedActions)
// Remember the current selection so that we can revert back to it when the items are dragged back into the hierarchy
m_dragSelection = selectedItems();
- QTreeView::startDrag(supportedActions);
+ AzQtComponents::StyledTreeWidget::startDrag(supportedActions);
}
void HierarchyWidget::dragEnterEvent(QDragEnterEvent* event)
diff --git a/Gems/LyShine/Code/Editor/HierarchyWidget.h b/Gems/LyShine/Code/Editor/HierarchyWidget.h
index 525aaa8a3a..324eda207b 100644
--- a/Gems/LyShine/Code/Editor/HierarchyWidget.h
+++ b/Gems/LyShine/Code/Editor/HierarchyWidget.h
@@ -10,6 +10,8 @@
#if !defined(Q_MOC_RUN)
#include "EditorCommon.h"
+#include
+
#include
#include
@@ -19,7 +21,7 @@
class QMimeData;
class HierarchyWidget
- : public QTreeWidget
+ : public AzQtComponents::StyledTreeWidget
, private AzToolsFramework::EditorPickModeNotificationBus::Handler
, private AzToolsFramework::EntityHighlightMessages::Bus::Handler
{
diff --git a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp
index b320959dd7..bb80ffad29 100644
--- a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp
+++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugModule.cpp
@@ -28,4 +28,4 @@ namespace Multiplayer
}
}
-AZ_DECLARE_MODULE_CLASS(Gem_Multiplayer_Imgui, Multiplayer::MultiplayerDebugModule);
+AZ_DECLARE_MODULE_CLASS(Gem_Multiplayer_Debug, Multiplayer::MultiplayerDebugModule);
diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp
index dbc525e8e1..2708f95f92 100644
--- a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp
+++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp
@@ -322,11 +322,9 @@ namespace ScriptCanvasEditor
return;
}
- auto& variableOverrides = parseOutcome.GetValue();
-
if (!m_variableOverrides.IsEmpty())
{
- variableOverrides.CopyPreviousOverriddenValues(m_variableOverrides);
+ parseOutcome.GetValue().CopyPreviousOverriddenValues(m_variableOverrides);
}
m_variableOverrides = parseOutcome.TakeValue();
@@ -351,8 +349,7 @@ namespace ScriptCanvasEditor
}
auto runtimeComponent = gameEntity->CreateComponent();
- auto runtimeOverrides = ConvertToRuntime(m_variableOverrides);
- runtimeComponent->SetRuntimeDataOverrides(runtimeOverrides);
+ runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(m_variableOverrides));
}
void EditorScriptCanvasComponent::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
@@ -518,8 +515,8 @@ namespace ScriptCanvasEditor
[[maybe_unused]] AZ::Entity* scriptCanvasEntity = assetData->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "This graph must have a valid entity");
BuildGameEntityData();
- AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
UpdateName();
+ AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
}
}
diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl
index 4b22864b6e..05541196f7 100644
--- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl
+++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasGraphUtilities.inl
@@ -283,7 +283,7 @@ namespace ScriptCanvasEditor
loadResult.m_runtimeAsset.Get()->GetData().m_debugMap = luaAssetResult.m_debugMap;
loadResult.m_runtimeComponent = loadResult.m_entity->CreateComponent();
CopyAssetEntityIdsToOverrides(runtimeDataOverrides);
- loadResult.m_runtimeComponent->SetRuntimeDataOverrides(runtimeDataOverrides);
+ loadResult.m_runtimeComponent->TakeRuntimeDataOverrides(AZStd::move(runtimeDataOverrides));
Execution::Context::InitializeActivationData(loadResult.m_runtimeAsset->GetData());
Execution::InitializeInterpretedStatics(loadResult.m_runtimeAsset->GetData());
}
diff --git a/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp b/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp
index 5ec2637231..b80bba75c2 100644
--- a/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp
+++ b/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp
@@ -311,7 +311,7 @@ namespace ScriptCanvasEditor
{
if (AZStd::wildcard_match("*.scriptcanvas", fullSourceFileName))
{
- return AzToolsFramework::AssetBrowser::SourceFileDetails("Icons/AssetBrowser/ScriptCanvas_16.png");
+ return AzToolsFramework::AssetBrowser::SourceFileDetails("Editor/Icons/AssetBrowser/ScriptCanvas_16.png");
}
// not one of our types.
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp
index 8341cc1e24..96b0ac353f 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp
+++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.cpp
@@ -80,12 +80,11 @@ namespace ScriptCanvasEditor
GraphCanvas::NodePaletteTreeItem* variablesRoot = root->CreateChildNode("Variables");
root->RegisterCategoryNode(variablesRoot, "Variables");
- // We always want to keep these around as place holders
GraphCanvas::NodePaletteTreeItem* customEventRoot = root->GetCategoryNode("Script Events");
- customEventRoot->SetAllowPruneOnEmpty(false);
+ customEventRoot->SetAllowPruneOnEmpty(true);
GraphCanvas::NodePaletteTreeItem* globalFunctionRoot = root->GetCategoryNode("User Functions");
- globalFunctionRoot->SetAllowPruneOnEmpty(false);
+ globalFunctionRoot->SetAllowPruneOnEmpty(true);
}
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h
index 83db8fc242..4cbc25b500 100644
--- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Datum.h
@@ -20,6 +20,7 @@
namespace AZ
{
class ReflectContext;
+ class DatumSerializer;
}
namespace ScriptCanvas
@@ -33,6 +34,8 @@ namespace ScriptCanvas
/// in the editor, regardless of their actual ScriptCanvas or BehaviorContext type.
class Datum final
{
+ friend class AZ::DatumSerializer;
+
public:
AZ_TYPE_INFO(Datum, "{8B836FC0-98A8-4A81-8651-35C7CA125451}");
AZ_CLASS_ALLOCATOR(Datum, AZ::SystemAllocator, 0);
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp
index 81d6445556..9d1626fb73 100644
--- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp
@@ -509,7 +509,8 @@ namespace ScriptCanvas
bool SubgraphInterface::HasAnyFunctionality() const
{
- return IsActiveDefaultObject() || HasPublicFunctionality();
+ // \todo restore default object addition when ndoes can define an variable, as well
+ return /*IsActiveDefaultObject() || */ HasPublicFunctionality();
}
bool SubgraphInterface::HasBranches() const
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp
index 2d3fd355e2..ac19028fd5 100644
--- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp
@@ -93,9 +93,9 @@ namespace ScriptCanvas
return m_runtimeOverrides;
}
- void RuntimeComponent::SetRuntimeDataOverrides(const RuntimeDataOverrides& overrideData)
+ void RuntimeComponent::TakeRuntimeDataOverrides(RuntimeDataOverrides&& overrideData)
{
- m_runtimeOverrides = overrideData;
+ m_runtimeOverrides = AZStd::move(overrideData);
m_runtimeOverrides.EnforcePreloadBehavior();
}
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.h
index 38ff219d4c..8650433b0a 100644
--- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.h
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.h
@@ -54,7 +54,7 @@ namespace ScriptCanvas
const RuntimeDataOverrides& GetRuntimeDataOverrides() const;
- void SetRuntimeDataOverrides(const RuntimeDataOverrides& overrideData);
+ void TakeRuntimeDataOverrides(RuntimeDataOverrides&& overrideData);
protected:
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml
index 14634ff959..951a30ceb1 100644
--- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/RepeaterNodeable.ScriptCanvasNodeable.xml
@@ -10,17 +10,17 @@
Category="Nodeables"
GeneratePropertyFriend="True"
Namespace="ScriptCanvas"
- Description="Repeats the output signal the given number of times using the specified delay to space the signals out">
+ Description="Repeats the output signal the given number of times using the specified delay to space the signals out.">
-
+
-
+
diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp
new file mode 100644
index 0000000000..44ca1730a8
--- /dev/null
+++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp
@@ -0,0 +1,178 @@
+/*
+ * 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
+#include
+#include
+
+using namespace ScriptCanvas;
+
+namespace AZ
+{
+ AZ_CLASS_ALLOCATOR_IMPL(DatumSerializer, SystemAllocator, 0);
+
+ JsonSerializationResult::Result DatumSerializer::Load
+ ( void* outputValue
+ , [[maybe_unused]] const Uuid& outputValueTypeId
+ , const rapidjson::Value& inputValue
+ , JsonDeserializerContext& context)
+ {
+ namespace JSR = JsonSerializationResult;
+
+ AZ_Assert(outputValueTypeId == azrtti_typeid(), "DatumSerializer Load against output typeID that was not Datum");
+ AZ_Assert(outputValue, "DatumSerializer Load against null output");
+
+ JsonSerializationResult::ResultCode result(JSR::Tasks::ReadField);
+ auto outputDatum = reinterpret_cast(outputValue);
+
+ bool isOverloadedStorage = false;
+ AZ_Assert(azrtti_typeidm_isOverloadedStorage)>() == azrtti_typeid()
+ , "overloaded storage type changed and won't load properly");
+ result.Combine(ContinueLoadingFromJsonObjectField
+ ( &isOverloadedStorage
+ , azrtti_typeidm_isOverloadedStorage)>()
+ , inputValue
+ , "isOverloadedStorage"
+ , context));
+
+ ScriptCanvas::Data::Type scType;
+ AZ_Assert(azrtti_typeidm_type)>() == azrtti_typeid()
+ , "ScriptCanvas::Data::Type type changed and won't load properly");
+ result.Combine(ContinueLoadingFromJsonObjectField
+ ( &scType
+ , azrtti_typeidm_type)>()
+ , inputValue
+ , "scriptCanvasType"
+ , context));
+
+ AZStd::any storage;
+ { // datum storage begin
+ AZ::Uuid typeId = AZ::Uuid::CreateNull();
+
+ auto typeIdMember = inputValue.FindMember(JsonSerialization::TypeIdFieldIdentifier);
+ if (typeIdMember == inputValue.MemberEnd())
+ {
+ return context.Report
+ ( JSR::Tasks::ReadField
+ , JSR::Outcomes::Missing
+ , AZStd::string::format("DatumSerializer::Load failed to load the %s member"
+ , JsonSerialization::TypeIdFieldIdentifier));
+ }
+
+ result.Combine(LoadTypeId(typeId, typeIdMember->value, context));
+ if (typeId.IsNull())
+ {
+ return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Catastrophic
+ , "DatumSerializer::Load failed to load the AZ TypeId of the value");
+ }
+
+ storage = context.GetSerializeContext()->CreateAny(typeId);
+ if (storage.empty() || storage.type() != typeId)
+ {
+ return context.Report(result, "DatumSerializer::Load failed to load a value matched the reported AZ TypeId. "
+ "The C++ declaration may have been deleted or changed.");
+ }
+
+ result.Combine(ContinueLoadingFromJsonObjectField(AZStd::any_cast(&storage), typeId, inputValue, "value", context));
+ } // datum storage end
+
+ AZStd::string label;
+ AZ_Assert(azrtti_typeidm_datumLabel)>() == azrtti_typeid()
+ , "m_datumLabel type changed and won't load properly");
+ result.Combine(ContinueLoadingFromJsonObjectField
+ ( &label
+ , azrtti_typeidm_datumLabel)>()
+ , inputValue
+ , "label"
+ , context));
+
+ Datum copy(scType, Datum::eOriginality::Original, AZStd::any_cast(&storage), scType.GetAZType());
+ copy.SetLabel(label);
+ *outputDatum = copy;
+
+ return context.Report(result, result.GetProcessing() != JSR::Processing::Halted
+ ? "DatumSerializer Load finished loading Datum"
+ : "DatumSerializer Load failed to load Datum");
+ }
+
+ JsonSerializationResult::Result DatumSerializer::Store
+ ( rapidjson::Value& outputValue
+ , const void* inputValue
+ , const void* defaultValue
+ , [[maybe_unused]] const Uuid& valueTypeId
+ , JsonSerializerContext& context)
+ {
+ namespace JSR = JsonSerializationResult;
+
+ AZ_Assert(valueTypeId == azrtti_typeid(), "DatumSerializer Store against value typeID that was not Datum");
+ AZ_Assert(inputValue, "DatumSerializer Store against null inputValue pointer ");
+
+ auto inputScriptDataPtr = reinterpret_cast(inputValue);
+ auto defaultScriptDataPtr = reinterpret_cast(defaultValue);
+
+ if (defaultScriptDataPtr)
+ {
+ if (*inputScriptDataPtr == *defaultScriptDataPtr)
+ {
+ return context.Report
+ ( JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "DatumSerializer Store used defaults for Datum");
+ }
+ }
+
+ JSR::ResultCode result(JSR::Tasks::WriteValue);
+ outputValue.SetObject();
+
+ result.Combine(ContinueStoringToJsonObjectField
+ ( outputValue
+ , "isOverloadedStorage"
+ , &inputScriptDataPtr->m_isOverloadedStorage
+ , defaultScriptDataPtr ? &defaultScriptDataPtr->m_isOverloadedStorage : nullptr
+ , azrtti_typeidm_isOverloadedStorage)>()
+ , context));
+
+ result.Combine(ContinueStoringToJsonObjectField
+ ( outputValue
+ , "scriptCanvasType"
+ , &inputScriptDataPtr->GetType()
+ , defaultScriptDataPtr ? &defaultScriptDataPtr->GetType() : nullptr
+ , azrtti_typeidGetType())>()
+ , context));
+
+ { // datum storage begin
+ {
+ rapidjson::Value typeValue;
+ result.Combine(StoreTypeId(typeValue, inputScriptDataPtr->GetType().GetAZType(), context));
+ outputValue.AddMember
+ ( rapidjson::StringRef(JsonSerialization::TypeIdFieldIdentifier)
+ , AZStd::move(typeValue)
+ , context.GetJsonAllocator());
+ }
+
+ result.Combine(ContinueStoringToJsonObjectField
+ ( outputValue
+ , "value"
+ , inputScriptDataPtr->GetAsDanger()
+ , defaultScriptDataPtr ? defaultScriptDataPtr->GetAsDanger() : nullptr
+ , inputScriptDataPtr->GetType().GetAZType()
+ , context));
+ } // datum storage end
+
+ result.Combine(ContinueStoringToJsonObjectField
+ ( outputValue
+ , "label"
+ , &inputScriptDataPtr->m_datumLabel
+ , defaultScriptDataPtr ? &defaultScriptDataPtr->m_datumLabel : nullptr
+ , azrtti_typeid