diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.cpp b/Code/Editor/EditorPreferencesPageViewportCamera.cpp index 16176bc241..2f6e6b1b9d 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 X Camera Position", + "Default X Camera Position when a level is opened") + ->DataElement( + 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 Z Camera Position", + "Default Z Camera 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 2b54622d1c..8f2be1de6c 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -52,6 +52,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) @@ -111,6 +114,21 @@ 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); + } + + void SetDefaultCameraEditorPosition(const AZ::Vector3 defaultCameraPosition) + { + SetRegistry(CameraDefaultStartingPositionX, defaultCameraPosition.GetX()); + SetRegistry(CameraDefaultStartingPositionY, defaultCameraPosition.GetY()); + SetRegistry(CameraDefaultStartingPositionZ, defaultCameraPosition.GetZ()); + } + AZ::u64 MaxItemsShownInAssetBrowserSearch() { return GetRegistry(AssetBrowserMaxItemsShownInSearchSetting, aznumeric_cast(50)); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index c6f51cf461..9c3f0a46e5 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -12,6 +12,7 @@ #include #include +#include #include namespace SandboxEditor @@ -32,6 +33,9 @@ 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 void SetDefaultCameraEditorPosition(AZ::Vector3 defaultCameraPosition); + SANDBOX_API AZ::u64 MaxItemsShownInAssetBrowserSearch(); SANDBOX_API void SetMaxItemsShownInAssetBrowserSearch(AZ::u64 numberOfItemsShown); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index dad6734428..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."; @@ -623,16 +622,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(); @@ -647,16 +640,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; @@ -1345,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); } @@ -1445,6 +1428,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) { @@ -2028,6 +2015,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 @@ -2530,6 +2520,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 @@ -2641,5 +2636,4 @@ void EditorViewportWidget::StopFullscreenPreview() // Show the main window MainWindow::instance()->show(); } - #include 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/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index a911534dd9..5f0179d6ad 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() const = 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..a8ba63500c 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() 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 509674e5c0..269baa703d 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() const + { + return {}; + } + void ViewportInteraction::SetGridSize(float size) { m_gridSize = size; 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;