From da190abbabd216013c0f1b2bff1dd10a52621e35 Mon Sep 17 00:00:00 2001 From: igarri Date: Tue, 12 Oct 2021 10:37:33 +0100 Subject: [PATCH 01/15] Fixed Camera Locations Signed-off-by: igarri --- Code/Editor/EditorViewportWidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index dad6734428..9bc6441e57 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -1445,7 +1445,10 @@ void EditorViewportWidget::SetViewTM(const Matrix34& camMatrix, bool bMoveOnly) "Please report this as a bug." ); } - + else if (shouldUpdateObject == ShouldUpdateObject::No) + { + GetCurrentAtomView()->SetCameraTransform(LYTransformToAZMatrix3x4(camMatrix)); + } if (m_pressedKeyState == KeyPressedState::PressedThisFrame) { m_pressedKeyState = KeyPressedState::PressedInPreviousFrame; From 8cf736b99959c6c16b3301ac1be9636a1b14ceb0 Mon Sep 17 00:00:00 2001 From: igarri Date: Tue, 12 Oct 2021 11:37:05 +0100 Subject: [PATCH 02/15] Added default Camera position a Sensible Default Signed-off-by: igarri --- Code/Editor/EditorViewportWidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 9bc6441e57..e546386462 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -166,6 +166,9 @@ EditorViewportWidget::EditorViewportWidget(const QString& name, QWidget* parent) m_defaultViewTM.SetIdentity(); + //Set the camera position to a more sensible default. + m_defaultViewTM.SetTranslation(Vec3(0.f, -10.f, 4.f)); + if (GetIEditor()->GetViewManager()->GetSelectedViewport() == nullptr) { GetIEditor()->GetViewManager()->SelectViewport(this); @@ -1449,6 +1452,7 @@ void EditorViewportWidget::SetViewTM(const Matrix34& camMatrix, bool bMoveOnly) { GetCurrentAtomView()->SetCameraTransform(LYTransformToAZMatrix3x4(camMatrix)); } + if (m_pressedKeyState == KeyPressedState::PressedThisFrame) { m_pressedKeyState = KeyPressedState::PressedInPreviousFrame; From d12c6beb40b2e62a0ce46f9fb471c0dcce283ea5 Mon Sep 17 00:00:00 2001 From: igarri Date: Thu, 14 Oct 2021 12:44:41 +0100 Subject: [PATCH 03/15] Added Default Camera Location to the Viewport Setting Registry Signed-off-by: igarri --- Code/Editor/EditorViewportSettings.cpp | 11 +++++++ Code/Editor/EditorViewportSettings.h | 3 ++ Code/Editor/EditorViewportWidget.cpp | 31 +++++++------------ Code/Editor/EditorViewportWidget.h | 1 + .../Viewport/ViewportMessages.h | 2 ++ 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index 2354c6d63a..0fb061d102 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -51,6 +51,9 @@ namespace SandboxEditor constexpr AZStd::string_view CameraOrbitDollyIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitDollyId"; constexpr AZStd::string_view CameraOrbitPanIdSetting = "/Amazon/Preferences/Editor/Camera/OrbitPanId"; constexpr AZStd::string_view CameraFocusIdSetting = "/Amazon/Preferences/Editor/Camera/FocusId"; + constexpr AZStd::string_view CameraDefaultStartingPositionX = "/Amazon/Preferences/Editor/Camera/DefaultStartingPosition/x"; + constexpr AZStd::string_view CameraDefaultStartingPositionY = "/Amazon/Preferences/Editor/Camera/DefaultStartingPosition/y"; + constexpr AZStd::string_view CameraDefaultStartingPositionZ = "/Amazon/Preferences/Editor/Camera/DefaultStartingPosition/z"; template void SetRegistry(const AZStd::string_view setting, T&& value) @@ -110,6 +113,14 @@ namespace SandboxEditor return AZStd::make_unique(); } + AZ::Vector3 DefaultEditorCameraPosition() + { + float xPosition = aznumeric_cast(GetRegistry(CameraDefaultStartingPositionX, 0.0)); + float yPosition = aznumeric_cast(GetRegistry(CameraDefaultStartingPositionY, -10.0)); + float zPosition = aznumeric_cast(GetRegistry(CameraDefaultStartingPositionZ, 4.0)); + return AZ::Vector3(xPosition, yPosition, zPosition); + } + bool GridSnappingEnabled() { return GetRegistry(GridSnappingSetting, false); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index c1394f7404..5410ed0765 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -12,6 +12,7 @@ #include #include +#include #include namespace SandboxEditor @@ -32,6 +33,8 @@ namespace SandboxEditor //! event will fire when a value in the settings registry (editorpreferences.setreg) is modified. SANDBOX_API AZStd::unique_ptr CreateEditorViewportSettingsCallbacks(); + SANDBOX_API AZ::Vector3 DefaultEditorCameraPosition(); + SANDBOX_API bool GridSnappingEnabled(); SANDBOX_API void SetGridSnapping(bool enabled); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index e546386462..ea1cd4e9cb 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -166,9 +166,6 @@ EditorViewportWidget::EditorViewportWidget(const QString& name, QWidget* parent) m_defaultViewTM.SetIdentity(); - //Set the camera position to a more sensible default. - m_defaultViewTM.SetTranslation(Vec3(0.f, -10.f, 4.f)); - if (GetIEditor()->GetViewManager()->GetSelectedViewport() == nullptr) { GetIEditor()->GetViewManager()->SelectViewport(this); @@ -626,16 +623,10 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) PopDisableRendering(); { - AZ::Aabb terrainAabb = AZ::Aabb::CreateFromPoint(AZ::Vector3::CreateZero()); - AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult(terrainAabb, &AzFramework::Terrain::TerrainDataRequests::GetTerrainAabb); - float sx = terrainAabb.GetXExtent(); - float sy = terrainAabb.GetYExtent(); - Matrix34 viewTM; viewTM.SetIdentity(); - // Initial camera will be at middle of the map at the height of 2 - // meters above the terrain (default terrain height is 32) - viewTM.SetTranslation(Vec3(sx * 0.5f, sy * 0.5f, 34.0f)); + + viewTM.SetTranslation(Vec3(m_editorViewportSettings.DefaultEditorCameraPosition())); SetViewTM(viewTM); UpdateScene(); @@ -650,16 +641,10 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) PopDisableRendering(); { - AZ::Aabb terrainAabb = AZ::Aabb::CreateFromPoint(AZ::Vector3::CreateZero()); - AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult(terrainAabb, &AzFramework::Terrain::TerrainDataRequests::GetTerrainAabb); - float sx = terrainAabb.GetXExtent(); - float sy = terrainAabb.GetYExtent(); - Matrix34 viewTM; viewTM.SetIdentity(); - // Initial camera will be at middle of the map at the height of 2 - // meters above the terrain (default terrain height is 32) - viewTM.SetTranslation(Vec3(sx * 0.5f, sy * 0.5f, 34.0f)); + + viewTM.SetTranslation(Vec3(m_editorViewportSettings.DefaultEditorCameraPosition())); SetViewTM(viewTM); } break; @@ -2035,6 +2020,9 @@ void EditorViewportWidget::SetDefaultCamera() m_viewSourceType = ViewSourceType::None; GetViewManager()->SetCameraObjectId(GUID_NULL); SetName(m_defaultViewName); + + // Set the default Editor Camera position. + m_defaultViewTM.SetTranslation(Vec3(m_editorViewportSettings.DefaultEditorCameraPosition())); SetViewTM(m_defaultViewTM); // Synchronize the configured editor viewport FOV to the default camera @@ -2537,6 +2525,11 @@ bool EditorViewportSettings::StickySelectEnabled() const return SandboxEditor::StickySelectEnabled(); } +AZ::Vector3 EditorViewportSettings::DefaultEditorCameraPosition() const +{ + return SandboxEditor::DefaultEditorCameraPosition(); +} + AZ_CVAR_EXTERNED(bool, ed_previewGameInFullscreen_once); bool EditorViewportWidget::ShouldPreviewFullscreen() const diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 49930a2a13..68ea48c7f5 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -78,6 +78,7 @@ struct EditorViewportSettings : public AzToolsFramework::ViewportInteraction::Vi float ManipulatorLineBoundWidth() const override; float ManipulatorCircleBoundWidth() const override; bool StickySelectEnabled() const override; + AZ::Vector3 DefaultEditorCameraPosition() const override; }; // EditorViewportWidget window diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 9d2f7e9b90..9a8e0f1f5f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -198,6 +198,8 @@ namespace AzToolsFramework virtual float ManipulatorCircleBoundWidth() const = 0; //! Returns if sticky select is enabled or not. virtual bool StickySelectEnabled() const = 0; + //! Returns the default viewport camera position. + virtual AZ::Vector3 DefaultEditorCameraPosition() const = 0; protected: ~ViewportSettingsRequests() = default; From 026919c11bf771957600dc6350cd78b8aaa5dc39 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 11:49:05 +0100 Subject: [PATCH 04/15] Set View in viewport fixed Signed-off-by: igarri --- Code/Editor/EditorViewportWidget.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index ea1cd4e9cb..c7814cc842 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -112,7 +112,6 @@ void StartFixedCursorMode(QObject *viewport); #define RENDER_MESH_TEST_DISTANCE (0.2f) #define CURSOR_FONT_HEIGHT 8.0f - namespace AZ::ViewportHelpers { static const char TextCantCreateCameraNoLevel[] = "Cannot create camera when no level is loaded."; @@ -1333,10 +1332,6 @@ void EditorViewportWidget::keyPressEvent(QKeyEvent* event) void EditorViewportWidget::SetViewTM(const Matrix34& tm) { - if (m_viewSourceType == ViewSourceType::None) - { - m_defaultViewTM = tm; - } SetViewTM(tm, false); } @@ -2641,5 +2636,4 @@ void EditorViewportWidget::StopFullscreenPreview() // Show the main window MainWindow::instance()->show(); } - #include From c93bd87127576df1f6cff37ba9fd26cebaab0764 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 12:16:54 +0100 Subject: [PATCH 05/15] Added default camera position to viewport settings Signed-off-by: igarri --- .../EditorPreferencesPageViewportCamera.cpp | 27 +++++++++++++++++-- .../EditorPreferencesPageViewportCamera.h | 3 +++ Code/Editor/EditorViewportSettings.cpp | 7 +++++ Code/Editor/EditorViewportSettings.h | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.cpp b/Code/Editor/EditorPreferencesPageViewportCamera.cpp index 16176bc241..e1175ca27a 100644 --- a/Code/Editor/EditorPreferencesPageViewportCamera.cpp +++ b/Code/Editor/EditorPreferencesPageViewportCamera.cpp @@ -75,7 +75,10 @@ void CEditorPreferencesPage_ViewportCamera::Reflect(AZ::SerializeContext& serial ->Field("CaptureCursorLook", &CameraMovementSettings::m_captureCursorLook) ->Field("OrbitYawRotationInverted", &CameraMovementSettings::m_orbitYawRotationInverted) ->Field("PanInvertedX", &CameraMovementSettings::m_panInvertedX) - ->Field("PanInvertedY", &CameraMovementSettings::m_panInvertedY); + ->Field("PanInvertedY", &CameraMovementSettings::m_panInvertedY) + ->Field("DefaultPositionX", &CameraMovementSettings::m_defaultCameraPositionX) + ->Field("DefaultPositionY", &CameraMovementSettings::m_defaultCameraPositionY) + ->Field("DefaultPositionZ", &CameraMovementSettings::m_defaultCameraPositionZ); serialize.Class() ->Version(2) @@ -154,7 +157,16 @@ void CEditorPreferencesPage_ViewportCamera::Reflect(AZ::SerializeContext& serial "Invert direction of pan in local Y axis") ->DataElement( AZ::Edit::UIHandlers::CheckBox, &CameraMovementSettings::m_captureCursorLook, "Camera Capture Look Cursor", - "Should the cursor be captured (hidden) while performing free look"); + "Should the cursor be captured (hidden) while performing free look") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionX, "Default Camera X Position", + "Default Camera X Position when a level is opened") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionY, "Default Camera Y Position", + "Default Camera Y Position when a level is opened") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionZ, "Default Camera Z Position", + "Default Camera Z Position when a level is opened"); editContext->Class("Camera Input Settings", "") ->DataElement( @@ -271,6 +283,12 @@ void CEditorPreferencesPage_ViewportCamera::OnApply() SandboxEditor::SetCameraOrbitYawRotationInverted(m_cameraMovementSettings.m_orbitYawRotationInverted); SandboxEditor::SetCameraPanInvertedX(m_cameraMovementSettings.m_panInvertedX); SandboxEditor::SetCameraPanInvertedY(m_cameraMovementSettings.m_panInvertedY); + SandboxEditor::SetDefaultCameraEditorPosition( + AZ::Vector3( + m_cameraMovementSettings.m_defaultCameraPositionX, + m_cameraMovementSettings.m_defaultCameraPositionY, + m_cameraMovementSettings.m_defaultCameraPositionZ + )); SandboxEditor::SetCameraTranslateForwardChannelId(m_cameraInputSettings.m_translateForwardChannelId); SandboxEditor::SetCameraTranslateBackwardChannelId(m_cameraInputSettings.m_translateBackwardChannelId); @@ -308,6 +326,11 @@ void CEditorPreferencesPage_ViewportCamera::InitializeSettings() m_cameraMovementSettings.m_panInvertedX = SandboxEditor::CameraPanInvertedX(); m_cameraMovementSettings.m_panInvertedY = SandboxEditor::CameraPanInvertedY(); + AZ::Vector3 defaultCameraPosition = SandboxEditor::DefaultEditorCameraPosition(); + m_cameraMovementSettings.m_defaultCameraPositionX = defaultCameraPosition.GetX(); + m_cameraMovementSettings.m_defaultCameraPositionY = defaultCameraPosition.GetY(); + m_cameraMovementSettings.m_defaultCameraPositionZ = defaultCameraPosition.GetZ(); + m_cameraInputSettings.m_translateForwardChannelId = SandboxEditor::CameraTranslateForwardChannelId().GetName(); m_cameraInputSettings.m_translateBackwardChannelId = SandboxEditor::CameraTranslateBackwardChannelId().GetName(); m_cameraInputSettings.m_translateLeftChannelId = SandboxEditor::CameraTranslateLeftChannelId().GetName(); diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.h b/Code/Editor/EditorPreferencesPageViewportCamera.h index fdc86b0f89..a2705bfd24 100644 --- a/Code/Editor/EditorPreferencesPageViewportCamera.h +++ b/Code/Editor/EditorPreferencesPageViewportCamera.h @@ -57,6 +57,9 @@ private: bool m_orbitYawRotationInverted; bool m_panInvertedX; bool m_panInvertedY; + float m_defaultCameraPositionX; + float m_defaultCameraPositionY; + float m_defaultCameraPositionZ; AZ::Crc32 RotateSmoothingVisibility() const { diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index 0fb061d102..d513080bdd 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -121,6 +121,13 @@ namespace SandboxEditor return AZ::Vector3(xPosition, yPosition, zPosition); } + void SetDefaultCameraEditorPosition(const AZ::Vector3 defaultCameraPosition) + { + SetRegistry(CameraDefaultStartingPositionX, defaultCameraPosition.GetX()); + SetRegistry(CameraDefaultStartingPositionY, defaultCameraPosition.GetY()); + SetRegistry(CameraDefaultStartingPositionZ, defaultCameraPosition.GetZ()); + } + bool GridSnappingEnabled() { return GetRegistry(GridSnappingSetting, false); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index 5410ed0765..e72165b01c 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -34,6 +34,7 @@ namespace SandboxEditor SANDBOX_API AZStd::unique_ptr CreateEditorViewportSettingsCallbacks(); SANDBOX_API AZ::Vector3 DefaultEditorCameraPosition(); + SANDBOX_API void SetDefaultCameraEditorPosition(AZ::Vector3 defaultCameraPosition); SANDBOX_API bool GridSnappingEnabled(); SANDBOX_API void SetGridSnapping(bool enabled); From d8a453f826c98eefcc422396cf2091647de1c804 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 12:20:04 +0100 Subject: [PATCH 06/15] changed names Signed-off-by: igarri --- Code/Editor/EditorPreferencesPageViewportCamera.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.cpp b/Code/Editor/EditorPreferencesPageViewportCamera.cpp index e1175ca27a..2f6e6b1b9d 100644 --- a/Code/Editor/EditorPreferencesPageViewportCamera.cpp +++ b/Code/Editor/EditorPreferencesPageViewportCamera.cpp @@ -159,14 +159,14 @@ void CEditorPreferencesPage_ViewportCamera::Reflect(AZ::SerializeContext& serial AZ::Edit::UIHandlers::CheckBox, &CameraMovementSettings::m_captureCursorLook, "Camera Capture Look Cursor", "Should the cursor be captured (hidden) while performing free look") ->DataElement( - AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionX, "Default Camera X Position", - "Default Camera X Position when a level is opened") + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionX, "Default X Camera Position", + "Default X Camera Position when a level is opened") ->DataElement( - AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionY, "Default Camera Y Position", - "Default Camera Y Position when a level is opened") + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionY, "Default Y Camera Position", + "Default Y Camera Position when a level is opened") ->DataElement( - AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionZ, "Default Camera Z Position", - "Default Camera Z Position when a level is opened"); + AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_defaultCameraPositionZ, "Default Z Camera Position", + "Default Z Camera Position when a level is opened"); editContext->Class("Camera Input Settings", "") ->DataElement( From f6945f13346fa4826b35778bda6aad0a97649976 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 16:25:25 +0100 Subject: [PATCH 07/15] Fixed Viewport Interaction Signed-off-by: igarri --- .../AzManipulatorTestFramework/AzManipulatorTestFramework.h | 2 ++ .../Include/AzManipulatorTestFramework/ViewportInteraction.h | 1 + .../Source/ViewportInteraction.cpp | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index a911534dd9..10036b0899 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h @@ -46,6 +46,8 @@ namespace AzManipulatorTestFramework virtual void UpdateVisibility() = 0; //! Set if sticky select is enabled or not. virtual void SetStickySelect(bool enabled) = 0; + //! Get default Editor Camera Position. + virtual AZ::Vector3 DefaultEditorCameraPosition() = 0; }; //! This interface is used to simulate the manipulator manager while the manipulators are under test. diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index cfecc0c91a..0ba408224e 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -36,6 +36,7 @@ namespace AzManipulatorTestFramework int GetViewportId() const override; void UpdateVisibility() override; void SetStickySelect(bool enabled) override; + AZ::Vector3 DefaultEditorCameraPosition() override; // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 509674e5c0..7c3836d447 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -120,6 +120,11 @@ namespace AzManipulatorTestFramework m_stickySelect = enabled; } + AZ::Vector3 ViewportInteraction::DefaultEditorCameraPosition() + { + return {}; + } + void ViewportInteraction::SetGridSize(float size) { m_gridSize = size; From a3c3de4a76a9105945e72e35a61cdaaf021a56b8 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 16:33:47 +0100 Subject: [PATCH 08/15] AR fixes Signed-off-by: igarri --- .../Include/AzManipulatorTestFramework/ViewportInteraction.h | 2 +- .../AzManipulatorTestFramework/Source/ViewportInteraction.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index 0ba408224e..a8ba63500c 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -36,7 +36,7 @@ namespace AzManipulatorTestFramework int GetViewportId() const override; void UpdateVisibility() override; void SetStickySelect(bool enabled) override; - AZ::Vector3 DefaultEditorCameraPosition() override; + AZ::Vector3 DefaultEditorCameraPosition() const override; // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 7c3836d447..269baa703d 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -120,7 +120,7 @@ namespace AzManipulatorTestFramework m_stickySelect = enabled; } - AZ::Vector3 ViewportInteraction::DefaultEditorCameraPosition() + AZ::Vector3 ViewportInteraction::DefaultEditorCameraPosition() const { return {}; } From d8b47a1448b7b55ae0f20c237725d9c5e369b8e5 Mon Sep 17 00:00:00 2001 From: igarri Date: Mon, 18 Oct 2021 16:45:26 +0100 Subject: [PATCH 09/15] More fixes Signed-off-by: igarri --- .../AzManipulatorTestFramework/AzManipulatorTestFramework.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index 10036b0899..5f0179d6ad 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h @@ -47,7 +47,7 @@ namespace AzManipulatorTestFramework //! Set if sticky select is enabled or not. virtual void SetStickySelect(bool enabled) = 0; //! Get default Editor Camera Position. - virtual AZ::Vector3 DefaultEditorCameraPosition() = 0; + virtual AZ::Vector3 DefaultEditorCameraPosition() const = 0; }; //! This interface is used to simulate the manipulator manager while the manipulators are under test. From bc479a362f475ab7b4bb7930b46d09ea1d244d00 Mon Sep 17 00:00:00 2001 From: evanchia Date: Mon, 18 Oct 2021 13:39:21 -0700 Subject: [PATCH 10/15] removing remote console smoke test Signed-off-by: evanchia --- .../test_RemoteConsole_CPULoadLevel_Works.py | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py deleted file mode 100644 index 6522514f2f..0000000000 --- a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py +++ /dev/null @@ -1,44 +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 - - -UI Apps: AutomatedTesting.GameLauncher -Launch AutomatedTesting.GameLauncher with Simple level -Test should run in both gpu and non gpu -""" - -import pytest -import psutil - -import ly_test_tools.environment.waiter as waiter -import editor_python_test_tools.hydra_test_utils as editor_test_utils -from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole -from ly_remote_console.remote_console_commands import ( - send_command_and_expect_response as send_command_and_expect_response, -) - - -@pytest.mark.parametrize("launcher_platform", ["windows"]) -@pytest.mark.parametrize("project", ["AutomatedTesting"]) -@pytest.mark.parametrize("level", ["Simple"]) -@pytest.mark.SUITE_smoke -class TestRemoteConsoleLoadLevelWorks(object): - @pytest.fixture - def remote_console_instance(self, request): - console = RemoteConsole() - - def teardown(): - if console.connected: - console.stop() - - request.addfinalizer(teardown) - - return console - - def test_RemoteConsole_LoadLevel_Works(self, launcher, level, remote_console_instance, launcher_platform): - expected_lines = ['Level system is loading "Simple"'] - - editor_test_utils.launch_and_validate_results_launcher(launcher, level, remote_console_instance, expected_lines, null_renderer=True) From 3deaed5733dad0b531902febf495af2b4d580eae Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 18 Oct 2021 15:56:59 -0700 Subject: [PATCH 11/15] Enable cmake-install in project-centric / engine-prebuilt (#4767) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Install.cmake | 5 +---- cmake/LYWrappers.cmake | 17 ++++++++++------- cmake/Platform/Common/Install_common.cmake | 1 - 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index adcd28fa37..3b74e6c654 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -6,10 +6,7 @@ # # -ly_set(LY_INSTALL_ENABLED TRUE) -if(INSTALLED_ENGINE) - ly_set(LY_INSTALL_ENABLED FALSE) -endif() +set(LY_INSTALL_ENABLED TRUE CACHE BOOL "Indicates if the install process is enabled") if(LY_INSTALL_ENABLED) ly_get_absolute_pal_filename(pal_dir ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Platform/${PAL_PLATFORM_NAME}) diff --git a/cmake/LYWrappers.cmake b/cmake/LYWrappers.cmake index d388b03b75..fb3d420c26 100644 --- a/cmake/LYWrappers.cmake +++ b/cmake/LYWrappers.cmake @@ -315,13 +315,16 @@ function(ly_add_target) # Store the target so we can walk through all of them in LocationDependencies.cmake set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGETS ${interface_name}) - # Store the aliased target into a DIRECTORY property - set_property(DIRECTORY APPEND PROPERTY LY_DIRECTORY_TARGETS ${interface_name}) - # Store the directory path in a GLOBAL property so that it can be accessed - # in the layout install logic. Skip if the directory has already been added - get_property(ly_all_target_directories GLOBAL PROPERTY LY_ALL_TARGET_DIRECTORIES) - if(NOT CMAKE_CURRENT_SOURCE_DIR IN_LIST ly_all_target_directories) - set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGET_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}) + if(NOT ly_add_target_IMPORTED) + # Store the aliased target into a DIRECTORY property + set_property(DIRECTORY APPEND PROPERTY LY_DIRECTORY_TARGETS ${interface_name}) + + # Store the directory path in a GLOBAL property so that it can be accessed + # in the layout install logic. Skip if the directory has already been added + get_property(ly_all_target_directories GLOBAL PROPERTY LY_ALL_TARGET_DIRECTORIES) + if(NOT CMAKE_CURRENT_SOURCE_DIR IN_LIST ly_all_target_directories) + set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGET_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}) + endif() endif() # Custom commands need to be declared in the same folder as the target that they use. diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 8fb2effe29..c453fadd2e 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -385,7 +385,6 @@ function(ly_setup_cmake_install) COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} PATTERN "__pycache__" EXCLUDE PATTERN "Findo3de.cmake" EXCLUDE - PATTERN "ConfigurationTypes.cmake" EXCLUDE REGEX "3rdParty/Platform\/.*\/BuiltInPackages_.*\.cmake" EXCLUDE ) # Connect configuration types From 3485bc08b15ee7b9e6216290266f0da18fb154c4 Mon Sep 17 00:00:00 2001 From: Nicholas Van Sickle Date: Mon, 18 Oct 2021 17:14:19 -0700 Subject: [PATCH 12/15] Fix EntityOutlinerTest (#4771) The test was relying on immediate updates from the prefab system which are now scheduled for a later tick - this reworks the tests to wait for deferred updates before validating state Signed-off-by: nvsickle --- .../Tests/UI/EntityOutlinerTests.cpp | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/Code/Framework/AzToolsFramework/Tests/UI/EntityOutlinerTests.cpp b/Code/Framework/AzToolsFramework/Tests/UI/EntityOutlinerTests.cpp index 614959d7e0..fa8de64c62 100644 --- a/Code/Framework/AzToolsFramework/Tests/UI/EntityOutlinerTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/UI/EntityOutlinerTests.cpp @@ -90,8 +90,7 @@ namespace UnitTest // Update our undo cache entry to include the rename / reparent as one atomic operation. m_prefabPublicInterface->GenerateUndoNodesForEntityChangeAndUpdateCache(entityId, m_undoStack->GetTop()); - // Force a prefab propagation as updates are deferred to the next tick. - m_prefabSystemComponent->OnSystemTick(); + ProcessDeferredUpdates(); return entityId; } @@ -125,6 +124,30 @@ namespace UnitTest return m_model->index(0, 0); } + // Kicks off any updates scheduled for the next tick + void ProcessDeferredUpdates() + { + // Force a prefab propagation for updates that are deferred to the next tick. + m_prefabSystemComponent->OnSystemTick(); + + // Ensure the model process its entity update queue + m_model->ProcessEntityUpdates(); + } + + // Performs an undo operation and ensures the tick-scheduled updates happen + void Undo() + { + m_undoStack->Undo(); + ProcessDeferredUpdates(); + } + + // Performs a redo operation and ensures the tick-scheduled updates happen + void Redo() + { + m_undoStack->Redo(); + ProcessDeferredUpdates(); + } + AZStd::unique_ptr m_model; AZStd::unique_ptr m_modelTester; AzToolsFramework::UndoSystem::UndoStack* m_undoStack = nullptr; @@ -139,21 +162,18 @@ namespace UnitTest CreateNamedEntity(AZStd::string::format("Entity%zu", i)); EXPECT_EQ(m_model->rowCount(GetRootIndex()), i + 1); } - m_model->ProcessEntityUpdates(); for (int i = entityCount; i > 0; --i) { - m_undoStack->Undo(); + Undo(); EXPECT_EQ(m_model->rowCount(GetRootIndex()), i - 1); } - m_model->ProcessEntityUpdates(); for (size_t i = 0; i < entityCount; ++i) { - m_undoStack->Redo(); + Redo(); EXPECT_EQ(m_model->rowCount(GetRootIndex()), i + 1); } - m_model->ProcessEntityUpdates(); } TEST_F(EntityOutlinerTest, TestCreateNestedHierarchyUndoAndRedoWorks) @@ -177,21 +197,18 @@ namespace UnitTest { parentId = CreateNamedEntity(AZStd::string::format("EntityDepth%i", i), parentId); EXPECT_EQ(modelDepth(), i + 1); - m_model->ProcessEntityUpdates(); } for (int i = depth - 1; i >= 0; --i) { - m_undoStack->Undo(); + Undo(); EXPECT_EQ(modelDepth(), i); - m_model->ProcessEntityUpdates(); } for (int i = 0; i < depth; ++i) { - m_undoStack->Redo(); + Redo(); EXPECT_EQ(modelDepth(), i + 1); - m_model->ProcessEntityUpdates(); } } } // namespace UnitTest From ae6005545eb76698e67b386f5d0584082ac49c25 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 19 Oct 2021 13:23:23 +0100 Subject: [PATCH 13/15] Fix for PyTest editor test case names. Signed-off-by: John --- .../Code/Source/PythonCoverageEditorSystemComponent.cpp | 5 ++--- .../editor_python_test_tools/hydra_test_utils.py | 2 +- .../Gem/PythonTests/automatedtesting_shared/base.py | 2 +- Code/Editor/CryEdit.cpp | 7 ++++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp b/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp index 1528e09169..ae19cab79e 100644 --- a/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp +++ b/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp @@ -204,7 +204,7 @@ namespace PythonCoverage return coveringModuleOutputNames; } - void PythonCoverageEditorSystemComponent::OnStartExecuteByFilenameAsTest(AZStd::string_view filename, AZStd::string_view testCase, [[maybe_unused]] const AZStd::vector& args) + void PythonCoverageEditorSystemComponent::OnStartExecuteByFilenameAsTest([[maybe_unused]]AZStd::string_view filename, AZStd::string_view testCase, [[maybe_unused]] const AZStd::vector& args) { if (m_coverageState == CoverageState::Disabled) { @@ -226,8 +226,7 @@ namespace PythonCoverage return; } - const AZStd::string scriptName = AZ::IO::Path(filename).Stem().Native(); - const auto coverageFile = m_coverageDir / AZStd::string::format("%s.pycoverage", scriptName.c_str()); + const auto coverageFile = m_coverageDir / AZStd::string::format("%.*s.pycoverage", AZ_STRING_ARG(testCase)); // If this is a different python script we clear the existing entity components and start afresh if (m_coverageFile != coverageFile) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py index 54bc118f48..510d1b1149 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py @@ -51,7 +51,7 @@ def launch_and_validate_results(request, test_directory, editor, editor_script, logger.debug("Running automated test: {}".format(editor_script)) editor.args.extend(["--skipWelcomeScreenDialog", "--regset=/Amazon/Settings/EnableSourceControl=false", "--regset=/Amazon/Preferences/EnablePrefabSystem=false", run_python, test_case, - f"--pythontestcase={request.node.originalname}", "--runpythonargs", " ".join(cfg_args)]) + f"--pythontestcase={request.node.name}", "--runpythonargs", " ".join(cfg_args)]) if auto_test_mode: editor.args.extend(["--autotest_mode"]) if null_renderer: diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py index f5cd66cbbe..cbb6102a44 100755 --- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py +++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py @@ -90,7 +90,7 @@ class TestAutomationBase: editor_starttime = time.time() self.logger.debug("Running automated test") testcase_module_filepath = self._get_testcase_module_filepath(testcase_module) - pycmd = ["--runpythontest", testcase_module_filepath, f"-pythontestcase={request.node.originalname}"] + pycmd = ["--runpythontest", testcase_module_filepath, f"-pythontestcase={request.node.name}"] if use_null_renderer: pycmd += ["-rhi=null"] if batch_mode: diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 4f2e995ac4..027198ac80 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -513,7 +513,7 @@ public: QString m_appRoot; QString m_logFile; QString m_pythonArgs; - QString m_pythontTestCase; + QString m_pythonTestCase; QString m_execFile; QString m_execLineCmd; @@ -562,7 +562,7 @@ public: const std::vector > stringOptions = { {{"logfile", "File name of the log file to write out to.", "logfile"}, m_logFile}, {{"runpythonargs", "Command-line argument string to pass to the python script if --runpython or --runpythontest was used.", "runpythonargs"}, m_pythonArgs}, - {{"pythontestcase", "Test case name of python test script if --runpythontest was used.", "pythontestcase"}, m_pythontTestCase}, + {{"pythontestcase", "Test case name of python test script if --runpythontest was used.", "pythontestcase"}, m_pythonTestCase}, {{"exec", "cfg file to run on startup, used for systems like automation", "exec"}, m_execFile}, {{"rhi", "Command-line argument to force which rhi to use", "dummyString"}, dummyString }, {{"rhi-device-validation", "Command-line argument to configure rhi validation", "dummyString"}, dummyString }, @@ -1535,11 +1535,12 @@ void CCryEditApp::RunInitPythonScript(CEditCommandLineInfo& cmdInfo) { // Multiple testcases can be specified them with ';', these should match the files to run AZStd::vector testcaseList; + QByteArray pythonTestCase = cmdInfo.m_pythonTestCase.toUtf8(); testcaseList.resize(fileList.size()); { int i = 0; AzFramework::StringFunc::TokenizeVisitor( - fileStr.constData(), + pythonTestCase.constData(), [&i, &testcaseList](AZStd::string_view elem) { testcaseList[i++] = (elem); From 82b731b673c42864343672ee28a621d4b12cabaf Mon Sep 17 00:00:00 2001 From: amzn-sean <75276488+amzn-sean@users.noreply.github.com> Date: Tue, 19 Oct 2021 13:59:00 +0100 Subject: [PATCH 14/15] Increase the timeout for ForceRegion_LinearDampingForceOnRigidBodies. (#4784) The Test runs with a wait_for_condition, and the original timeout was right on the edge of how long the test takes to reach that condition. Signed-off-by: amzn-sean <75276488+amzn-sean@users.noreply.github.com> --- .../force_region/ForceRegion_LinearDampingForceOnRigidBodies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py index 4e3cc4e43d..f5aae42340 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py @@ -126,7 +126,7 @@ def ForceRegion_LinearDampingForceOnRigidBodies(): # Constants CLOSE_ENOUGH = 0.001 - TIME_OUT = 3.0 + TIME_OUT = 10.0 INITIAL_VELOCITY = azmath.Vector3(0.0, 0.0, -10.0) # 1) Open level / Enter game mode From c1335f69c63816327a3b2ae86bc37acf9ec3691f Mon Sep 17 00:00:00 2001 From: amzn-mike <80125227+amzn-mike@users.noreply.github.com> Date: Tue, 19 Oct 2021 10:42:18 -0500 Subject: [PATCH 15/15] Convert resolved wildcard paths to relative path before saving in database (#4574) * Convert resolved wildcard paths to relative path before saving in database. Warn if file could not be converted to a relative path. Fix FindWildcardMatches path handling that could result in pathMatch missing the first character Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Handle abs path wildcard dependencies Remove dependencies outside of scan folder Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Switch to AZ::IO::PathView for abs path check Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Made code a little more clear Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> --- .../AssetManager/assetProcessorManager.cpp | 58 ++++++++++++++++--- .../utilities/PlatformConfiguration.cpp | 23 ++++---- 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp index 4cd4489a4c..fc806f6c9e 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp @@ -3573,19 +3573,61 @@ namespace AssetProcessor QString knownPathBeforeWildcard = encodedFileData.left(slashBeforeWildcardIndex + 1); // include the slash QString relativeSearch = encodedFileData.mid(slashBeforeWildcardIndex + 1); // skip the slash - for (int i = 0; i < m_platformConfig->GetScanFolderCount(); ++i) + // Absolute path, just check the 1 scan folder + if (AZ::IO::PathView(encodedFileData.toUtf8().constData()).IsAbsolute()) { - const ScanFolderInfo* scanFolderInfo = &m_platformConfig->GetScanFolderAt(i); - - if (!scanFolderInfo->RecurseSubFolders() && encodedFileData.contains("/")) + QString scanFolderName; + if (!m_platformConfig->ConvertToRelativePath(encodedFileData, resultDatabaseSourceName, scanFolderName)) { - continue; + AZ_Warning( + AssetProcessor::ConsoleChannel, false, + "'%s' does not appear to be in any input folder. Use relative paths instead.", + sourceDependency.m_sourceFileDependencyPath.c_str()); } - QDir rooted(scanFolderInfo->ScanPath()); - QString absolutePath = rooted.absoluteFilePath(knownPathBeforeWildcard); + auto scanFolderInfo = m_platformConfig->GetScanFolderByPath(scanFolderName); - resolvedDependencyList.append(m_platformConfig->FindWildcardMatches(absolutePath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + // Make an absolute path that is ScanFolderPath + Part of search path before the wildcard + QDir rooted(scanFolderName); + QString scanFolderAndKnownSubPath = rooted.absoluteFilePath(knownPathBeforeWildcard); + + resolvedDependencyList.append(m_platformConfig->FindWildcardMatches( + scanFolderAndKnownSubPath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + } + else // Relative path, check every scan folder + { + for (int i = 0; i < m_platformConfig->GetScanFolderCount(); ++i) + { + const ScanFolderInfo* scanFolderInfo = &m_platformConfig->GetScanFolderAt(i); + + if (!scanFolderInfo->RecurseSubFolders() && encodedFileData.contains("/")) + { + continue; + } + + QDir rooted(scanFolderInfo->ScanPath()); + QString absolutePath = rooted.absoluteFilePath(knownPathBeforeWildcard); + + resolvedDependencyList.append(m_platformConfig->FindWildcardMatches( + absolutePath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + } + } + + // Convert to relative paths + for (auto dependencyItr = resolvedDependencyList.begin(); dependencyItr != resolvedDependencyList.end();) + { + QString relativePath, scanFolder; + if (m_platformConfig->ConvertToRelativePath(*dependencyItr, relativePath, scanFolder)) + { + *dependencyItr = relativePath; + ++dependencyItr; + } + else + { + AZ_Warning("AssetProcessor", false, "Failed to get relative path for wildcard dependency file %s. Is the file within a scan folder?", + dependencyItr->toUtf8().constData()); + dependencyItr = resolvedDependencyList.erase(dependencyItr); + } } resultDatabaseSourceName = encodedFileData.replace('\\', '/'); diff --git a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp index 4a033cf6ca..9a60bf3110 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp @@ -1435,32 +1435,35 @@ namespace AssetProcessor return QString(); } - QStringList PlatformConfiguration::FindWildcardMatches(const QString& sourceFolder, QString relativeName, bool includeFolders, bool recursiveSearch) const + QStringList PlatformConfiguration::FindWildcardMatches( + const QString& sourceFolder, QString relativeName, bool includeFolders, bool recursiveSearch) const { if (relativeName.isEmpty()) { return QStringList(); } - const int pathLen = sourceFolder.length() + 1; + QDir sourceFolderDir(sourceFolder); - relativeName.replace('\\', '/'); + QString posixRelativeName = QDir::fromNativeSeparators(relativeName); QStringList returnList; - QRegExp nameMatch{ relativeName, Qt::CaseInsensitive, QRegExp::Wildcard }; - QDirIterator diretoryIterator(sourceFolder, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, recursiveSearch ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags); + QRegExp nameMatch{ posixRelativeName, Qt::CaseInsensitive, QRegExp::Wildcard }; + QDirIterator dirIterator( + sourceFolderDir.path(), QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, + recursiveSearch ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags); QStringList files; - while (diretoryIterator.hasNext()) + while (dirIterator.hasNext()) { - diretoryIterator.next(); - if (!includeFolders && !diretoryIterator.fileInfo().isFile()) + dirIterator.next(); + if (!includeFolders && !dirIterator.fileInfo().isFile()) { continue; } - QString pathMatch{ diretoryIterator.filePath().mid(pathLen) }; + QString pathMatch{ sourceFolderDir.relativeFilePath(dirIterator.filePath()) }; if (nameMatch.exactMatch(pathMatch)) { - returnList.append(AssetUtilities::NormalizeFilePath(diretoryIterator.filePath())); + returnList.append(QDir::fromNativeSeparators(dirIterator.filePath())); } } return returnList;